Re: Hang in libnm_glib_init

2006-10-26 Thread Dan Williams
On Thu, 2006-10-26 at 12:08 -0500, Richard Laager wrote:
> On Thu, 2006-10-26 at 10:43 -0400, Dan Williams wrote:
> > Admittedly, libnm_glib is pretty bad, but was developed as a hack for eg
> > firefox to not have to hook up to DBus directly.
> 
> So perhaps we should be hooking into NetworkManager differently? We have
> DBus support already, so that shouldn't be a problem for us like it
> might be for FireFox.

Right.  If you've already got DBus support, it's not hard to add the
bits for NM, and that would probably be the way to go.  libnm_glib is
probably not suitable for you right now.

You'll at a minimum, need to:

1) On startup, look for the NetworkManager service.

1a) If it does not exist, behavior is up to you whether you want to
assume that a valid network connection is present, or whether you have
some other mechanism to run through the routing table and see if there
are valid entries for a gateway, or check all network adapters for valid
IP addresses and whether they are IFF_UP or whatever

1b) If the NM service is running, then query NM state using the 'state'
method of the /org/freedesktop/NetworkManager object on the
'org.freedesktop.NetworkManager' interface.  The reply to state will be
a single DBUS_TYPE_UINT32, with values corresponding to the NMState enum
in /usr/include/NetworkManager/NetworkManager.h, or:

typedef enum NMState
{
NM_STATE_UNKNOWN = 0,
NM_STATE_ASLEEP,
NM_STATE_CONNECTING,
NM_STATE_CONNECTED,
NM_STATE_DISCONNECTED
} NMState;

If NM is running, you'll also want to add a signal match for the
"StateChange" signal:

#define NM_DBUS_SIGNAL_STATE_CHANGE "StateChange"

The parameters passed iwth that signal are the same as the "state"
method call, a single DBUS_TYPE_UINT32.

2) Install a handler for the D-Bus signal NameOwnerChanged.

2a) If you get a NOC and NM has gone away, do whatever you feel is
appropriate.  NM has probably taken down your network connection if it
exited cleanly.

2b) If you get a NOC and NM has appeared, query NM's state like you did
when you started up, if NM appeared.


The code in libnm_glib should be a pretty good guide of what needs to
happen, if you're using straight DBus and the C bindings.  Feel free to
mail the list with more questions!

Dan

> > In any case, the only
> > g_usleep() in libnm_glib is waiting for dbus handler thread to start.
> 
> DBus threading... I was afraid of that. There was recently a RedHat
> bugzilla bug on a similar issue in Gaim. I don't have the number
> off-hand, but maybe Warren does. It was something with deadlocks because
> the GTK+ file chooser would init the vfs library, which used threads,
> and DBus used threads, and the initializations didn't play well
> together. IIRC, eventually this was fixed in DBus, so maybe this isn't a
> problem with newer versions of DBus?
> 
> > Instead of doing a 'bt', can you do a 't a a bt' (thread apply all
> > backtrace) to get a backtrace that includes _all_ threads?
> 
> (gdb) r
> Starting program: /home/rlaager/bin/gaim-HEAD
> [Thread debugging using libthread_db enabled]
> [New Thread -1209166144 (LWP 27296)]
> [New Thread -1214899280 (LWP 27300)]
> 
> Program received signal SIGINT, Interrupt.
> [Switching to Thread -1209166144 (LWP 27296)]
> 0xe410 in __kernel_vsyscall ()
> (gdb) thread a a bt
> 
> Thread 2 (Thread -1214899280 (LWP 27300)):
> #0  0xe410 in __kernel_vsyscall ()
> #1  0x47a5c2ae in __lll_mutex_lock_wait ()
>from /lib/tls/i686/cmov/libpthread.so.0
> #2  0x47a58fbb in _L_mutex_lock_33 ()
> from /lib/tls/i686/cmov/libpthread.so.0
> #3  0xb79612b8 in ?? ()
> #4  0x4b2bdb6c in dbus_g_object_path_get_g_type ()
>from /usr/lib/libdbus-glib-1.so.2
> #5  0x4b2bdb34 in dbus_g_object_path_get_g_type ()
>from /usr/lib/libdbus-glib-1.so.2
> #6  0x47b793d7 in dbus_timeout_get_enabled ()
> from /usr/lib/libdbus-1.so.2
> #7  0x47b7bbd7 in dbus_watch_handle () from /usr/lib/libdbus-1.so.2
> #8  0x47b66aae in dbus_connection_allocate_data_slot ()
>from /usr/lib/libdbus-1.so.2
> #9  0x47b6108f in dbus_address_unescape_value ()
> from /usr/lib/libdbus-1.so.2
> #10 0x47b61514 in dbus_bus_register () from /usr/lib/libdbus-1.so.2
> #11 0xb7ede4f9 in libnm_glib_dbus_init (user_data=0x818aca8,
> context=0x8185e00)
> at libnm_glib.c:298
> #12 0xb7ede69e in libnm_glib_dbus_worker (user_data=0x818aca8)
> at libnm_glib.c:401
> #13 0x4ab825a2 in g_static_private_free ()
> from /usr/lib/libglib-2.0.so.0
> #14 0x47a57341 in start_thread ()
> from /lib/tls/i686/cmov/libpthread.so.0
> ---Type  to continue, or q  to quit---
> #15 0x479ab4ee in clone () from /lib/tls/i686/cmov/libc.so.6
> 
> Thread 1 (Thread -1209166144 (LWP 27296)):
> #0  0xe410 in __kernel_vsyscall ()
> #1  0x47a5cd56 in __nanosleep_nocancel ()
>from /lib/tls/i686/cmov/libpthread.so.0
> #2  0x4ab84b04 in g_usleep () from /usr/lib/libglib-2.0.so.0
> #3  0xb7ede8d3 in libnm_glib_init () at libnm_glib.c:488
> #4  0xb7f210f2 in gaim_network_init ()

