|
View:
New views
1 Messages
—
Rating Filter:
Alert me
|
|
|
Question regarding GMainLoop usageHi, I am newbie to dbus and any help would be greatly
appreciated. Software Version info: Upstart 0.5 D-Bus 1.2.1 D-Bus GLib Bindings 0.75 (05 Jun 2008) I am trying to write a c library that uses dbus-glib to talk
to upstart 0.5 I want to use a GMainLoop to receive upstart job/instance
signals as well as handle callbacks to upstart async api calls (emit event,
start job etc). My library has a init function that does the following. Processes
call this init function before making any upstart api calls. int sysmgr_clientlib_init() { /*
Initialize the dbus connection */ myconn
= dbus_g_bus_get(DBUS_BUS_SYSTEM, &error); if
(myconn == NULL) { handleError("sysmgrlib_init
failed.","Unable to open connection to dbus", TRUE); } /*
Initialize the upstart Proxy */ upstartProxy
= dbus_g_proxy_new_for_name(myconn, UPSTART_SERVICE,UPSTART_SERVICE_PATH,UPSTART_INTERFACE); if
(NULL == upstartProxy) { handleError("sysmgrlib_init
failed.","Unable to get upstart proxy",TRUE); } //Add
the signals for Upstart Proxy. This should happen only once. //connect/disconnect
happens on EnableSignal and DisableSignal function. dbus_g_proxy_add_signal
(upstartProxy, "JobAdded", DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID); dbus_g_proxy_add_signal
(upstartProxy, "JobRemoved", DBUS_TYPE_G_OBJECT_PATH,
G_TYPE_INVALID); //Start
a gthread that runs a GMainLoop if(
(gtmainloop = g_thread_create((GThreadFunc)ThreadGMainLoop, NULL, TRUE,
&error)) == NULL) { handleError("sysmgrlib_init
failed. Thread creation failed.",error->message,TRUE); } if(NULL!=error) g_clear_error(&error);
<snip/>//Other initialization. return
0; } static void * ThreadGMainLoop(void * UNUSED (ptr)) { mainloop
= g_main_loop_new(NULL, FALSE); if
(NULL == mainloop) { handleError("GMainLoop
initialization failed.", "Signals
and Async callbacks will not be handled", TRUE); } verbose("g_main_loop_run
starting"); g_main_loop_run(mainloop); verbose("g_main_loop_run
exited"); fflush(stdout); return
NULL; } void sysmgr_clientlib_release() { if(0==sysmgr_clientlib_init_done) return; g_main_loop_quit(mainloop); g_object_unref(upstartProxy); upstartProxy=NULL; <snip/> } I am running into a crash rarely (not easy to duplicate) on
a dual processor ppc based board. I have not seen this crash on a single processor system. The crash seems to indicate that the connection object is
null. Does the logic above of starting a gmainloop in a separate
thread look ok? I added a sleep(1) after the g_thread creation before making
my first API call and I have not seen a crash in the last couple of days of my
testing. Is this because the g_main_loop is getting more time to complete
its initialize now after I introduced the sleep? Any suggestions/feedback on the logic would be greatly
appreciated. Thanks and Regards, Sandeep Crash info indicating connection=NULL -------------------------------------------------------- Thread 1 (process 5979): #0 _dbus_connection_lock (connection=0x0) at
/nobackup/spuddupa/nova/contrib/dbus/dbus/dbus-connection.c:355 No locals. #1 0x0f81aafc in
_dbus_pending_call_get_connection_and_lock (pending=0x100244c8) at /nobackup/spuddupa/nova/contrib/dbus/dbus/dbus-pending-call.c:309 No locals. #2 0x0f80b0e8 in reply_handler_timeout
(data=0x100244c8) at
/nobackup/spuddupa/nova/contrib/dbus/dbus/dbus-connection.c:3104 connection =
(DBusConnection *) 0x1001b980 status = 16 #3 0x0f820088 in dbus_timeout_handle
(timeout=0xf80b0c8) at
/nobackup/spuddupa/nova/contrib/dbus/dbus/dbus-timeout.c:473 No locals. #4 0x0f90b518 in timeout_handler_dispatch (data=0x0) at
/nobackup/spuddupa/nova/contrib/dbus-glib/dbus/dbus-gmain.c:343 No locals. #5 0x0f71a454 in g_timeout_dispatch
(source=0x48828d9c, callback=0xf81aafc
<_dbus_pending_call_get_connection_and_lock+32>, user_data=0x10024518) at
/nobackup/spuddupa/nova/contrib/glib/glib/gmain.c:3293 No locals. #6 0x0f716fac in IA__g_main_context_dispatch
(context=0x1001b980) at
/nobackup/spuddupa/nova/contrib/glib/glib/gmain.c:1934 No locals. #7 0x0f718f78 in g_main_context_iterate
(context=0x1001b980, block=0, dispatch=259105812, self=0x48828d9c) at /nobackup/spuddupa/nova/contrib/glib/glib/gmain.c:2565 max_priority = 0 timeout = 0 some_ready = 1 nfds = 2 allocated_nfds =
1 fds = (GPollFD *)
0xf78e79c
__PRETTY_FUNCTION__ = "g_main_context_iterate" #8 0x0f719374 in IA__g_main_loop_run (loop=0x1001e2d8) at
/nobackup/spuddupa/nova/contrib/glib/glib/gmain.c:2769 got_ownership =
260156156 self = (GThread
*) 0x1001dbf0
__PRETTY_FUNCTION__ = "IA__g_main_loop_run" #9 0x0ffdbcf8 in ThreadGMainLoop () No symbol table info available. #10 0x0f738784 in g_thread_create_proxy (data=0x0) at
/nobackup/spuddupa/nova/contrib/glib/glib/gthread.c:561 thread =
(GRealThread *) 0x1001e2e0
__PRETTY_FUNCTION__ = "g_thread_create_proxy" #11 0x0f32fd94 in start_thread (arg=0x0) at
pthread_create.c:263 pd = (struct
pthread *) 0x488294f0 unwind_buf =
{cancel_jmp_buf = {{jmp_buf = {1216515712, 0, 254999900, -1, 0, 0, 268557320,
1208130000, 268557296, 259229272, 255112832, 1, 7, 0, -1075695120, 8195840,
1216516256, 8195840, 1216516240, 255112376, 1216517360, 1107829794, 0 <repeats 90
times>}, mask_was_saved = 0}}, priv = {pad = {0x0, 0x0, 0x0, 0x0}, data = {prev = 0x0, cleanup = 0x0,
canceltype = 0}}} not_first_call =
0 _______________________________________________ dbus mailing list dbus@... http://lists.freedesktop.org/mailman/listinfo/dbus |
| Free embeddable forum powered by Nabble | Forum Help |