+_dbus_daemon_is_session_bus_address_published (const char *scope)
+{
+ HANDLE lock;
+ HANDLE mutex;
+ DBusString mutex_name;
+ DWORD ret;
+
+ if (!_dbus_get_mutex_name(&mutex_name,scope))
+ {
+ _dbus_string_free( &mutex_name );
+ return FALSE;
+ }
+
+ if (hDBusDaemonMutex)
+ return TRUE;
+
+ // sync _dbus_daemon_publish_session_bus_address, _dbus_daemon_unpublish_session_bus_address and _dbus_daemon_already_runs
+ lock = _dbus_global_lock( cUniqueDBusInitMutex );
+
+ // we use CreateMutex instead of OpenMutex because of possible race conditions,
+ // see http://msdn.microsoft.com/en-us/library/ms684315%28VS.85%29.aspx
+ hDBusDaemonMutex = CreateMutexA( NULL, FALSE, _dbus_string_get_const_data(&mutex_name) );
+
+ _dbus_global_unlock( lock );
+
+ _dbus_string_free( &mutex_name );
+
+ if (hDBusDaemonMutex == NULL)
+ return FALSE;
+ if (GetLastError() == ERROR_ALREADY_EXISTS)
+ {
+ CloseHandle(hDBusDaemonMutex);
+ hDBusDaemonMutex = NULL;
+ return TRUE;
+ }
+ // mutex wasn't created before, so return false.
+ // We leave the mutex name allocated for later reusage
+ // in _dbus_daemon_publish_session_bus_address.
+ return FALSE;
+}
+
+dbus_bool_t