<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'>
Hi,<BR>
&nbsp;<BR>
1. I run dbus-daemon.exe on windows platform as a session bus, using "autolaunch:" address. When I run other programs that communicate with DBus, I found additional dbus-daemon processes created, all the preocess except the original one feed 64 bytes memory. After digging the code, I found it is the dbus daemon mutex issue: dbus daemon uses a shared memory file store the bus address and uses a mutex protect it, but the mutex is used incorrectly:<BR>
a) When publishing session bus address (function _dbus_daemon_publish_session_bus_address in dbus-sysdeps-win.c), it does not acquire the ownership of the mutex;<BR>
b) When checking dbus daemon running instance (function _dbus_daemon_already_runs in dbus-sysdeps-win.c), check condition of the result of function WaitForSingleObject should be WAIT_OBJECT_0, not WAIT_TIMEOUT.<BR>
Code with the above changes never lead the multiple dbus-daemon processes again.<BR>
&nbsp;<BR>
2. There is another issue about session bus default address. DBUS_SESSION_BUS_DEFAULT_ADDRESS, deduced in configure.ac, is not exported to&nbsp;config.h, so the default session bus address used in dbus lib&nbsp;maybe inconsistent with the one in session.conf, so should the following line be added in configure.ac?<BR>
&nbsp;<BR>
AC_DEFINE_UNQUOTED(DBUS_SESSION_BUS_DEFAULT_ADDRESS, "$DBUS_SESSION_BUS_DEFAULT_ADDRESS", [Session bus default address])<BR><BR>
(The code described in item 1.)<BR>
dbus_bool_t<BR>_dbus_daemon_publish_session_bus_address (const char* address, const char *scope)<BR>{<BR>&nbsp; HANDLE lock;<BR>&nbsp; char *shared_addr = NULL;<BR>&nbsp; DWORD ret;<BR>&nbsp; char addressInfo[1024];<BR>&nbsp; DBusString shm_name;<BR>&nbsp; DBusString mutex_name;<BR>
&nbsp; _dbus_assert (address);<BR>
&nbsp; if (!_dbus_get_mutex_name(&amp;mutex_name,scope))<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _dbus_string_free( &amp;mutex_name );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<BR>&nbsp;&nbsp;&nbsp; }<BR>
&nbsp; // sync _dbus_daemon_publish_session_bus_address, _dbus_daemon_unpublish_session_bus_address and _dbus_daemon_already_runs<BR>&nbsp; lock = _dbus_global_lock( cUniqueDBusInitMutex );<BR>
&nbsp; if (!hDBusDaemonMutex)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hDBusDaemonMutex = CreateMutexA( NULL, FALSE, _dbus_string_get_const_data(&amp;mutex_name) );<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp; _dbus_string_free( &amp;mutex_name );<BR>
&nbsp; // acquire the mutex<BR>&nbsp; if (WaitForSingleObject( hDBusDaemonMutex, 10 ) != WAIT_OBJECT_0)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp; return FALSE;<BR>&nbsp;}<BR>
&nbsp; if (!_dbus_get_shm_name(&amp;shm_name,scope))<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _dbus_string_free( &amp;shm_name );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _dbus_global_unlock( lock );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<BR>&nbsp;&nbsp;&nbsp; }<BR>
&nbsp; // create shm<BR>&nbsp; hDBusSharedMem = CreateFileMappingA( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0, strlen( address ) + 1, _dbus_string_get_const_data(&amp;shm_name) );<BR>&nbsp; _dbus_assert( hDBusSharedMem );<BR>
&nbsp; shared_addr = MapViewOfFile( hDBusSharedMem, FILE_MAP_WRITE, 0, 0, 0 );<BR>
&nbsp; _dbus_assert (shared_addr);<BR>
&nbsp; strcpy( shared_addr, address);<BR>
&nbsp; // cleanup<BR>&nbsp; UnmapViewOfFile( shared_addr );<BR>&nbsp; // release the ownership of dbus daemon mutex<BR>&nbsp; ReleaseMutex( hDBusDaemonMutex );<BR>
&nbsp; _dbus_global_unlock( lock );<BR>&nbsp; _dbus_verbose( "published session bus address at %s\n",_dbus_string_get_const_data (&amp;shm_name) );<BR>
&nbsp; _dbus_string_free( &amp;shm_name );<BR>&nbsp; return TRUE;<BR>}<BR>
&nbsp;<BR>
static dbus_bool_t<BR>_dbus_daemon_already_runs (DBusString *address, DBusString *shm_name, const char *scope)<BR>{<BR>&nbsp; HANDLE lock;<BR>&nbsp; HANDLE daemon;<BR>&nbsp; DBusString mutex_name;<BR>&nbsp; dbus_bool_t bRet = TRUE;<BR>
&nbsp; if (!_dbus_get_mutex_name(&amp;mutex_name,scope))<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _dbus_string_free( &amp;mutex_name );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<BR>&nbsp;&nbsp;&nbsp; }<BR>
&nbsp; // sync _dbus_daemon_publish_session_bus_address, _dbus_daemon_unpublish_session_bus_address and _dbus_daemon_already_runs<BR>&nbsp; lock = _dbus_global_lock( cUniqueDBusInitMutex );<BR>
&nbsp; // do checks<BR>&nbsp; daemon = CreateMutexA( NULL, FALSE, _dbus_string_get_const_data(&amp;mutex_name) );<BR>&nbsp; if(WaitForSingleObject( daemon, 10 ) != WAIT_OBJECT_0)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReleaseMutex (daemon);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CloseHandle (daemon);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _dbus_global_unlock( lock );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _dbus_string_free( &amp;mutex_name );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<BR>&nbsp;&nbsp;&nbsp; }<BR>
&nbsp; // read shm<BR>&nbsp; bRet = _dbus_get_autolaunch_shm( address, shm_name );<BR>
&nbsp; // cleanup<BR>&nbsp; ReleaseMutex (daemon);<BR>&nbsp; CloseHandle ( daemon );<BR>
&nbsp; _dbus_global_unlock( lock );<BR>&nbsp; _dbus_string_free( &amp;mutex_name );<BR>
&nbsp; return bRet;<BR>}<BR><BR>
-Vincent<BR><BR>                                               </body>
</html>