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:
Dan Williams
2006-08-07 03:06:11 +00:00
parent 92077eb5ab
commit 1dbe9fd061
8 changed files with 219 additions and 207 deletions

View File

@@ -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);
}