dbus-threads.c revision 583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2
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), 226583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington LOCK_ADDR (pending_call_slots), 227c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington LOCK_ADDR (server_slots), 228958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington LOCK_ADDR (message_slots), 229c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington LOCK_ADDR (atomic), 230bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington LOCK_ADDR (bus), 23188cd5da3c0ec86fed29942b062c2f7bf0f8fda44Havoc Pennington LOCK_ADDR (shutdown_funcs), 23288cd5da3c0ec86fed29942b062c2f7bf0f8fda44Havoc Pennington LOCK_ADDR (system_users) 233c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#undef LOCK_ADDR 234fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson }; 235c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 236c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington _dbus_assert (_DBUS_N_ELEMENTS (global_locks) == 237c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington _DBUS_N_GLOBAL_LOCKS); 238c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 239c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington i = 0; 240fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 241c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dynamic_global_locks = dbus_new (DBusMutex**, _DBUS_N_GLOBAL_LOCKS); 242c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington if (dynamic_global_locks == NULL) 243c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington goto failed; 244c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 245c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington while (i < _DBUS_N_ELEMENTS (global_locks)) 246fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson { 247c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington *global_locks[i] = dbus_mutex_new (); 248fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 249c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington if (*global_locks[i] == NULL) 250c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington goto failed; 251c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 252c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dynamic_global_locks[i] = global_locks[i]; 253c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 254c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington ++i; 255fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson } 256c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 257c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington if (!_dbus_register_shutdown_func (shutdown_global_locks, 258c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dynamic_global_locks)) 259c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington goto failed; 260c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 261fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson return TRUE; 262c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 263c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington failed: 264c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dbus_free (dynamic_global_locks); 265c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 266c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington for (i = i - 1; i >= 0; i--) 267c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington { 268c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dbus_mutex_free (*global_locks[i]); 269c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington *global_locks[i] = NULL; 270c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington } 271c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington return FALSE; 272fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 273fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 274fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 275fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** 276a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Initializes threads. If this function is not called, 277a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * the D-BUS library will not lock any data structures. 278a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * If it is called, D-BUS will do locking, at some cost 279a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * in efficiency. Note that this function must be called 280a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * BEFORE using any other D-BUS functions. 281a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 282cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington * This function may be called more than once, as long 283cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington * as you pass in the same functions each time. If it's 284cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington * called multiple times with different functions, then 285cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington * a warning is printed, because someone is confused. 28696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * 287a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * @param functions functions for using threads 28896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * @returns #TRUE on success, #FALSE if no memory 289a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 29096a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtondbus_bool_t 291a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Penningtondbus_threads_init (const DBusThreadFunctions *functions) 292a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington{ 293a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert (functions != NULL); 294a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 295a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington /* these base functions are required. Future additions to 296a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * DBusThreadFunctions may be optional. 297a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 298fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_MUTEX_NEW_MASK); 299fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_MUTEX_FREE_MASK); 300fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_MUTEX_LOCK_MASK); 301fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_MUTEX_UNLOCK_MASK); 302fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_NEW_MASK); 303fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_FREE_MASK); 304fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_MASK); 305fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_TIMEOUT_MASK); 306fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ONE_MASK); 307fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ALL_MASK); 308a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert (functions->mutex_new != NULL); 309a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert (functions->mutex_free != NULL); 310a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert (functions->mutex_lock != NULL); 311a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert (functions->mutex_unlock != NULL); 312fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_new != NULL); 313fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_free != NULL); 314fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_wait != NULL); 315fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_wait_timeout != NULL); 316fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_wake_one != NULL); 317fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_wake_all != NULL); 318a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 319a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington /* Check that all bits in the mask actually are valid mask bits. 320a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * ensures people won't write code that breaks when we add 321a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * new bits. 322a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 323a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert ((functions->mask & ~DBUS_THREAD_FUNCTIONS_ALL_MASK) == 0); 324c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 325c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington if (thread_init_generation != _dbus_current_generation) 326c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington thread_functions.mask = 0; /* allow re-init in new generation */ 327a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 328a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington if (thread_functions.mask != 0) 329a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington { 330cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington /* Silently allow multiple init if the functions are the same ones. 331cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington * Well, we only bother checking two of them, just out of laziness. 332cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington */ 333cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington if (thread_functions.mask == functions->mask && 334cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington thread_functions.mutex_new == functions->mutex_new && 335cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington thread_functions.condvar_new == functions->condvar_new) 336cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington { 337cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington return TRUE; 338cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington } 339cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington else 340cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington { 341cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington _dbus_warn ("dbus_threads_init() called twice with two different sets of functions\n"); 342cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington return FALSE; 343cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington } 344a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington } 345a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 346a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington thread_functions.mutex_new = functions->mutex_new; 347a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington thread_functions.mutex_free = functions->mutex_free; 348a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington thread_functions.mutex_lock = functions->mutex_lock; 349a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington thread_functions.mutex_unlock = functions->mutex_unlock; 350a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 351fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_new = functions->condvar_new; 352fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_free = functions->condvar_free; 353fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_wait = functions->condvar_wait; 354fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_wait_timeout = functions->condvar_wait_timeout; 355fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_wake_one = functions->condvar_wake_one; 356fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_wake_all = functions->condvar_wake_all; 35796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 358fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.mask = functions->mask; 35996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 360c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington if (!init_global_locks ()) 36196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 362c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 363c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington thread_init_generation = _dbus_current_generation; 36496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 365fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson return TRUE; 366a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington} 367a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 368a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington/** @} */ 369bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 370bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington#ifdef DBUS_BUILD_TESTS 371bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington/** Fake mutex used for debugging */ 372bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtontypedef struct DBusFakeMutex DBusFakeMutex; 373bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington/** Fake mutex used for debugging */ 374bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstruct DBusFakeMutex 375bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 376bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_bool_t locked; /**< Mutex is "locked" */ 377bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington}; 378bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 379bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic DBusMutex * dbus_fake_mutex_new (void); 380bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_mutex_free (DBusMutex *mutex); 381bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t dbus_fake_mutex_lock (DBusMutex *mutex); 382bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t dbus_fake_mutex_unlock (DBusMutex *mutex); 383bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic DBusCondVar* dbus_fake_condvar_new (void); 384bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_condvar_free (DBusCondVar *cond); 385bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_condvar_wait (DBusCondVar *cond, 386bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusMutex *mutex); 387bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t dbus_fake_condvar_wait_timeout (DBusCondVar *cond, 388bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusMutex *mutex, 389bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington int timeout_msec); 390bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_condvar_wake_one (DBusCondVar *cond); 391bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_condvar_wake_all (DBusCondVar *cond); 392bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 393bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 394bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic const DBusThreadFunctions fake_functions = 395bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 396bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_MUTEX_NEW_MASK | 397bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_MUTEX_FREE_MASK | 398bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_MUTEX_LOCK_MASK | 399bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_MUTEX_UNLOCK_MASK | 400bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_NEW_MASK | 401bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_FREE_MASK | 402bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_MASK | 403bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_TIMEOUT_MASK | 404bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ONE_MASK| 405bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ALL_MASK, 406bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_mutex_new, 407bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_mutex_free, 408bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_mutex_lock, 409bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_mutex_unlock, 410bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_new, 411bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_free, 412bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_wait, 413bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_wait_timeout, 414bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_wake_one, 415bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_wake_all 416bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington}; 417bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 418bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic DBusMutex * 419bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_mutex_new (void) 420bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 421bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusFakeMutex *mutex; 422bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 423bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington mutex = dbus_new0 (DBusFakeMutex, 1); 424bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 425bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return (DBusMutex *)mutex; 426bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 427bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 428bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 429bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_mutex_free (DBusMutex *mutex) 430bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 431bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusFakeMutex *fake = (DBusFakeMutex*) mutex; 432bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 433bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington _dbus_assert (!fake->locked); 434bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 435bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_free (fake); 436bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 437bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 438bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t 439bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_mutex_lock (DBusMutex *mutex) 440bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 441bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusFakeMutex *fake = (DBusFakeMutex*) mutex; 442bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 443bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington _dbus_assert (!fake->locked); 444bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 445bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington fake->locked = TRUE; 446bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 447bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return TRUE; 448bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 449bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 450bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t 451bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_mutex_unlock (DBusMutex *mutex) 452bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 453bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusFakeMutex *fake = (DBusFakeMutex*) mutex; 454bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 455bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington _dbus_assert (fake->locked); 456bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 457bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington fake->locked = FALSE; 458bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 459bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return TRUE; 460bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 461bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 462bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic DBusCondVar* 463bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_new (void) 464bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 465bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return (DBusCondVar*) _dbus_strdup ("FakeCondvar"); 466bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 467bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 468bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 469bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_free (DBusCondVar *cond) 470bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 471bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_free (cond); 472bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 473bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 474bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 475bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_wait (DBusCondVar *cond, 476ab10ae902d8aa7c2b98fd080a7458127b1b8e648Havoc Pennington DBusMutex *mutex) 477bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 478bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 479bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 480bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 481bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t 482bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_wait_timeout (DBusCondVar *cond, 483bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusMutex *mutex, 484bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington int timeout_msec) 485bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 486bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return TRUE; 487bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 488bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 489bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 490bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_wake_one (DBusCondVar *cond) 491bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 492bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 493bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 494bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 495bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 496bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_wake_all (DBusCondVar *cond) 497bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 498bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 499bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 500bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 501bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_bool_t 502bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington_dbus_threads_init_debug (void) 503bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 504bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return dbus_threads_init (&fake_functions); 505bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 506bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 507bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington#endif /* DBUS_BUILD_TESTS */ 508