dbus-threads.c revision 7c62f972f3280f5a31b0d2635e2e5cc9fcc12c0e
1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ 27652304bff969afb3969603149bb385efe861fe8John (J/* dbus-threads.h D-Bus threads handling 3a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 45886f5326da2dbe8f1a7c97736d544fa4cef169bHavoc Pennington * Copyright (C) 2002, 2003, 2006 Red Hat Inc. 5a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 643605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1 7a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 8a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * This program is free software; you can redistribute it and/or modify 9a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * it under the terms of the GNU General Public License as published by 10a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * the Free Software Foundation; either version 2 of the License, or 11a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * (at your option) any later version. 12a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 13a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * This program is distributed in the hope that it will be useful, 14a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of 15a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * GNU General Public License for more details. 17a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 18a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * You should have received a copy of the GNU General Public License 19a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * along with this program; if not, write to the Free Software 205baf2f856a9c6625993234855b07680da1c8916fTobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 22a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 23a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington#include "dbus-threads.h" 24a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington#include "dbus-internals.h" 25cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington#include "dbus-threads-internal.h" 2614cc7d28a8308060428bbc9b3dd357eaea3a4749John (J#include "dbus-list.h" 27a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 28a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Penningtonstatic DBusThreadFunctions thread_functions = 29a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington{ 30a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 0, 31fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson NULL, NULL, NULL, NULL, NULL, 3257ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J NULL, NULL, NULL, NULL, NULL, 33a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington NULL, NULL, NULL, NULL, 3457ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J 35a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington NULL, NULL, NULL, NULL 36a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington}; 37a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 38642335f681c26b78a1a0e2f2167d2f0e7beb6807John (Jstatic int thread_init_generation = 0; 39642335f681c26b78a1a0e2f2167d2f0e7beb6807John (J 4014cc7d28a8308060428bbc9b3dd357eaea3a4749John (Jstatic DBusList *uninitialized_mutex_list = NULL; 4114cc7d28a8308060428bbc9b3dd357eaea3a4749John (Jstatic DBusList *uninitialized_condvar_list = NULL; 4214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 4396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington/** This is used for the no-op default mutex pointer, just to be distinct from #NULL */ 44bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington#define _DBUS_DUMMY_MUTEX ((DBusMutex*)0xABCDEF) 4596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 46fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** This is used for the no-op default mutex pointer, just to be distinct from #NULL */ 47bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington#define _DBUS_DUMMY_CONDVAR ((DBusCondVar*)0xABCDEF2) 48fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 49a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/** 50cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * @defgroup DBusThreadsInternals Thread functions 51cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * @ingroup DBusInternals 52cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * @brief _dbus_mutex_lock(), etc. 53a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 54a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Functions and macros related to threads and thread locks. 55a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 56a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * @{ 57a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 58a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 59a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/** 60a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Creates a new mutex using the function supplied to dbus_threads_init(), 61a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * or creates a no-op mutex if threads are not initialized. 62a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * May return #NULL even if threads are initialized, indicating 63a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * out-of-memory. 64a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 65a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * @returns new mutex or #NULL 66a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 67a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc PenningtonDBusMutex* 68cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_mutex_new (void) 69a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington{ 7057ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J if (thread_functions.recursive_mutex_new) 7157ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J return (* thread_functions.recursive_mutex_new) (); 7257ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J else if (thread_functions.mutex_new) 73a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington return (* thread_functions.mutex_new) (); 74a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington else 75bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return _DBUS_DUMMY_MUTEX; 76a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington} 77a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 78a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/** 7914cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * This does the same thing as _dbus_mutex_new. It however 8014cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * gives another level of indirection by allocating a pointer 8114cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * to point to the mutex location. This allows the threading 8214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * module to swap out dummy mutexes for real a real mutex so libraries 8314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * can initialize threads even after the D-Bus API has been used. 8414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * 8514cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * @param location_p the location of the new mutex, can return #NULL on OOM 8614cc7d28a8308060428bbc9b3dd357eaea3a4749John (J */ 8714cc7d28a8308060428bbc9b3dd357eaea3a4749John (Jvoid 8814cc7d28a8308060428bbc9b3dd357eaea3a4749John (J_dbus_mutex_new_at_location (DBusMutex **location_p) 8914cc7d28a8308060428bbc9b3dd357eaea3a4749John (J{ 9014cc7d28a8308060428bbc9b3dd357eaea3a4749John (J _dbus_assert (location_p != NULL); 9114cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 9214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J *location_p = _dbus_mutex_new(); 9314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 9414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J if (thread_init_generation != _dbus_current_generation && *location_p) 9514cc7d28a8308060428bbc9b3dd357eaea3a4749John (J { 9614cc7d28a8308060428bbc9b3dd357eaea3a4749John (J if (!_dbus_list_append (&uninitialized_mutex_list, location_p)) 9714cc7d28a8308060428bbc9b3dd357eaea3a4749John (J { 9814cc7d28a8308060428bbc9b3dd357eaea3a4749John (J _dbus_mutex_free (*location_p); 9914cc7d28a8308060428bbc9b3dd357eaea3a4749John (J *location_p = NULL; 10014cc7d28a8308060428bbc9b3dd357eaea3a4749John (J } 10114cc7d28a8308060428bbc9b3dd357eaea3a4749John (J } 10214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J} 10314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 10414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J/** 105a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Frees a mutex created with dbus_mutex_new(); does 106a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * nothing if passed a #NULL pointer. 107a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 108a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Penningtonvoid 109cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_mutex_free (DBusMutex *mutex) 110a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington{ 11157ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J if (mutex) 11257ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J { 11357ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J if (mutex && thread_functions.recursive_mutex_free) 11457ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J (* thread_functions.recursive_mutex_free) (mutex); 11557ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J else if (mutex && thread_functions.mutex_free) 11657ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J (* thread_functions.mutex_free) (mutex); 11757ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J } 118a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington} 119a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 120a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/** 12114cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * Frees a mutex and removes it from the 12214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * uninitialized_mutex_list; 12314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * does nothing if passed a #NULL pointer. 12414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J */ 12514cc7d28a8308060428bbc9b3dd357eaea3a4749John (Jvoid 12614cc7d28a8308060428bbc9b3dd357eaea3a4749John (J_dbus_mutex_free_at_location (DBusMutex **location_p) 12714cc7d28a8308060428bbc9b3dd357eaea3a4749John (J{ 12814cc7d28a8308060428bbc9b3dd357eaea3a4749John (J if (location_p) 12914cc7d28a8308060428bbc9b3dd357eaea3a4749John (J { 13014cc7d28a8308060428bbc9b3dd357eaea3a4749John (J if (thread_init_generation != _dbus_current_generation) 13114cc7d28a8308060428bbc9b3dd357eaea3a4749John (J _dbus_list_remove (&uninitialized_mutex_list, location_p); 13214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 13314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J _dbus_mutex_free (*location_p); 13414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J } 13514cc7d28a8308060428bbc9b3dd357eaea3a4749John (J} 13614cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 13714cc7d28a8308060428bbc9b3dd357eaea3a4749John (J/** 138a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Locks a mutex. Does nothing if passed a #NULL pointer. 13957ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J * Locks may be recursive if threading implementation initialized 14057ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J * recursive locks. 141a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 14257ab23491c8c80b4a1606ea3b72e179c1b742bb9John (Jvoid 143cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_mutex_lock (DBusMutex *mutex) 144a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington{ 14557ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J if (mutex) 14657ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J { 14757ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J if (thread_functions.recursive_mutex_lock) 14857ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J (* thread_functions.recursive_mutex_lock) (mutex); 14957ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J else if (thread_functions.mutex_lock) 15057ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J (* thread_functions.mutex_lock) (mutex); 15157ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J } 152a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington} 153a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 154a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/** 155a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Unlocks a mutex. Does nothing if passed a #NULL pointer. 156a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 157a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * @returns #TRUE on success 158a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 15957ab23491c8c80b4a1606ea3b72e179c1b742bb9John (Jvoid 160cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_mutex_unlock (DBusMutex *mutex) 161a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington{ 16257ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J if (mutex) 16357ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J { 16457ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J if (thread_functions.recursive_mutex_unlock) 16557ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J (* thread_functions.recursive_mutex_unlock) (mutex); 16657ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J else if (thread_functions.mutex_unlock) 16757ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J (* thread_functions.mutex_unlock) (mutex); 16857ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J } 169a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington} 170a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 171a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/** 172fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Creates a new condition variable using the function supplied 173fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * to dbus_threads_init(), or creates a no-op condition variable 174fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * if threads are not initialized. May return #NULL even if 175fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * threads are initialized, indicating out-of-memory. 176fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * 177fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * @returns new mutex or #NULL 178fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson */ 179fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander LarssonDBusCondVar * 180cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_condvar_new (void) 181fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 182fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson if (thread_functions.condvar_new) 183fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson return (* thread_functions.condvar_new) (); 184fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson else 185bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return _DBUS_DUMMY_CONDVAR; 186fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 187fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 18814cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 18914cc7d28a8308060428bbc9b3dd357eaea3a4749John (J/** 19014cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * This does the same thing as _dbus_condvar_new. It however 19114cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * gives another level of indirection by allocating a pointer 19214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * to point to the condvar location. This allows the threading 19314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * module to swap out dummy condvars for real a real condvar so libraries 19414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * can initialize threads even after the D-Bus API has been used. 19514cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * 19614cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * @returns the location of a new condvar or #NULL on OOM 19714cc7d28a8308060428bbc9b3dd357eaea3a4749John (J */ 19814cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 19914cc7d28a8308060428bbc9b3dd357eaea3a4749John (Jvoid 20014cc7d28a8308060428bbc9b3dd357eaea3a4749John (J_dbus_condvar_new_at_location (DBusCondVar **location_p) 20114cc7d28a8308060428bbc9b3dd357eaea3a4749John (J{ 20214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J *location_p = _dbus_condvar_new(); 20314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 20414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J if (thread_init_generation != _dbus_current_generation && *location_p) 20514cc7d28a8308060428bbc9b3dd357eaea3a4749John (J { 20614cc7d28a8308060428bbc9b3dd357eaea3a4749John (J if (!_dbus_list_append (&uninitialized_condvar_list, location_p)) 20714cc7d28a8308060428bbc9b3dd357eaea3a4749John (J { 20814cc7d28a8308060428bbc9b3dd357eaea3a4749John (J _dbus_condvar_free (*location_p); 20914cc7d28a8308060428bbc9b3dd357eaea3a4749John (J *location_p = NULL; 21014cc7d28a8308060428bbc9b3dd357eaea3a4749John (J } 21114cc7d28a8308060428bbc9b3dd357eaea3a4749John (J } 21214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J} 21314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 21414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 215fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** 216fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Frees a conditional variable created with dbus_condvar_new(); does 217fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * nothing if passed a #NULL pointer. 218fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson */ 219fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid 220cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_condvar_free (DBusCondVar *cond) 221fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 222fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson if (cond && thread_functions.condvar_free) 223fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson (* thread_functions.condvar_free) (cond); 224fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 225fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 226fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** 22714cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * Frees a conditional variable and removes it from the 22814cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * uninitialized_condvar_list; 22914cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * does nothing if passed a #NULL pointer. 23014cc7d28a8308060428bbc9b3dd357eaea3a4749John (J */ 23114cc7d28a8308060428bbc9b3dd357eaea3a4749John (Jvoid 23214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J_dbus_condvar_free_at_location (DBusCondVar **location_p) 23314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J{ 23414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J if (location_p) 23514cc7d28a8308060428bbc9b3dd357eaea3a4749John (J { 23614cc7d28a8308060428bbc9b3dd357eaea3a4749John (J if (thread_init_generation != _dbus_current_generation) 23714cc7d28a8308060428bbc9b3dd357eaea3a4749John (J _dbus_list_remove (&uninitialized_condvar_list, location_p); 23814cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 23914cc7d28a8308060428bbc9b3dd357eaea3a4749John (J _dbus_condvar_free (*location_p); 24014cc7d28a8308060428bbc9b3dd357eaea3a4749John (J } 24114cc7d28a8308060428bbc9b3dd357eaea3a4749John (J} 24214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 24314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J/** 244fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Atomically unlocks the mutex and waits for the conditions 245fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * variable to be signalled. Locks the mutex again before 246fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * returning. 247fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Does nothing if passed a #NULL pointer. 248fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson */ 249fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid 250cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_condvar_wait (DBusCondVar *cond, 251cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington DBusMutex *mutex) 252fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 253fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson if (cond && mutex && thread_functions.condvar_wait) 254fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson (* thread_functions.condvar_wait) (cond, mutex); 255fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 256fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 257fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** 2585886f5326da2dbe8f1a7c97736d544fa4cef169bHavoc Pennington * Atomically unlocks the mutex and waits for the conditions variable 2595886f5326da2dbe8f1a7c97736d544fa4cef169bHavoc Pennington * to be signalled, or for a timeout. Locks the mutex again before 2605886f5326da2dbe8f1a7c97736d544fa4cef169bHavoc Pennington * returning. Does nothing if passed a #NULL pointer. Return value 2615886f5326da2dbe8f1a7c97736d544fa4cef169bHavoc Pennington * is #FALSE if we timed out, #TRUE otherwise. 262fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * 263c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington * @param cond the condition variable 264c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington * @param mutex the mutex 265fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * @param timeout_milliseconds the maximum time to wait 2665886f5326da2dbe8f1a7c97736d544fa4cef169bHavoc Pennington * @returns #FALSE if the timeout occurred, #TRUE if not 267fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson */ 268fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssondbus_bool_t 269cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_condvar_wait_timeout (DBusCondVar *cond, 270cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington DBusMutex *mutex, 271cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington int timeout_milliseconds) 272fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 273fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson if (cond && mutex && thread_functions.condvar_wait) 274fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson return (* thread_functions.condvar_wait_timeout) (cond, mutex, timeout_milliseconds); 275fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson else 276bf07fc88a330061c59186bf4a11218b5d51aec6fAnders Carlsson return TRUE; 277fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 278fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 279fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** 280fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * If there are threads waiting on the condition variable, wake 281fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * up exactly one. 282fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Does nothing if passed a #NULL pointer. 283fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson */ 284fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid 285cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_condvar_wake_one (DBusCondVar *cond) 286fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 287fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson if (cond && thread_functions.condvar_wake_one) 288fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson (* thread_functions.condvar_wake_one) (cond); 289fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 290fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 291fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** 292fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * If there are threads waiting on the condition variable, wake 293fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * up all of them. 294fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Does nothing if passed a #NULL pointer. 295fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson */ 296fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid 297cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_condvar_wake_all (DBusCondVar *cond) 298fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 299fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson if (cond && thread_functions.condvar_wake_all) 300fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson (* thread_functions.condvar_wake_all) (cond); 301fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 302fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 303c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtonstatic void 304c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtonshutdown_global_locks (void *data) 305c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington{ 306c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington DBusMutex ***locks = data; 307c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington int i; 308c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 309c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington i = 0; 310c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington while (i < _DBUS_N_GLOBAL_LOCKS) 311c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington { 312cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington _dbus_mutex_free (*(locks[i])); 313c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington *(locks[i]) = NULL; 314c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington ++i; 315c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington } 316c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 317c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dbus_free (locks); 318c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington} 319c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 32014cc7d28a8308060428bbc9b3dd357eaea3a4749John (Jstatic void 32114cc7d28a8308060428bbc9b3dd357eaea3a4749John (Jshutdown_uninitialized_locks (void *data) 32214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J{ 32314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J _dbus_list_clear (&uninitialized_mutex_list); 32414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J _dbus_list_clear (&uninitialized_condvar_list); 32514cc7d28a8308060428bbc9b3dd357eaea3a4749John (J} 32614cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 327fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonstatic dbus_bool_t 32814cc7d28a8308060428bbc9b3dd357eaea3a4749John (Jinit_uninitialized_locks (void) 32914cc7d28a8308060428bbc9b3dd357eaea3a4749John (J{ 33014cc7d28a8308060428bbc9b3dd357eaea3a4749John (J DBusList *link; 33114cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 3322a78603b0e50a586e51faaf703229b6038e7e404David Zeuthen _dbus_assert (thread_init_generation != _dbus_current_generation); 33314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 33414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J link = uninitialized_mutex_list; 33514cc7d28a8308060428bbc9b3dd357eaea3a4749John (J while (link != NULL) 33614cc7d28a8308060428bbc9b3dd357eaea3a4749John (J { 33714cc7d28a8308060428bbc9b3dd357eaea3a4749John (J DBusMutex **mp; 33814cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 33914cc7d28a8308060428bbc9b3dd357eaea3a4749John (J mp = (DBusMutex **)link->data; 34014cc7d28a8308060428bbc9b3dd357eaea3a4749John (J _dbus_assert (*mp == _DBUS_DUMMY_MUTEX); 34114cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 34214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J *mp = _dbus_mutex_new (); 34314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J if (*mp == NULL) 34414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J goto fail_mutex; 34514cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 34614cc7d28a8308060428bbc9b3dd357eaea3a4749John (J link = _dbus_list_get_next_link (&uninitialized_mutex_list, link); 34714cc7d28a8308060428bbc9b3dd357eaea3a4749John (J } 34814cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 34914cc7d28a8308060428bbc9b3dd357eaea3a4749John (J link = uninitialized_condvar_list; 35014cc7d28a8308060428bbc9b3dd357eaea3a4749John (J while (link != NULL) 35114cc7d28a8308060428bbc9b3dd357eaea3a4749John (J { 35214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J DBusCondVar **cp; 35314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 35414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J cp = (DBusCondVar **)link->data; 35514cc7d28a8308060428bbc9b3dd357eaea3a4749John (J _dbus_assert (*cp == _DBUS_DUMMY_CONDVAR); 35614cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 35714cc7d28a8308060428bbc9b3dd357eaea3a4749John (J *cp = _dbus_condvar_new (); 35814cc7d28a8308060428bbc9b3dd357eaea3a4749John (J if (*cp == NULL) 35914cc7d28a8308060428bbc9b3dd357eaea3a4749John (J goto fail_condvar; 36014cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 36114cc7d28a8308060428bbc9b3dd357eaea3a4749John (J link = _dbus_list_get_next_link (&uninitialized_condvar_list, link); 36214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J } 36314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 36414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J _dbus_list_clear (&uninitialized_mutex_list); 36514cc7d28a8308060428bbc9b3dd357eaea3a4749John (J _dbus_list_clear (&uninitialized_condvar_list); 36614cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 36714cc7d28a8308060428bbc9b3dd357eaea3a4749John (J if (!_dbus_register_shutdown_func (shutdown_uninitialized_locks, 36814cc7d28a8308060428bbc9b3dd357eaea3a4749John (J NULL)) 36914cc7d28a8308060428bbc9b3dd357eaea3a4749John (J goto fail_condvar; 37014cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 37114cc7d28a8308060428bbc9b3dd357eaea3a4749John (J return TRUE; 37214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 37314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J fail_condvar: 37414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J link = uninitialized_condvar_list; 37514cc7d28a8308060428bbc9b3dd357eaea3a4749John (J while (link != NULL) 37614cc7d28a8308060428bbc9b3dd357eaea3a4749John (J { 37714cc7d28a8308060428bbc9b3dd357eaea3a4749John (J DBusCondVar **cp; 37814cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 37914cc7d28a8308060428bbc9b3dd357eaea3a4749John (J cp = (DBusCondVar **)link->data; 38014cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 38114cc7d28a8308060428bbc9b3dd357eaea3a4749John (J if (*cp != _DBUS_DUMMY_CONDVAR) 38214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J _dbus_condvar_free (*cp); 38314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J else 38414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J break; 38514cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 38614cc7d28a8308060428bbc9b3dd357eaea3a4749John (J *cp = _DBUS_DUMMY_CONDVAR; 38714cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 38814cc7d28a8308060428bbc9b3dd357eaea3a4749John (J link = _dbus_list_get_next_link (&uninitialized_condvar_list, link); 38914cc7d28a8308060428bbc9b3dd357eaea3a4749John (J } 39014cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 39114cc7d28a8308060428bbc9b3dd357eaea3a4749John (J fail_mutex: 39214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J link = uninitialized_mutex_list; 39314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J while (link != NULL) 39414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J { 39514cc7d28a8308060428bbc9b3dd357eaea3a4749John (J DBusMutex **mp; 39614cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 39714cc7d28a8308060428bbc9b3dd357eaea3a4749John (J mp = (DBusMutex **)link->data; 39814cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 39914cc7d28a8308060428bbc9b3dd357eaea3a4749John (J if (*mp != _DBUS_DUMMY_MUTEX) 40014cc7d28a8308060428bbc9b3dd357eaea3a4749John (J _dbus_mutex_free (*mp); 40114cc7d28a8308060428bbc9b3dd357eaea3a4749John (J else 40214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J break; 40314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 40414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J *mp = _DBUS_DUMMY_MUTEX; 40514cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 40614cc7d28a8308060428bbc9b3dd357eaea3a4749John (J link = _dbus_list_get_next_link (&uninitialized_mutex_list, link); 40714cc7d28a8308060428bbc9b3dd357eaea3a4749John (J } 40814cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 40914cc7d28a8308060428bbc9b3dd357eaea3a4749John (J return FALSE; 41014cc7d28a8308060428bbc9b3dd357eaea3a4749John (J} 41114cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 41214cc7d28a8308060428bbc9b3dd357eaea3a4749John (Jstatic dbus_bool_t 41314cc7d28a8308060428bbc9b3dd357eaea3a4749John (Jinit_locks (void) 414fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 415fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson int i; 416c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington DBusMutex ***dynamic_global_locks; 417fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 418c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington DBusMutex **global_locks[] = { 419c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#define LOCK_ADDR(name) (& _dbus_lock_##name) 4207cd52919443f190fa1601a3d1bac5c8ce8d9ecc1John (J LOCK_ADDR (win_fds), 4217cd52919443f190fa1601a3d1bac5c8ce8d9ecc1John (J LOCK_ADDR (sid_atom_cache), 422c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington LOCK_ADDR (list), 423c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington LOCK_ADDR (connection_slots), 424583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington LOCK_ADDR (pending_call_slots), 425c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington LOCK_ADDR (server_slots), 426958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington LOCK_ADDR (message_slots), 4279293e823767daee79386cc797510808f4eed01a3Lennart Poettering#if !DBUS_USE_SYNC 428c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington LOCK_ADDR (atomic), 4299293e823767daee79386cc797510808f4eed01a3Lennart Poettering#endif 430bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington LOCK_ADDR (bus), 431eaefe03a8891b84e3f9e1f99f9098d65567e3092Havoc Pennington LOCK_ADDR (bus_datas), 43288cd5da3c0ec86fed29942b062c2f7bf0f8fda44Havoc Pennington LOCK_ADDR (shutdown_funcs), 4337fc350740c64ebd095615b8384de0bce0b4d8074Havoc Pennington LOCK_ADDR (system_users), 434ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington LOCK_ADDR (message_cache), 435d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington LOCK_ADDR (shared_connections), 436d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington LOCK_ADDR (machine_uuid) 437c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#undef LOCK_ADDR 438fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson }; 439c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 440c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington _dbus_assert (_DBUS_N_ELEMENTS (global_locks) == 441c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington _DBUS_N_GLOBAL_LOCKS); 442c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 443c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington i = 0; 444fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 445c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dynamic_global_locks = dbus_new (DBusMutex**, _DBUS_N_GLOBAL_LOCKS); 446c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington if (dynamic_global_locks == NULL) 447c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington goto failed; 448c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 449c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington while (i < _DBUS_N_ELEMENTS (global_locks)) 450fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson { 451cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington *global_locks[i] = _dbus_mutex_new (); 452fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 453c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington if (*global_locks[i] == NULL) 454c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington goto failed; 455c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 456c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dynamic_global_locks[i] = global_locks[i]; 457c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 458c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington ++i; 459fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson } 460c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 461c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington if (!_dbus_register_shutdown_func (shutdown_global_locks, 462c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dynamic_global_locks)) 463c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington goto failed; 46414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 46514cc7d28a8308060428bbc9b3dd357eaea3a4749John (J if (!init_uninitialized_locks ()) 46614cc7d28a8308060428bbc9b3dd357eaea3a4749John (J goto failed; 467c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 468fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson return TRUE; 469c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 470c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington failed: 471c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dbus_free (dynamic_global_locks); 472c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 473c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington for (i = i - 1; i >= 0; i--) 474c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington { 475cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington _dbus_mutex_free (*global_locks[i]); 476c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington *global_locks[i] = NULL; 477c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington } 478c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington return FALSE; 479fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 480fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 481cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington/** @} */ /* end of internals */ 482cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington 483cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington/** 484cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * @defgroup DBusThreads Thread functions 485cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * @ingroup DBus 486ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @brief dbus_threads_init() and dbus_threads_init_default() 487cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * 488cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * Functions and macros related to threads and thread locks. 489cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * 490ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * If threads are initialized, the D-Bus library has locks on all 491ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * global data structures. In addition, each #DBusConnection has a 492ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * lock, so only one thread at a time can touch the connection. (See 493ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @ref DBusConnection for more on connection locking.) 494ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * 495ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * Most other objects, however, do not have locks - they can only be 496ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * used from a single thread at a time, unless you lock them yourself. 497ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * For example, a #DBusMessage can't be modified from two threads 498ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * at once. 499ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * 500cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * @{ 501cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington */ 502fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 503fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** 504cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * 50558a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * Initializes threads. If this function is not called, the D-Bus 50658a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * library will not lock any data structures. If it is called, D-Bus 50758a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * will do locking, at some cost in efficiency. Note that this 50858a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * function must be called BEFORE the second thread is started. 509a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 51058a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * Almost always, you should use dbus_threads_init_default() instead. 51158a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * The raw dbus_threads_init() is only useful if you require a 51258a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * particular thread implementation for some reason. 513642335f681c26b78a1a0e2f2167d2f0e7beb6807John (J * 51458a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * A possible reason to use dbus_threads_init() rather than 51558a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * dbus_threads_init_default() is to insert debugging checks or print 51658a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * statements. 51796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * 51858a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * dbus_threads_init() may be called more than once. The first one 51958a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * wins and subsequent calls are ignored. (Unless you use 52058a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * dbus_shutdown() to reset libdbus, which will let you re-init 52158a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * threads.) 52258a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * 52358a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * Either recursive or nonrecursive mutex functions must be specified, 52458a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * but not both. New code should provide only the recursive functions 52558a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * - specifying the nonrecursive ones is deprecated. 52658a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * 52758a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * Because this function effectively sets global state, all code 52858a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * running in a given application must agree on the thread 52958a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * implementation. Most code won't care which thread implementation is 53058a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * used, so there's no problem. However, usually libraries should not 53158a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * call dbus_threads_init() or dbus_threads_init_default(), instead 53258a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * leaving this policy choice to applications. 53358a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * 53458a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * The exception is for application frameworks (GLib, Qt, etc.) and 53558a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * D-Bus bindings based on application frameworks. These frameworks 53658a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * define a cross-platform thread abstraction and can assume 53758a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * applications using the framework are OK with using that thread 53858a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * abstraction. 53958a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * 54058a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * However, even these app frameworks may find it easier to simply call 54158a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * dbus_threads_init_default(), and there's no reason they shouldn't. 54258a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * 543a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * @param functions functions for using threads 54496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * @returns #TRUE on success, #FALSE if no memory 545a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 54696a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtondbus_bool_t 547a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Penningtondbus_threads_init (const DBusThreadFunctions *functions) 548a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington{ 54957ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J dbus_bool_t mutex_set; 55057ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J dbus_bool_t recursive_mutex_set; 55157ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J 552a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert (functions != NULL); 553a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 554a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington /* these base functions are required. Future additions to 555a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * DBusThreadFunctions may be optional. 556a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 557fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_NEW_MASK); 558fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_FREE_MASK); 559fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_MASK); 560fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_TIMEOUT_MASK); 561fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ONE_MASK); 562fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ALL_MASK); 563fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_new != NULL); 564fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_free != NULL); 565fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_wait != NULL); 566fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_wait_timeout != NULL); 567fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_wake_one != NULL); 568fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_wake_all != NULL); 569a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 57057ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J /* Either the mutex function set or recursive mutex set needs 57157ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J * to be available but not both 57257ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J */ 57357ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J mutex_set = (functions->mask & DBUS_THREAD_FUNCTIONS_MUTEX_NEW_MASK) && 57457ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J (functions->mask & DBUS_THREAD_FUNCTIONS_MUTEX_FREE_MASK) && 57557ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J (functions->mask & DBUS_THREAD_FUNCTIONS_MUTEX_LOCK_MASK) && 57657ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J (functions->mask & DBUS_THREAD_FUNCTIONS_MUTEX_UNLOCK_MASK) && 57757ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J functions->mutex_new && 57857ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J functions->mutex_free && 57957ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J functions->mutex_lock && 58057ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J functions->mutex_unlock; 58157ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J 58257ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J recursive_mutex_set = 58357ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J (functions->mask & DBUS_THREAD_FUNCTIONS_RECURSIVE_MUTEX_NEW_MASK) && 58457ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J (functions->mask & DBUS_THREAD_FUNCTIONS_RECURSIVE_MUTEX_FREE_MASK) && 58557ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J (functions->mask & DBUS_THREAD_FUNCTIONS_RECURSIVE_MUTEX_LOCK_MASK) && 58657ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J (functions->mask & DBUS_THREAD_FUNCTIONS_RECURSIVE_MUTEX_UNLOCK_MASK) && 58757ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J functions->recursive_mutex_new && 58857ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J functions->recursive_mutex_free && 58957ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J functions->recursive_mutex_lock && 59057ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J functions->recursive_mutex_unlock; 59157ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J 59257ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J if (!(mutex_set || recursive_mutex_set)) 59357ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J _dbus_assert_not_reached ("Either the nonrecusrive or recursive mutex " 59457ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J "functions sets should be passed into " 59557ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J "dbus_threads_init. Neither sets were passed."); 59657ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J 59757ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J if (mutex_set && recursive_mutex_set) 59857ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J _dbus_assert_not_reached ("Either the nonrecusrive or recursive mutex " 59957ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J "functions sets should be passed into " 60057ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J "dbus_threads_init. Both sets were passed. " 60157ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J "You most likely just want to set the recursive " 60257ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J "mutex functions to avoid deadlocks in D-Bus."); 60357ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J 604a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington /* Check that all bits in the mask actually are valid mask bits. 605a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * ensures people won't write code that breaks when we add 606a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * new bits. 607a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 608a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert ((functions->mask & ~DBUS_THREAD_FUNCTIONS_ALL_MASK) == 0); 609c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 610c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington if (thread_init_generation != _dbus_current_generation) 611c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington thread_functions.mask = 0; /* allow re-init in new generation */ 61214cc7d28a8308060428bbc9b3dd357eaea3a4749John (J 61314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J /* Silently allow multiple init 61414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J * First init wins and D-Bus will always use its threading system 61514cc7d28a8308060428bbc9b3dd357eaea3a4749John (J */ 616a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington if (thread_functions.mask != 0) 61714cc7d28a8308060428bbc9b3dd357eaea3a4749John (J return TRUE; 618a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 619a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington thread_functions.mutex_new = functions->mutex_new; 620a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington thread_functions.mutex_free = functions->mutex_free; 621a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington thread_functions.mutex_lock = functions->mutex_lock; 622a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington thread_functions.mutex_unlock = functions->mutex_unlock; 623a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 624fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_new = functions->condvar_new; 625fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_free = functions->condvar_free; 626fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_wait = functions->condvar_wait; 627fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_wait_timeout = functions->condvar_wait_timeout; 628fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_wake_one = functions->condvar_wake_one; 629fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_wake_all = functions->condvar_wake_all; 63057ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J 63157ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J if (functions->mask & DBUS_THREAD_FUNCTIONS_RECURSIVE_MUTEX_NEW_MASK) 63257ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J thread_functions.recursive_mutex_new = functions->recursive_mutex_new; 63396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 63457ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J if (functions->mask & DBUS_THREAD_FUNCTIONS_RECURSIVE_MUTEX_FREE_MASK) 63557ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J thread_functions.recursive_mutex_free = functions->recursive_mutex_free; 63657ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J 63757ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J if (functions->mask & DBUS_THREAD_FUNCTIONS_RECURSIVE_MUTEX_LOCK_MASK) 63857ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J thread_functions.recursive_mutex_lock = functions->recursive_mutex_lock; 63957ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J 64057ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J if (functions->mask & DBUS_THREAD_FUNCTIONS_RECURSIVE_MUTEX_UNLOCK_MASK) 64157ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J thread_functions.recursive_mutex_unlock = functions->recursive_mutex_unlock; 64257ab23491c8c80b4a1606ea3b72e179c1b742bb9John (J 643fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.mask = functions->mask; 64496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 64514cc7d28a8308060428bbc9b3dd357eaea3a4749John (J if (!init_locks ()) 64696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 647c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 648c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington thread_init_generation = _dbus_current_generation; 64996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 650fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson return TRUE; 651a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington} 652a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 653642335f681c26b78a1a0e2f2167d2f0e7beb6807John (J 654642335f681c26b78a1a0e2f2167d2f0e7beb6807John (J 655642335f681c26b78a1a0e2f2167d2f0e7beb6807John (J/* Default thread implemenation */ 656642335f681c26b78a1a0e2f2167d2f0e7beb6807John (J 657642335f681c26b78a1a0e2f2167d2f0e7beb6807John (J/** 658642335f681c26b78a1a0e2f2167d2f0e7beb6807John (J * 659ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * Calls dbus_threads_init() with a default set of 660ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * #DBusThreadFunctions appropriate for the platform. 661642335f681c26b78a1a0e2f2167d2f0e7beb6807John (J * 66258a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * Most applications should use this rather than dbus_threads_init(). 66358a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * 66458a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * It's safe to call dbus_threads_init_default() as many times as you 66558a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * want, but only the first time will have an effect. 66658a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * 66758a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * dbus_shutdown() reverses the effects of this function when it 66858a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * resets all global state in libdbus. 66958a0d2759aedc854ccac78d7252f117662734142Havoc Pennington * 670ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @returns #TRUE on success, #FALSE if not enough memory 671642335f681c26b78a1a0e2f2167d2f0e7beb6807John (J */ 672642335f681c26b78a1a0e2f2167d2f0e7beb6807John (Jdbus_bool_t 673642335f681c26b78a1a0e2f2167d2f0e7beb6807John (Jdbus_threads_init_default (void) 674642335f681c26b78a1a0e2f2167d2f0e7beb6807John (J{ 6755886f5326da2dbe8f1a7c97736d544fa4cef169bHavoc Pennington return _dbus_threads_init_platform_specific (); 676642335f681c26b78a1a0e2f2167d2f0e7beb6807John (J} 677642335f681c26b78a1a0e2f2167d2f0e7beb6807John (J 678642335f681c26b78a1a0e2f2167d2f0e7beb6807John (J 679a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington/** @} */ 680bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 681bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington#ifdef DBUS_BUILD_TESTS 682bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington/** Fake mutex used for debugging */ 683bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtontypedef struct DBusFakeMutex DBusFakeMutex; 684bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington/** Fake mutex used for debugging */ 685bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstruct DBusFakeMutex 686bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 687bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_bool_t locked; /**< Mutex is "locked" */ 688bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington}; 689bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 690bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic DBusMutex * dbus_fake_mutex_new (void); 691bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_mutex_free (DBusMutex *mutex); 692bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t dbus_fake_mutex_lock (DBusMutex *mutex); 693bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t dbus_fake_mutex_unlock (DBusMutex *mutex); 694bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic DBusCondVar* dbus_fake_condvar_new (void); 695bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_condvar_free (DBusCondVar *cond); 696bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_condvar_wait (DBusCondVar *cond, 697bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusMutex *mutex); 698bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t dbus_fake_condvar_wait_timeout (DBusCondVar *cond, 699bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusMutex *mutex, 700bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington int timeout_msec); 701bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_condvar_wake_one (DBusCondVar *cond); 702bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_condvar_wake_all (DBusCondVar *cond); 703bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 704bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 705bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic const DBusThreadFunctions fake_functions = 706bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 707bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_MUTEX_NEW_MASK | 708bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_MUTEX_FREE_MASK | 709bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_MUTEX_LOCK_MASK | 710bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_MUTEX_UNLOCK_MASK | 711bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_NEW_MASK | 712bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_FREE_MASK | 713bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_MASK | 714bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_TIMEOUT_MASK | 715bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ONE_MASK| 716bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ALL_MASK, 717bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_mutex_new, 718bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_mutex_free, 719bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_mutex_lock, 720bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_mutex_unlock, 721bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_new, 722bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_free, 723bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_wait, 724bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_wait_timeout, 725bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_wake_one, 726bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_wake_all 727bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington}; 728bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 729bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic DBusMutex * 730bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_mutex_new (void) 731bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 732bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusFakeMutex *mutex; 733bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 734bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington mutex = dbus_new0 (DBusFakeMutex, 1); 735bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 736bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return (DBusMutex *)mutex; 737bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 738bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 739bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 740bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_mutex_free (DBusMutex *mutex) 741bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 742bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusFakeMutex *fake = (DBusFakeMutex*) mutex; 743bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 744bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington _dbus_assert (!fake->locked); 745bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 746bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_free (fake); 747bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 748bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 749bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t 750bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_mutex_lock (DBusMutex *mutex) 751bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 752bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusFakeMutex *fake = (DBusFakeMutex*) mutex; 753bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 754bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington _dbus_assert (!fake->locked); 755bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 756bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington fake->locked = TRUE; 757bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 758bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return TRUE; 759bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 760bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 761bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t 762bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_mutex_unlock (DBusMutex *mutex) 763bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 764bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusFakeMutex *fake = (DBusFakeMutex*) mutex; 765bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 766bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington _dbus_assert (fake->locked); 767bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 768bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington fake->locked = FALSE; 769bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 770bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return TRUE; 771bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 772bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 773bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic DBusCondVar* 774bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_new (void) 775bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 776bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return (DBusCondVar*) _dbus_strdup ("FakeCondvar"); 777bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 778bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 779bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 780bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_free (DBusCondVar *cond) 781bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 782bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_free (cond); 783bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 784bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 785bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 786bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_wait (DBusCondVar *cond, 787ab10ae902d8aa7c2b98fd080a7458127b1b8e648Havoc Pennington DBusMutex *mutex) 788bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 789bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 790bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 791bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 792bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t 793bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_wait_timeout (DBusCondVar *cond, 794bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusMutex *mutex, 795bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington int timeout_msec) 796bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 797bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return TRUE; 798bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 799bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 800bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 801bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_wake_one (DBusCondVar *cond) 802bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 803bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 804bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 805bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 806bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 807bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_wake_all (DBusCondVar *cond) 808bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 809bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 810bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 811bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 812bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_bool_t 813bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington_dbus_threads_init_debug (void) 814bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 8157c62f972f3280f5a31b0d2635e2e5cc9fcc12c0ePeter Kümmel#ifdef DBUS_WIN 8167c62f972f3280f5a31b0d2635e2e5cc9fcc12c0ePeter Kümmel return _dbus_threads_init_platform_specific(); 8177c62f972f3280f5a31b0d2635e2e5cc9fcc12c0ePeter Kümmel#else 818bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return dbus_threads_init (&fake_functions); 8197c62f972f3280f5a31b0d2635e2e5cc9fcc12c0ePeter Kümmel#endif 820bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 821bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 822bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington#endif /* DBUS_BUILD_TESTS */ 823