dbus-threads.c revision 88cd5da3c0ec86fed29942b062c2f7bf0f8fda44
1a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/* -*- mode: C; c-file-style: "gnu" -*- */ 2a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/* dbus-threads.h D-BUS threads handling 3a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 4bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington * Copyright (C) 2002, 2003 Red Hat Inc. 5a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 6a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Licensed under the Academic Free License version 1.2 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 20a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 22a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 23a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington#include "dbus-threads.h" 24a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington#include "dbus-internals.h" 25a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 26a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Penningtonstatic DBusThreadFunctions thread_functions = 27a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington{ 28a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 0, 29a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington NULL, NULL, NULL, NULL, 30fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson NULL, NULL, NULL, NULL, NULL, 31a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 32a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington NULL, NULL, NULL, NULL, 33a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington NULL, NULL, NULL, NULL 34a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington}; 35c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtonstatic int thread_init_generation = 0; 36a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 3796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington/** This is used for the no-op default mutex pointer, just to be distinct from #NULL */ 38bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington#define _DBUS_DUMMY_MUTEX ((DBusMutex*)0xABCDEF) 3996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 40fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** This is used for the no-op default mutex pointer, just to be distinct from #NULL */ 41bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington#define _DBUS_DUMMY_CONDVAR ((DBusCondVar*)0xABCDEF2) 42fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 43a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/** 44a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * @defgroup DBusThreads Thread functions 45a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * @ingroup DBus 46a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * @brief dbus_threads_init(), dbus_mutex_lock(), etc. 47a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 48a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Functions and macros related to threads and thread locks. 49a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 50a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * @{ 51a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 52a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 53a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/** 54a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Creates a new mutex using the function supplied to dbus_threads_init(), 55a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * or creates a no-op mutex if threads are not initialized. 56a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * May return #NULL even if threads are initialized, indicating 57a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * out-of-memory. 58a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 59a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * @returns new mutex or #NULL 60a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 61a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc PenningtonDBusMutex* 62a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Penningtondbus_mutex_new (void) 63a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington{ 64a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington if (thread_functions.mutex_new) 65a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington return (* thread_functions.mutex_new) (); 66a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington else 67bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return _DBUS_DUMMY_MUTEX; 68a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington} 69a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 70a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/** 71a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Frees a mutex created with dbus_mutex_new(); does 72a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * nothing if passed a #NULL pointer. 73a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 74a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Penningtonvoid 75a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Penningtondbus_mutex_free (DBusMutex *mutex) 76a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington{ 77a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington if (mutex && thread_functions.mutex_free) 78a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington (* thread_functions.mutex_free) (mutex); 79a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington} 80a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 81a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/** 82a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Locks a mutex. Does nothing if passed a #NULL pointer. 83a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Locks are not recursive. 84a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 85a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * @returns #TRUE on success 86a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 87a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Penningtondbus_bool_t 88a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Penningtondbus_mutex_lock (DBusMutex *mutex) 89a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington{ 90a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington if (mutex && thread_functions.mutex_lock) 91a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington return (* thread_functions.mutex_lock) (mutex); 92a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington else 93a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington return TRUE; 94a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington} 95a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 96a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/** 97a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Unlocks a mutex. Does nothing if passed a #NULL pointer. 98a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 99a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * @returns #TRUE on success 100a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 101a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Penningtondbus_bool_t 102a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Penningtondbus_mutex_unlock (DBusMutex *mutex) 103a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington{ 104a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington if (mutex && thread_functions.mutex_unlock) 105a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington return (* thread_functions.mutex_unlock) (mutex); 106a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington else 107a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington return TRUE; 108a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington} 109a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 110a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/** 111fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Creates a new condition variable using the function supplied 112fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * to dbus_threads_init(), or creates a no-op condition variable 113fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * if threads are not initialized. May return #NULL even if 114fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * threads are initialized, indicating out-of-memory. 115fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * 116fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * @returns new mutex or #NULL 117fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson */ 118fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander LarssonDBusCondVar * 119fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssondbus_condvar_new (void) 120fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 121fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson if (thread_functions.condvar_new) 122fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson return (* thread_functions.condvar_new) (); 123fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson else 124bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return _DBUS_DUMMY_CONDVAR; 125fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 126fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 127fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** 128fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Frees a conditional variable created with dbus_condvar_new(); does 129fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * nothing if passed a #NULL pointer. 130fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson */ 131fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid 132fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssondbus_condvar_free (DBusCondVar *cond) 133fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 134fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson if (cond && thread_functions.condvar_free) 135fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson (* thread_functions.condvar_free) (cond); 136fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 137fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 138fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** 139fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Atomically unlocks the mutex and waits for the conditions 140fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * variable to be signalled. Locks the mutex again before 141fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * returning. 142fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Does nothing if passed a #NULL pointer. 143fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson */ 144fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid 145fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssondbus_condvar_wait (DBusCondVar *cond, 146fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson DBusMutex *mutex) 147fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 148fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson if (cond && mutex && thread_functions.condvar_wait) 149fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson (* thread_functions.condvar_wait) (cond, mutex); 150fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 151fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 152fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** 153fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Atomically unlocks the mutex and waits for the conditions 154fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * variable to be signalled, or for a timeout. Locks the 155fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * mutex again before returning. 156fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Does nothing if passed a #NULL pointer. 157fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * 158c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington * @param cond the condition variable 159c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington * @param mutex the mutex 160fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * @param timeout_milliseconds the maximum time to wait 161fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * @returns TRUE if the condition was reached, or FALSE if the 162fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * timeout was reached. 163fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson */ 164fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssondbus_bool_t 165fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssondbus_condvar_wait_timeout (DBusCondVar *cond, 166fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson DBusMutex *mutex, 167fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson int timeout_milliseconds) 168fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 169fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson if (cond && mutex && thread_functions.condvar_wait) 170fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson return (* thread_functions.condvar_wait_timeout) (cond, mutex, timeout_milliseconds); 171fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson else 172bf07fc88a330061c59186bf4a11218b5d51aec6fAnders Carlsson return TRUE; 173fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 174fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 175fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** 176fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * If there are threads waiting on the condition variable, wake 177fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * up exactly one. 178fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Does nothing if passed a #NULL pointer. 179fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson */ 180fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid 181fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssondbus_condvar_wake_one (DBusCondVar *cond) 182fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 183fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson if (cond && thread_functions.condvar_wake_one) 184fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson (* thread_functions.condvar_wake_one) (cond); 185fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 186fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 187fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** 188fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * If there are threads waiting on the condition variable, wake 189fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * up all of them. 190fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Does nothing if passed a #NULL pointer. 191fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson */ 192fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid 193fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssondbus_condvar_wake_all (DBusCondVar *cond) 194fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 195fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson if (cond && thread_functions.condvar_wake_all) 196fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson (* thread_functions.condvar_wake_all) (cond); 197fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 198fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 199c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtonstatic void 200c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtonshutdown_global_locks (void *data) 201c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington{ 202c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington DBusMutex ***locks = data; 203c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington int i; 204c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 205c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington i = 0; 206c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington while (i < _DBUS_N_GLOBAL_LOCKS) 207c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington { 208c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dbus_mutex_free (*(locks[i])); 209c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington *(locks[i]) = NULL; 210c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington ++i; 211c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington } 212c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 213c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dbus_free (locks); 214c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington} 215c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 216fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonstatic dbus_bool_t 217c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtoninit_global_locks (void) 218fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 219fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson int i; 220c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington DBusMutex ***dynamic_global_locks; 221fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 222c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington DBusMutex **global_locks[] = { 223c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#define LOCK_ADDR(name) (& _dbus_lock_##name) 224c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington LOCK_ADDR (list), 225c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington LOCK_ADDR (connection_slots), 226c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington LOCK_ADDR (server_slots), 227c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington LOCK_ADDR (atomic), 228c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington LOCK_ADDR (message_handler), 229bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington LOCK_ADDR (bus), 23088cd5da3c0ec86fed29942b062c2f7bf0f8fda44Havoc Pennington LOCK_ADDR (shutdown_funcs), 23188cd5da3c0ec86fed29942b062c2f7bf0f8fda44Havoc Pennington LOCK_ADDR (system_users) 232c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#undef LOCK_ADDR 233fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson }; 234c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 235c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington _dbus_assert (_DBUS_N_ELEMENTS (global_locks) == 236c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington _DBUS_N_GLOBAL_LOCKS); 237c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 238c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington i = 0; 239fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 240c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dynamic_global_locks = dbus_new (DBusMutex**, _DBUS_N_GLOBAL_LOCKS); 241c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington if (dynamic_global_locks == NULL) 242c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington goto failed; 243c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 244c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington while (i < _DBUS_N_ELEMENTS (global_locks)) 245fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson { 246c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington *global_locks[i] = dbus_mutex_new (); 247fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 248c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington if (*global_locks[i] == NULL) 249c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington goto failed; 250c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 251c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dynamic_global_locks[i] = global_locks[i]; 252c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 253c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington ++i; 254fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson } 255c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 256c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington if (!_dbus_register_shutdown_func (shutdown_global_locks, 257c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dynamic_global_locks)) 258c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington goto failed; 259c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 260fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson return TRUE; 261c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 262c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington failed: 263c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dbus_free (dynamic_global_locks); 264c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 265c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington for (i = i - 1; i >= 0; i--) 266c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington { 267c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dbus_mutex_free (*global_locks[i]); 268c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington *global_locks[i] = NULL; 269c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington } 270c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington return FALSE; 271fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 272fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 273fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 274fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** 275a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Initializes threads. If this function is not called, 276a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * the D-BUS library will not lock any data structures. 277a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * If it is called, D-BUS will do locking, at some cost 278a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * in efficiency. Note that this function must be called 279a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * BEFORE using any other D-BUS functions. 280a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 28196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * @todo right now this function can only be called once, 28296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * maybe we should instead silently ignore multiple calls. 28396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * 284a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * @param functions functions for using threads 28596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * @returns #TRUE on success, #FALSE if no memory 286a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 28796a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtondbus_bool_t 288a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Penningtondbus_threads_init (const DBusThreadFunctions *functions) 289a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington{ 290a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert (functions != NULL); 291a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 292a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington /* these base functions are required. Future additions to 293a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * DBusThreadFunctions may be optional. 294a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 295fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_MUTEX_NEW_MASK); 296fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_MUTEX_FREE_MASK); 297fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_MUTEX_LOCK_MASK); 298fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_MUTEX_UNLOCK_MASK); 299fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_NEW_MASK); 300fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_FREE_MASK); 301fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_MASK); 302fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_TIMEOUT_MASK); 303fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ONE_MASK); 304fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ALL_MASK); 305a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert (functions->mutex_new != NULL); 306a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert (functions->mutex_free != NULL); 307a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert (functions->mutex_lock != NULL); 308a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert (functions->mutex_unlock != NULL); 309fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_new != NULL); 310fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_free != NULL); 311fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_wait != NULL); 312fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_wait_timeout != NULL); 313fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_wake_one != NULL); 314fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_wake_all != NULL); 315a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 316a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington /* Check that all bits in the mask actually are valid mask bits. 317a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * ensures people won't write code that breaks when we add 318a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * new bits. 319a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 320a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert ((functions->mask & ~DBUS_THREAD_FUNCTIONS_ALL_MASK) == 0); 321c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 322c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington if (thread_init_generation != _dbus_current_generation) 323c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington thread_functions.mask = 0; /* allow re-init in new generation */ 324a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 325a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington if (thread_functions.mask != 0) 326a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington { 327a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_warn ("dbus_threads_init() may only be called one time\n"); 32896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 329a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington } 330a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 331a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington thread_functions.mutex_new = functions->mutex_new; 332a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington thread_functions.mutex_free = functions->mutex_free; 333a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington thread_functions.mutex_lock = functions->mutex_lock; 334a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington thread_functions.mutex_unlock = functions->mutex_unlock; 335a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 336fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_new = functions->condvar_new; 337fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_free = functions->condvar_free; 338fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_wait = functions->condvar_wait; 339fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_wait_timeout = functions->condvar_wait_timeout; 340fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_wake_one = functions->condvar_wake_one; 341fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_wake_all = functions->condvar_wake_all; 34296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 343fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.mask = functions->mask; 34496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 345c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington if (!init_global_locks ()) 34696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 347c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 348c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington thread_init_generation = _dbus_current_generation; 34996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 350fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson return TRUE; 351a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington} 352a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 353a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington/** @} */ 354bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 355bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington#ifdef DBUS_BUILD_TESTS 356bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington/** Fake mutex used for debugging */ 357bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtontypedef struct DBusFakeMutex DBusFakeMutex; 358bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington/** Fake mutex used for debugging */ 359bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstruct DBusFakeMutex 360bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 361bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_bool_t locked; /**< Mutex is "locked" */ 362bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington}; 363bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 364bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic DBusMutex * dbus_fake_mutex_new (void); 365bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_mutex_free (DBusMutex *mutex); 366bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t dbus_fake_mutex_lock (DBusMutex *mutex); 367bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t dbus_fake_mutex_unlock (DBusMutex *mutex); 368bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic DBusCondVar* dbus_fake_condvar_new (void); 369bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_condvar_free (DBusCondVar *cond); 370bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_condvar_wait (DBusCondVar *cond, 371bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusMutex *mutex); 372bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t dbus_fake_condvar_wait_timeout (DBusCondVar *cond, 373bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusMutex *mutex, 374bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington int timeout_msec); 375bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_condvar_wake_one (DBusCondVar *cond); 376bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_condvar_wake_all (DBusCondVar *cond); 377bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 378bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 379bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic const DBusThreadFunctions fake_functions = 380bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 381bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_MUTEX_NEW_MASK | 382bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_MUTEX_FREE_MASK | 383bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_MUTEX_LOCK_MASK | 384bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_MUTEX_UNLOCK_MASK | 385bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_NEW_MASK | 386bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_FREE_MASK | 387bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_MASK | 388bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_TIMEOUT_MASK | 389bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ONE_MASK| 390bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ALL_MASK, 391bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_mutex_new, 392bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_mutex_free, 393bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_mutex_lock, 394bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_mutex_unlock, 395bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_new, 396bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_free, 397bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_wait, 398bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_wait_timeout, 399bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_wake_one, 400bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_wake_all 401bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington}; 402bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 403bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic DBusMutex * 404bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_mutex_new (void) 405bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 406bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusFakeMutex *mutex; 407bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 408bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington mutex = dbus_new0 (DBusFakeMutex, 1); 409bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 410bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return (DBusMutex *)mutex; 411bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 412bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 413bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 414bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_mutex_free (DBusMutex *mutex) 415bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 416bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusFakeMutex *fake = (DBusFakeMutex*) mutex; 417bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 418bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington _dbus_assert (!fake->locked); 419bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 420bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_free (fake); 421bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 422bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 423bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t 424bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_mutex_lock (DBusMutex *mutex) 425bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 426bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusFakeMutex *fake = (DBusFakeMutex*) mutex; 427bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 428bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington _dbus_assert (!fake->locked); 429bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 430bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington fake->locked = TRUE; 431bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 432bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return TRUE; 433bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 434bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 435bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t 436bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_mutex_unlock (DBusMutex *mutex) 437bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 438bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusFakeMutex *fake = (DBusFakeMutex*) mutex; 439bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 440bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington _dbus_assert (fake->locked); 441bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 442bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington fake->locked = FALSE; 443bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 444bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return TRUE; 445bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 446bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 447bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic DBusCondVar* 448bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_new (void) 449bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 450bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return (DBusCondVar*) _dbus_strdup ("FakeCondvar"); 451bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 452bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 453bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 454bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_free (DBusCondVar *cond) 455bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 456bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_free (cond); 457bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 458bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 459bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 460bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_wait (DBusCondVar *cond, 461bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusMutex *mutex) 462bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 463bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 464bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 465bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 466bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t 467bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_wait_timeout (DBusCondVar *cond, 468bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusMutex *mutex, 469bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington int timeout_msec) 470bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 471bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return TRUE; 472bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 473bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 474bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 475bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_wake_one (DBusCondVar *cond) 476bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 477bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 478bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 479bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 480bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 481bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_wake_all (DBusCondVar *cond) 482bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 483bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 484bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 485bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 486bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_bool_t 487bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington_dbus_threads_init_debug (void) 488bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 489bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return dbus_threads_init (&fake_functions); 490bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 491bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 492bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington#endif /* DBUS_BUILD_TESTS */ 493