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