mirror of
https://gitlab.freedesktop.org/dbus/dbus.git
synced 2025-12-22 10:10:08 +01:00
Fix a bunch of lifecycle and memory management problems in the mono bindings. * mono/Arguments.cs (Arguments): Implement IDisposable * mono/Bus.cs (Bus): Don't allow public instantiation. This is strictly a static class. * mono/Connection.cs: Move the DBusObjectPathVTable and associated delegates into this file. (Connection): Implement IDisposable. (Dispose): Disconnect the connection and set the raw connection pointer to IntPtr.Zero. (~Connection): Call Dispose(). (RegisterObjectPath): Added. Manages the registration of object paths so we can cleanly disconnect them at dispose/finalize time. (UnregisterObjectPath): Ditto. (set_RawConnection): Unregister all of the object paths when changing the underlying DBusConnection. Add them back onto the new connection, if any. * mono/Handler.cs: Don't implement IDisposable; it doesn't use any more unmanaged resources anymore, so it's not necessary. Move all the DBusObjectPathVTable stuff out of here. (Handler): Save references to our delegates so that they don't get finalized. Call Connection.RegisterObjectPath() instead of dbus_connection_register_object_path() directly. (Message_Called): Dispose the message after we're finished with it. * mono/Message.cs (Message): Implement IDisposable. (Dispose): Dispose the Arguments, and set the RawMessage to IntPtr.Zero. (SendWithReplyAndBlock): We own the ref to the reply that comes back from dbus_connection_send_with_reply_and_block() so add a comment about that and unref it after we've constructed a managed MethodReturn class around it. Fixes a big, big leak. * mono/ProxyBuilder.cs: Reflect into Message to get the Dispose method. (BuildSignalHandler): After we've sent the Signal message, dispose of it. (BuildMethod): Dispose of the method call and reply messages after we've sent the message and extracted the data we want from the reply. * mono/Service.cs (UnregisterObject): Don't call handler.Dispose() anymore. (Service_FilterCalled): Dispose of the message after we're finished with it.
54 lines
1.1 KiB
C#
54 lines
1.1 KiB
C#
namespace DBus
|
|
{
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
using System.Diagnostics;
|
|
|
|
public class Bus
|
|
{
|
|
// Keep in sync with C
|
|
private enum BusType
|
|
{
|
|
Session = 0,
|
|
System = 1,
|
|
Activation = 2
|
|
}
|
|
|
|
// Don't allow instantiation
|
|
private Bus () { }
|
|
|
|
public static Connection GetSessionBus()
|
|
{
|
|
return GetBus(BusType.Session);
|
|
}
|
|
|
|
public static Connection GetSystemBus()
|
|
{
|
|
return GetBus(BusType.System);
|
|
}
|
|
|
|
private static Connection GetBus(BusType busType)
|
|
{
|
|
Error error = new Error();
|
|
error.Init();
|
|
|
|
IntPtr rawConnection = dbus_bus_get((int) busType, ref error);
|
|
|
|
if (rawConnection != IntPtr.Zero) {
|
|
Connection connection = Connection.Wrap(rawConnection);
|
|
connection.SetupWithMain();
|
|
dbus_connection_unref(rawConnection);
|
|
|
|
return connection;
|
|
} else {
|
|
throw new DBusException(error);
|
|
}
|
|
}
|
|
|
|
[DllImport ("dbus-1")]
|
|
private extern static IntPtr dbus_bus_get (int which, ref Error error);
|
|
|
|
[DllImport ("dbus-1")]
|
|
private extern static void dbus_connection_unref (IntPtr ptr);
|
|
}
|
|
}
|