Re: Hang in libnm_glib_init

2006-10-26 Thread Richard Laager
On Thu, 2006-10-26 at 10:43 -0400, Dan Williams wrote:
> Admittedly, libnm_glib is pretty bad, but was developed as a hack for eg
> firefox to not have to hook up to DBus directly.

So perhaps we should be hooking into NetworkManager differently? We have
DBus support already, so that shouldn't be a problem for us like it
might be for FireFox.

> In any case, the only
> g_usleep() in libnm_glib is waiting for dbus handler thread to start.

DBus threading... I was afraid of that. There was recently a RedHat
bugzilla bug on a similar issue in Gaim. I don't have the number
off-hand, but maybe Warren does. It was something with deadlocks because
the GTK+ file chooser would init the vfs library, which used threads,
and DBus used threads, and the initializations didn't play well
together. IIRC, eventually this was fixed in DBus, so maybe this isn't a
problem with newer versions of DBus?

> Instead of doing a 'bt', can you do a 't a a bt' (thread apply all
> backtrace) to get a backtrace that includes _all_ threads?

(gdb) r
Starting program: /home/rlaager/bin/gaim-HEAD
[Thread debugging using libthread_db enabled]
[New Thread -1209166144 (LWP 27296)]
[New Thread -1214899280 (LWP 27300)]

Program received signal SIGINT, Interrupt.
[Switching to Thread -1209166144 (LWP 27296)]
0xe410 in __kernel_vsyscall ()
(gdb) thread a a bt

Thread 2 (Thread -1214899280 (LWP 27300)):
#0  0xe410 in __kernel_vsyscall ()
#1  0x47a5c2ae in __lll_mutex_lock_wait ()
   from /lib/tls/i686/cmov/libpthread.so.0
#2  0x47a58fbb in _L_mutex_lock_33 ()
from /lib/tls/i686/cmov/libpthread.so.0
#3  0xb79612b8 in ?? ()
#4  0x4b2bdb6c in dbus_g_object_path_get_g_type ()
   from /usr/lib/libdbus-glib-1.so.2
#5  0x4b2bdb34 in dbus_g_object_path_get_g_type ()
   from /usr/lib/libdbus-glib-1.so.2
#6  0x47b793d7 in dbus_timeout_get_enabled ()
from /usr/lib/libdbus-1.so.2
#7  0x47b7bbd7 in dbus_watch_handle () from /usr/lib/libdbus-1.so.2
#8  0x47b66aae in dbus_connection_allocate_data_slot ()
   from /usr/lib/libdbus-1.so.2
#9  0x47b6108f in dbus_address_unescape_value ()
from /usr/lib/libdbus-1.so.2
#10 0x47b61514 in dbus_bus_register () from /usr/lib/libdbus-1.so.2
#11 0xb7ede4f9 in libnm_glib_dbus_init (user_data=0x818aca8,
context=0x8185e00)
at libnm_glib.c:298
#12 0xb7ede69e in libnm_glib_dbus_worker (user_data=0x818aca8)
at libnm_glib.c:401
#13 0x4ab825a2 in g_static_private_free ()
from /usr/lib/libglib-2.0.so.0
#14 0x47a57341 in start_thread ()
from /lib/tls/i686/cmov/libpthread.so.0
---Type  to continue, or q  to quit---
#15 0x479ab4ee in clone () from /lib/tls/i686/cmov/libc.so.6

