[libnet-dbus-perl] 226/335: Fix reference counting for connections & pending calls. Change PD_DEBUG -> DEBUG_MSG. Use dbus_connection_close instead of disconnect if compiling against newer libs. Call dbus_connnection_unref in DESTROY method.
Intrigeri
intrigeri at moszumanska.debian.org
Sat Mar 21 01:08:02 UTC 2015
This is an automated email from the git hooks/post-receive script.
intrigeri pushed a commit to branch experimental
in repository libnet-dbus-perl.
commit 8783165ceea75b394f9a4a1f7923f31a43724160
Author: Daniel P. Berrange <berrange at redhat.com>
Date: Sat Nov 4 16:03:11 2006 -0500
Fix reference counting for connections & pending calls.
Change PD_DEBUG -> DEBUG_MSG.
Use dbus_connection_close instead of disconnect if compiling against newer libs.
Call dbus_connnection_unref in DESTROY method.
---
DBus.xs | 166 +++++++++++++++++++++---------------
Makefile.PL | 10 ++-
lib/Net/DBus/Binding/PendingCall.pm | 8 +-
3 files changed, 109 insertions(+), 75 deletions(-)
diff --git a/DBus.xs b/DBus.xs
index a921865..4194ae4 100644
--- a/DBus.xs
+++ b/DBus.xs
@@ -23,10 +23,11 @@
#include <dbus/dbus.h>
-#if PD_DO_DEBUG
-#define PD_DEBUG(...) if (getenv("PD_DEBUG")) fprintf(stderr, __VA_ARGS__)
+#if NET_DBUS_DEBUG
+static int net_dbus_debug = 0;
+#define DEBUG_MSG(...) if (net_dbus_debug) fprintf(stderr, __VA_ARGS__)
#else
-#define PD_DEBUG(...)
+#define DEBUG_MSG(...)
#endif
@@ -39,7 +40,7 @@ dbus_int32_t pending_call_data_slot = -1;
void
_object_release(void *obj) {
- PD_DEBUG("Releasing object count on %p\n", obj);
+ DEBUG_MSG("Releasing object count on %p\n", obj);
SvREFCNT_dec((SV*)obj);
}
@@ -51,7 +52,7 @@ _watch_generic(DBusWatch *watch, void *data, char *key, dbus_bool_t server) {
SV *h_sv;
dSP;
- PD_DEBUG("Watch generic callback %p %p %s %d\n", watch, data, key, server);
+ DEBUG_MSG("Watch generic callback %p %p %s %d\n", watch, data, key, server);
if (server) {
selfref = (SV*)dbus_server_get_data((DBusServer*)data, server_data_slot);
@@ -60,7 +61,7 @@ _watch_generic(DBusWatch *watch, void *data, char *key, dbus_bool_t server) {
}
self = (HV*)SvRV(selfref);
- PD_DEBUG("Got owner %p\n", self);
+ DEBUG_MSG("Got owner %p\n", self);
call = hv_fetch(self, key, strlen(key), 0);
@@ -198,7 +199,7 @@ _connection_callback (DBusServer *server,
return;
}
- PD_DEBUG("Created connection in callback %p\n", new_connection);
+ DEBUG_MSG("Created connection in callback %p\n", new_connection);
/* The DESTROY method will de-ref it later */
dbus_connection_ref(new_connection);
@@ -234,11 +235,11 @@ _message_filter(DBusConnection *con,
selfref = (SV*)dbus_connection_get_data(con, connection_data_slot);
self = (HV*)SvRV(selfref);
- PD_DEBUG("Create message in filter %p\n", msg);
- PD_DEBUG(" Type %d\n", dbus_message_get_type(msg));
- PD_DEBUG(" Interface %s\n", dbus_message_get_interface(msg) ? dbus_message_get_interface(msg) : "");
- PD_DEBUG(" Path %s\n", dbus_message_get_path(msg) ? dbus_message_get_path(msg) : "");
- PD_DEBUG(" Member %s\n", dbus_message_get_member(msg) ? dbus_message_get_member(msg) : "");
+ DEBUG_MSG("Create message in filter %p\n", msg);
+ DEBUG_MSG(" Type %d\n", dbus_message_get_type(msg));
+ DEBUG_MSG(" Interface %s\n", dbus_message_get_interface(msg) ? dbus_message_get_interface(msg) : "");
+ DEBUG_MSG(" Path %s\n", dbus_message_get_path(msg) ? dbus_message_get_path(msg) : "");
+ DEBUG_MSG(" Member %s\n", dbus_message_get_member(msg) ? dbus_message_get_member(msg) : "");
/* Will be de-refed in the DESTROY method */
dbus_message_ref(msg);
value = sv_newmortal();
@@ -261,7 +262,7 @@ _message_filter(DBusConnection *con,
handled = 0;
}
PUTBACK;
- PD_DEBUG("Handled %d %d\n", count, handled);
+ DEBUG_MSG("Handled %d %d\n", count, handled);
FREETMPS;
LEAVE;
@@ -275,6 +276,7 @@ _pending_call_callback(DBusPendingCall *call,
HV *self;
dSP;
+ DEBUG_MSG("In pending call callback %p\n", call);
selfref = (SV*)dbus_pending_call_get_data(call, pending_call_data_slot);
self = (HV*)SvRV(selfref);
@@ -317,11 +319,11 @@ _path_message_callback(DBusConnection *con,
SV *value;
dSP;
- PD_DEBUG("Got message in callback %p\n", msg);
- PD_DEBUG(" Type %d\n", dbus_message_get_type(msg));
- PD_DEBUG(" Interface %s\n", dbus_message_get_interface(msg) ? dbus_message_get_interface(msg) : "");
- PD_DEBUG(" Path %s\n", dbus_message_get_path(msg) ? dbus_message_get_path(msg) : "");
- PD_DEBUG(" Member %s\n", dbus_message_get_member(msg) ? dbus_message_get_member(msg) : "");
+ DEBUG_MSG("Got message in callback %p\n", msg);
+ DEBUG_MSG(" Type %d\n", dbus_message_get_type(msg));
+ DEBUG_MSG(" Interface %s\n", dbus_message_get_interface(msg) ? dbus_message_get_interface(msg) : "");
+ DEBUG_MSG(" Path %s\n", dbus_message_get_path(msg) ? dbus_message_get_path(msg) : "");
+ DEBUG_MSG(" Member %s\n", dbus_message_get_member(msg) ? dbus_message_get_member(msg) : "");
/* Will be de-refed in the DESTROY method */
dbus_message_ref(msg);
value = sv_newmortal();
@@ -402,6 +404,9 @@ BOOT:
{
HV *constants;
+ if (getenv("NET_DBUS_DEBUG"))
+ net_dbus_debug = 1;
+
/* not the 'standard' way of doing perl constants, but a lot easier to maintain */
constants = perl_get_hv("Net::DBus::Binding::Bus::_constants", TRUE);
@@ -459,6 +464,7 @@ _open(address)
CODE:
dbus_error_init(&error);
con = dbus_connection_open(address, &error);
+ dbus_connection_ref(con);
if (!con) {
_croak_error (&error);
}
@@ -479,6 +485,21 @@ _set_owner(con, owner)
void
dbus_connection_disconnect(con)
DBusConnection *con;
+ CODE:
+ DEBUG_MSG("Closing connection %p\n", con);
+#if HAVE_CONN_DISCONNECT
+ dbus_connection_disconnect(con);
+#else
+ dbus_connection_close(con);
+#endif
+
+void
+dbus_connection_ref(con)
+ DBusConnection *con;
+
+void
+dbus_connection_unref(con)
+ DBusConnection *con;
int
dbus_connection_get_is_connected(con)
@@ -519,11 +540,11 @@ _send_with_reply_and_block(con, msg, timeout)
if (!(reply = dbus_connection_send_with_reply_and_block(con, msg, timeout, &error))) {
_croak_error(&error);
}
- PD_DEBUG("Create msg reply %p\n", reply);
- PD_DEBUG(" Type %d\n", dbus_message_get_type(reply));
- PD_DEBUG(" Interface %s\n", dbus_message_get_interface(reply) ? dbus_message_get_interface(reply) : "");
- PD_DEBUG(" Path %s\n", dbus_message_get_path(reply) ? dbus_message_get_path(reply) : "");
- PD_DEBUG(" Member %s\n", dbus_message_get_member(reply) ? dbus_message_get_member(reply) : "");
+ DEBUG_MSG("Create msg reply %p\n", reply);
+ DEBUG_MSG(" Type %d\n", dbus_message_get_type(reply));
+ DEBUG_MSG(" Interface %s\n", dbus_message_get_interface(reply) ? dbus_message_get_interface(reply) : "");
+ DEBUG_MSG(" Path %s\n", dbus_message_get_path(reply) ? dbus_message_get_path(reply) : "");
+ DEBUG_MSG(" Member %s\n", dbus_message_get_member(reply) ? dbus_message_get_member(reply) : "");
RETVAL = reply;
OUTPUT:
RETVAL
@@ -540,7 +561,7 @@ _send_with_reply(con, msg, timeout)
if (!dbus_connection_send_with_reply(con, msg, &reply, timeout)) {
croak("not enough memory to send message");
}
- PD_DEBUG("Create pending call %p\n", reply);
+ DEBUG_MSG("Create pending call %p\n", reply);
RETVAL = reply;
OUTPUT:
RETVAL
@@ -567,9 +588,9 @@ void
_dispatch(con)
DBusConnection *con;
CODE:
- PD_DEBUG("IN dispatch\n");
+ DEBUG_MSG("IN dispatch\n");
while(dbus_connection_dispatch(con) == DBUS_DISPATCH_DATA_REMAINS);
- PD_DEBUG("Completed \n");
+ DEBUG_MSG("Completed \n");
void
_set_watch_callbacks(con)
@@ -635,7 +656,7 @@ _add_filter(con, code)
SV *code;
CODE:
SvREFCNT_inc(code);
- PD_DEBUG("Adding filter %p\n", code);
+ DEBUG_MSG("Adding filter %p\n", code);
dbus_connection_add_filter(con, _message_filter, code, _filter_release);
dbus_bool_t
@@ -659,7 +680,7 @@ dbus_bus_add_match(con, rule)
DBusError error;
CODE:
dbus_error_init(&error);
- PD_DEBUG("Adding match %s\n", rule);
+ DEBUG_MSG("Adding match %s\n", rule);
dbus_bus_add_match(con, rule, &error);
if (dbus_error_is_set(&error)) {
_croak_error(&error);
@@ -673,7 +694,7 @@ dbus_bus_remove_match(con, rule)
DBusError error;
CODE:
dbus_error_init(&error);
- PD_DEBUG("Removeing match %s\n", rule);
+ DEBUG_MSG("Removeing match %s\n", rule);
dbus_bus_remove_match(con, rule, &error);
if (dbus_error_is_set(&error)) {
_croak_error(&error);
@@ -702,9 +723,9 @@ dbus_bus_request_name(con, service_name)
void
DESTROY(con)
DBusConnection *con;
- CODE:
- PD_DEBUG("Destroying connection %p\n", con);
- dbus_connection_disconnect(con);
+ CODE:
+ DEBUG_MSG("Unrefing connection %p\n", con);
+ dbus_connection_unref(con);
MODULE = Net::DBus::Binding::Server PACKAGE = Net::DBus::Binding::Server
@@ -720,7 +741,7 @@ _open(address)
CODE:
dbus_error_init(&error);
server = dbus_server_listen(address, &error);
- PD_DEBUG("Created server %p on address %s", server, address);
+ DEBUG_MSG("Created server %p on address %s\n", server, address);
if (!server) {
_croak_error(&error);
}
@@ -788,7 +809,7 @@ void
DESTROY(server)
DBusServer *server;
CODE:
- PD_DEBUG("Destroying server %p\n", server);
+ DEBUG_MSG("Destroying server %p\n", server);
dbus_server_unref(server);
@@ -805,6 +826,7 @@ _open(type)
CODE:
dbus_error_init(&error);
con = dbus_bus_get(type, &error);
+ dbus_connection_ref(con);
if (!con) {
_croak_error(&error);
}
@@ -826,8 +848,8 @@ _create(type)
if (!msg) {
croak("No memory to allocate message");
}
- PD_DEBUG("Create msg new %p\n", msg);
- PD_DEBUG(" Type %d\n", dbus_message_get_type(msg));
+ DEBUG_MSG("Create msg new %p\n", msg);
+ DEBUG_MSG(" Type %d\n", dbus_message_get_type(msg));
RETVAL = msg;
OUTPUT:
RETVAL
@@ -859,11 +881,11 @@ void
DESTROY(msg)
DBusMessage *msg;
CODE:
- PD_DEBUG("De-referencing message %p\n", msg);
- PD_DEBUG(" Type %d\n", dbus_message_get_type(msg));
- PD_DEBUG(" Interface %s\n", dbus_message_get_interface(msg) ? dbus_message_get_interface(msg) : "");
- PD_DEBUG(" Path %s\n", dbus_message_get_path(msg) ? dbus_message_get_path(msg) : "");
- PD_DEBUG(" Member %s\n", dbus_message_get_member(msg) ? dbus_message_get_member(msg) : "");
+ DEBUG_MSG("De-referencing message %p\n", msg);
+ DEBUG_MSG(" Type %d\n", dbus_message_get_type(msg));
+ DEBUG_MSG(" Interface %s\n", dbus_message_get_interface(msg) ? dbus_message_get_interface(msg) : "");
+ DEBUG_MSG(" Path %s\n", dbus_message_get_path(msg) ? dbus_message_get_path(msg) : "");
+ DEBUG_MSG(" Member %s\n", dbus_message_get_member(msg) ? dbus_message_get_member(msg) : "");
dbus_message_unref(msg);
dbus_bool_t
@@ -937,11 +959,11 @@ _create(path, interface, name)
if (!msg) {
croak("No memory to allocate message");
}
- PD_DEBUG("Create msg new signal %p\n", msg);
- PD_DEBUG(" Type %d\n", dbus_message_get_type(msg));
- PD_DEBUG(" Interface %s\n", dbus_message_get_interface(msg) ? dbus_message_get_interface(msg) : "");
- PD_DEBUG(" Path %s\n", dbus_message_get_path(msg) ? dbus_message_get_path(msg) : "");
- PD_DEBUG(" Member %s\n", dbus_message_get_member(msg) ? dbus_message_get_member(msg) : "");
+ DEBUG_MSG("Create msg new signal %p\n", msg);
+ DEBUG_MSG(" Type %d\n", dbus_message_get_type(msg));
+ DEBUG_MSG(" Interface %s\n", dbus_message_get_interface(msg) ? dbus_message_get_interface(msg) : "");
+ DEBUG_MSG(" Path %s\n", dbus_message_get_path(msg) ? dbus_message_get_path(msg) : "");
+ DEBUG_MSG(" Member %s\n", dbus_message_get_member(msg) ? dbus_message_get_member(msg) : "");
RETVAL = msg;
OUTPUT:
RETVAL
@@ -963,11 +985,11 @@ _create(service, path, interface, method)
if (!msg) {
croak("No memory to allocate message");
}
- PD_DEBUG("Create msg new method call %p\n", msg);
- PD_DEBUG(" Type %d\n", dbus_message_get_type(msg));
- PD_DEBUG(" Interface %s\n", dbus_message_get_interface(msg) ? dbus_message_get_interface(msg) : "");
- PD_DEBUG(" Path %s\n", dbus_message_get_path(msg) ? dbus_message_get_path(msg) : "");
- PD_DEBUG(" Member %s\n", dbus_message_get_member(msg) ? dbus_message_get_member(msg) : "");
+ DEBUG_MSG("Create msg new method call %p\n", msg);
+ DEBUG_MSG(" Type %d\n", dbus_message_get_type(msg));
+ DEBUG_MSG(" Interface %s\n", dbus_message_get_interface(msg) ? dbus_message_get_interface(msg) : "");
+ DEBUG_MSG(" Path %s\n", dbus_message_get_path(msg) ? dbus_message_get_path(msg) : "");
+ DEBUG_MSG(" Member %s\n", dbus_message_get_member(msg) ? dbus_message_get_member(msg) : "");
RETVAL = msg;
OUTPUT:
RETVAL
@@ -989,11 +1011,11 @@ _create(call)
dbus_message_set_interface(msg, dbus_message_get_interface(call));
dbus_message_set_path(msg, dbus_message_get_path(call));
dbus_message_set_member(msg, dbus_message_get_member(call));
- PD_DEBUG("Create msg new method return %p\n", msg);
- PD_DEBUG(" Type %d\n", dbus_message_get_type(msg));
- PD_DEBUG(" Interface %s\n", dbus_message_get_interface(msg) ? dbus_message_get_interface(msg) : "");
- PD_DEBUG(" Path %s\n", dbus_message_get_path(msg) ? dbus_message_get_path(msg) : "");
- PD_DEBUG(" Member %s\n", dbus_message_get_member(msg) ? dbus_message_get_member(msg) : "");
+ DEBUG_MSG("Create msg new method return %p\n", msg);
+ DEBUG_MSG(" Type %d\n", dbus_message_get_type(msg));
+ DEBUG_MSG(" Interface %s\n", dbus_message_get_interface(msg) ? dbus_message_get_interface(msg) : "");
+ DEBUG_MSG(" Path %s\n", dbus_message_get_path(msg) ? dbus_message_get_path(msg) : "");
+ DEBUG_MSG(" Member %s\n", dbus_message_get_member(msg) ? dbus_message_get_member(msg) : "");
RETVAL = msg;
OUTPUT:
RETVAL
@@ -1014,11 +1036,11 @@ _create(replyto, name, message)
if (!msg) {
croak("No memory to allocate message");
}
- PD_DEBUG("Create msg new error %p\n", msg);
- PD_DEBUG(" Type %d\n", dbus_message_get_type(msg));
- PD_DEBUG(" Interface %s\n", dbus_message_get_interface(msg) ? dbus_message_get_interface(msg) : "");
- PD_DEBUG(" Path %s\n", dbus_message_get_path(msg) ? dbus_message_get_path(msg) : "");
- PD_DEBUG(" Member %s\n", dbus_message_get_member(msg) ? dbus_message_get_member(msg) : "");
+ DEBUG_MSG("Create msg new error %p\n", msg);
+ DEBUG_MSG(" Type %d\n", dbus_message_get_type(msg));
+ DEBUG_MSG(" Interface %s\n", dbus_message_get_interface(msg) ? dbus_message_get_interface(msg) : "");
+ DEBUG_MSG(" Path %s\n", dbus_message_get_path(msg) ? dbus_message_get_path(msg) : "");
+ DEBUG_MSG(" Member %s\n", dbus_message_get_member(msg) ? dbus_message_get_member(msg) : "");
RETVAL = msg;
OUTPUT:
RETVAL
@@ -1028,8 +1050,18 @@ MODULE = Net::DBus::Binding::C::PendingCall PACKAGE = Net::DBus::Binding::C::Pe
PROTOTYPES: ENABLE
DBusMessage *
-dbus_pending_call_steal_reply(call)
+_steal_reply(call)
DBusPendingCall *call;
+ PREINIT:
+ DBusMessage *msg;
+ CODE:
+ DEBUG_MSG("Stealing pending call reply %p\n", call);
+ msg = dbus_pending_call_steal_reply(call);
+ dbus_message_ref(msg);
+ DEBUG_MSG("Got reply message %p\n", msg);
+ RETVAL = msg;
+ OUTPUT:
+ RETVAL
void
dbus_pending_call_block(call)
@@ -1049,14 +1081,14 @@ _set_notify(call, code)
SV *code;
CODE:
SvREFCNT_inc(code);
- PD_DEBUG("Adding pending call notify %p\n", code);
+ DEBUG_MSG("Adding pending call notify %p\n", code);
dbus_pending_call_set_notify(call, _pending_call_callback, code, _pending_call_notify_release);
void
DESTROY (call)
DBusPendingCall *call;
CODE:
- PD_DEBUG("Unrefing pending call %p", call);
+ DEBUG_MSG("Unrefing pending call %p", call);
dbus_pending_call_unref(call);
MODULE = Net::DBus::Binding::C::Watch PACKAGE = Net::DBus::Binding::C::Watch
@@ -1090,7 +1122,7 @@ handle(watch, flags)
DBusWatch *watch;
unsigned int flags;
CODE:
- PD_DEBUG("Handling event %d on fd %d (%p)\n", flags, dbus_watch_get_fd(watch), watch);
+ DEBUG_MSG("Handling event %d on fd %d (%p)\n", flags, dbus_watch_get_fd(watch), watch);
dbus_watch_handle(watch, flags);
@@ -1132,7 +1164,7 @@ void
handle(timeout)
DBusTimeout *timeout;
CODE:
- PD_DEBUG("Handling timeout event %p\n", timeout);
+ DEBUG_MSG("Handling timeout event %p\n", timeout);
dbus_timeout_handle(timeout);
void *
@@ -1422,7 +1454,7 @@ void
DESTROY(iter)
DBusMessageIter *iter;
CODE:
- PD_DEBUG("Destroying iterator %p\n", iter);
+ DEBUG_MSG("Destroying iterator %p\n", iter);
dbus_free(iter);
MODULE = Net::DBus PACKAGE = Net::DBus
diff --git a/Makefile.PL b/Makefile.PL
index ad980a1..c67083c 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -3,6 +3,9 @@ use ExtUtils::MakeMaker;
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
+`pkg-config --atleast-version=0.93 dbus-1`;
+my $has_0_93 = (($? >> 8) == 0 ? 1 : 0);
+
my $DBUS_LIBS = `pkg-config --libs dbus-1`;
my $DBUS_CFLAGS = `pkg-config --cflags dbus-1`;
@@ -21,10 +24,11 @@ WriteMakefile(
'Time::HiRes' => 0,
'XML::Twig' => 0,
},
-# 'ABSTRACT_FROM' => 'lib/Net/DBus.pm',
'AUTHOR' => 'Daniel Berrange <dan at berrange.com>',
- 'LIBS' => [$DBUS_LIBS],
- 'DEFINE' => "-DDBUS_API_SUBJECT_TO_CHANGE -DPD_DO_DEBUG=1",
+ 'LIBS' => [$DBUS_LIBS],
+ 'DEFINE' => ($has_0_93 ?
+ "-DDBUS_API_SUBJECT_TO_CHANGE -DHAVE_CONN_DISCONNECT=0 -DNET_DBUS_DEBUG=1" :
+ "-DDBUS_API_SUBJECT_TO_CHANGE -DHAVE_CONN_DISCONNECT=1 -DNET_DBUS_DEBUG=1"),
'INC' => "-Wall $DBUS_CFLAGS",
'depend' => {
Net-DBus.spec => '$(VERSION_FROM)',
diff --git a/lib/Net/DBus/Binding/PendingCall.pm b/lib/Net/DBus/Binding/PendingCall.pm
index e061359..131d366 100644
--- a/lib/Net/DBus/Binding/PendingCall.pm
+++ b/lib/Net/DBus/Binding/PendingCall.pm
@@ -130,14 +130,12 @@ with the complete call.
sub get_reply {
my $self = shift;
- my $reply = $self->{pending_call}->dbus_pending_call_steal_reply();
+ my $reply = $self->{pending_call}->_steal_reply();
my $type = $reply->dbus_message_get_type;
if ($type == &Net::DBus::Binding::Message::MESSAGE_TYPE_ERROR) {
- return $self->{connection}->make_error_message($self->{method_call},
- $reply);
+ return $self->{connection}->make_raw_message($reply);
} elsif ($type == &Net::DBus::Binding::Message::MESSAGE_TYPE_METHOD_RETURN) {
- return $self->{connection}->make_method_return_message($self->{method_call},
- $reply);
+ return $self->{connection}->make_raw_message($reply);
} else {
die "unknown method reply type $type";
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libnet-dbus-perl.git
More information about the Pkg-perl-cvs-commits
mailing list