diff options
Diffstat (limited to 'src/vpn-manager/nm-dbus-vpn.c')
-rw-r--r-- | src/vpn-manager/nm-dbus-vpn.c | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/src/vpn-manager/nm-dbus-vpn.c b/src/vpn-manager/nm-dbus-vpn.c index 157d7c4ca3..86850729c2 100644 --- a/src/vpn-manager/nm-dbus-vpn.c +++ b/src/vpn-manager/nm-dbus-vpn.c @@ -34,6 +34,133 @@ #include "nm-utils.h" #include "nm-dbus-manager.h" +/* + * Pending Call Debug stuff + * + */ +typedef struct PCallInfo +{ + DBusPendingCall * pcall; + char * caller; + guint32 id; + GTimeVal start; +} PCallInfo; + +static GStaticMutex pcall_mutex = G_STATIC_MUTEX_INIT; +static GHashTable * pcall_table = NULL; +static guint32 pcall_gid = 0; +static guint32 pcall_pending = 0; + + +DBusPendingCall * +nm_dbus_send_with_callback (DBusConnection *connection, + DBusMessage *msg, + DBusPendingCallNotifyFunction func, + gpointer data, + DBusFreeFunction free_func, + const char *caller) +{ + PCallInfo * info = NULL; + DBusPendingCall * pcall = NULL; + + g_return_val_if_fail (connection != NULL, NULL); + g_return_val_if_fail (msg != NULL, NULL); + g_return_val_if_fail (func != NULL, NULL); + g_return_val_if_fail (caller != NULL, NULL); + + if (!(info = g_malloc0 (sizeof (PCallInfo)))) + { + g_warning ("Error: '%s' couldn't allocate memory for tracking PCall.", caller); + if (free_func) + (*free_func)(data); + return NULL; + } + + dbus_connection_send_with_reply (connection, msg, &pcall, -1); + if (!pcall) + { + g_warning ("Error: '%s' couldn't send dbus message.", caller); + if (free_func) + (*free_func)(data); + g_free (info); + return NULL; + } + dbus_pending_call_set_notify (pcall, func, data, free_func); + + info->caller = g_strdup (caller); + info->pcall = pcall; + g_get_current_time (&info->start); + dbus_pending_call_ref (pcall); + + g_static_mutex_lock (&pcall_mutex); + info->id = pcall_gid++; + pcall_pending++; + + if (!pcall_table) + pcall_table = g_hash_table_new (g_direct_hash, g_direct_equal); + g_hash_table_insert (pcall_table, pcall, info); + +#ifdef DBUS_PENDING_CALL_DEBUG + nm_info ("PCall Debug: new id %d (%p), from '%s' (%s), " + "%d pending.", info->id, pcall, info->caller, + dbus_message_get_member (msg), pcall_pending); +#endif + + g_static_mutex_unlock (&pcall_mutex); + + return pcall; +} + +void +nm_dbus_send_with_callback_replied (DBusPendingCall *pcall, + const char *caller) +{ + PCallInfo * info; +#ifdef DBUS_PENDING_CALL_DEBUG + GTimeVal now; + long elapsed_ms = 0; +#endif + + g_return_if_fail (pcall != NULL); + g_return_if_fail (caller != NULL); + + g_static_mutex_lock (&pcall_mutex); + if (!(info = g_hash_table_lookup (pcall_table, pcall))) + { + nm_warning ("Error: couldn't find pending call %p in tracking" + " table.", pcall); + goto out; + } + + pcall_pending--; +#ifdef DBUS_PENDING_CALL_DEBUG + g_get_current_time (&now); + if (info->start.tv_usec > now.tv_usec) + { + now.tv_sec--; + now.tv_usec = G_USEC_PER_SEC - (info->start.tv_usec - now.tv_usec); + } + else + now.tv_usec -= info->start.tv_usec; + now.tv_sec -= info->start.tv_sec; + elapsed_ms = now.tv_sec * G_USEC_PER_SEC + now.tv_usec; + elapsed_ms /= 1000; + + nm_info ("PCall Debug: unregistered ID %d (%p), %s -> %s," + " %lums elapsed. Total pending: %d", info->id, info->pcall, info->caller, + caller, elapsed_ms, pcall_pending); +#endif + + g_hash_table_remove (pcall_table, pcall); + g_free (info->caller); + dbus_pending_call_unref (info->pcall); + g_free (info); + +out: + g_static_mutex_unlock (&pcall_mutex); +} + + static DBusMessage * new_invalid_vpn_connection_error (DBusMessage *replyto) |