Thread 1 (Thread -1209166144 (LWP 27296)):
#0  0xe410 in __kernel_vsyscall ()
#1  0x47a5cd56 in __nanosleep_nocancel ()
   from /lib/tls/i686/cmov/libpthread.so.0
#2  0x4ab84b04 in g_usleep () from /usr/lib/libglib-2.0.so.0
#3  0xb7ede8d3 in libnm_glib_init () at libnm_glib.c:488
#4  0xb7f210f2 in gaim_network_init () at network.c:600
#5  0xb7f163b5 in gaim_core_init (ui=0x80d2a6d "gtk-gaim") at core.c:128
#6  0x080a8b30 in main (argc=1, argv=0xbfa98e84) at gtkmain.c:706

Richard


signature.asc
Description: This is a digitally signed message part
___
NetworkManager-list mailing list
NetworkManager-list@gnome.org
http://mail.gnome.org/mailman/listinfo/networkmanager-list


Re: Hang in libnm_glib_init

2006-10-26 Thread Dan Williams
On Wed, 2006-10-25 at 23:15 -0500, Richard Laager wrote:
> Gaim recently started using NetworkManager recently in order to properly
> reconnect when the network is disconnected and reconnected. I'm a Gaim
> developer looking for some guidance.
> 
> When I installed libnm-glib-dev and recompiled Gaim from SVN, it now
> hangs at startup. The UI never loads.

Admittedly, libnm_glib is pretty bad, but was developed as a hack for eg
firefox to not have to hook up to DBus directly.  In any case, the only
g_usleep() in libnm_glib is waiting for dbus handler thread to start.
Instead of doing a 'bt', can you do a 't a a bt' (thread apply all
backtrace) to get a backtrace that includes _all_ threads?

Thanks!
Dan

> I use Network Manager, so I'm not sure what Gaim is waiting for. I tried
> unplugging the network cable and plugging it back in to force a
> network-up situation, but that didn't do it either. The existing Gaim is
> still hanging, and new copies of Gaim do the same.
> 
> I'm running Ubuntu Dapper.
> 
> Thanks,
> Richard
> 
> (gdb) bt
> #0  0xe410 in __kernel_vsyscall ()
> #1  0x47a5cd56 in __nanosleep_nocancel ()
>from /lib/tls/i686/cmov/libpthread.so.0
> #2  0x4ab84b04 in g_usleep () from /usr/lib/libglib-2.0.so.0
> #3  0xb7f028e6 in libnm_glib_init () from /usr/lib/libnm_glib.so.0
> #4  0xb7f450d5 in gaim_network_init () at network.c:597
> #5  0xb7f3a3b5 in gaim_core_init (ui=0x80d29ad "gtk-gaim") at core.c:128
> #6  0x080a8a80 in main (argc=1, argv=0xbf8bce34) at gtkmain.c:706
> ___
> NetworkManager-list mailing list
> NetworkManager-list@gnome.org
> http://mail.gnome.org/mailman/listinfo/networkmanager-list

___
NetworkManager-list mailing list
NetworkManager-list@gnome.org
http://mail.gnome.org/mailman/listinfo/networkmanager-list


Hang in libnm_glib_init

2006-10-25 Thread Richard Laager
Gaim recently started using NetworkManager recently in order to properly
reconnect when the network is disconnected and reconnected. I'm a Gaim
developer looking for some guidance.

When I installed libnm-glib-dev and recompiled Gaim from SVN, it now
hangs at startup. The UI never loads.

I use Network Manager, so I'm not sure what Gaim is waiting for. I tried
unplugging the network cable and plugging it back in to force a
network-up situation, but that didn't do it either. The existing Gaim is
still hanging, and new copies of Gaim do the same.

I'm running Ubuntu Dapper.

Thanks,
Richard

(gdb) bt
#0  0xe410 in __kernel_vsyscall ()
#1  0x47a5cd56 in __nanosleep_nocancel ()
   from /lib/tls/i686/cmov/libpthread.so.0
#2  0x4ab84b04 in g_usleep () from /usr/lib/libglib-2.0.so.0
#3  0xb7f028e6 in libnm_glib_init () from /usr/lib/libnm_glib.so.0
#4  0xb7f450d5 in gaim_network_init () at network.c:597
#5  0xb7f3a3b5 in gaim_core_init (ui=0x80d29ad "gtk-gaim") at core.c:128
#6  0x080a8a80 in main (argc=1, argv=0xbf8bce34) at gtkmain.c:706


signature.asc
Description: This is a digitally signed message part
___
NetworkManager-list mailing list
NetworkManager-list@gnome.org
http://mail.gnome.org/mailman/listinfo/networkmanager-list