2006-08-06 Dan Williams <dcbw@redhat.com>
* gnome/applet/applet-dbus-devices.c gnome/applet/applet-dbus-vpn.c gnome/applet/applet-dbus.c gnome/applet/applet-dbus.h src/nm-dbus-nmi.c utils/nm-utils.c utils/nm-utils.h - Make pending call tracking code generic, so we can use it in NM as well as the applet git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1940 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
130
utils/nm-utils.c
130
utils/nm-utils.c
@@ -25,6 +25,7 @@
|
||||
#include <errno.h>
|
||||
|
||||
#include <glib.h>
|
||||
#include <dbus/dbus.h>
|
||||
#include "nm-utils.h"
|
||||
|
||||
gchar *nm_dbus_escape_object_path (const gchar *utf8_string)
|
||||
@@ -348,3 +349,132 @@ nm_utils_essid_to_utf8 (const char *orig_essid)
|
||||
|
||||
return new_essid;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 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);
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user