dbus-threads.c revision 7652304bff969afb3969603149bb385efe861fe8
1a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/* -*- mode: C; c-file-style: "gnu" -*- */ 27652304bff969afb3969603149bb385efe861fe8John (J/* dbus-threads.h D-Bus threads handling 3a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 4bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington * Copyright (C) 2002, 2003 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 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" 25cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington#include "dbus-threads-internal.h" 26a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 27a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Penningtonstatic DBusThreadFunctions thread_functions = 28a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington{ 29a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 0, 30a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington NULL, NULL, NULL, NULL, 31fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson NULL, NULL, NULL, NULL, NULL, 32a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 33a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington NULL, NULL, NULL, NULL, 34a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington NULL, NULL, NULL, NULL 35a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington}; 36c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtonstatic int thread_init_generation = 0; 37a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 3896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington/** This is used for the no-op default mutex pointer, just to be distinct from #NULL */ 39bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington#define _DBUS_DUMMY_MUTEX ((DBusMutex*)0xABCDEF) 4096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 41fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** This is used for the no-op default mutex pointer, just to be distinct from #NULL */ 42bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington#define _DBUS_DUMMY_CONDVAR ((DBusCondVar*)0xABCDEF2) 43fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 44a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/** 45cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * @defgroup DBusThreadsInternals Thread functions 46cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * @ingroup DBusInternals 47cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * @brief _dbus_mutex_lock(), etc. 48a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 49a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Functions and macros related to threads and thread locks. 50a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 51a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * @{ 52a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 53a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 54a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/** 55a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Creates a new mutex using the function supplied to dbus_threads_init(), 56a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * or creates a no-op mutex if threads are not initialized. 57a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * May return #NULL even if threads are initialized, indicating 58a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * out-of-memory. 59a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 60a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * @returns new mutex or #NULL 61a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 62a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc PenningtonDBusMutex* 63cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_mutex_new (void) 64a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington{ 65a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington if (thread_functions.mutex_new) 66a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington return (* thread_functions.mutex_new) (); 67a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington else 68bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return _DBUS_DUMMY_MUTEX; 69a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington} 70a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 71a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/** 72a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Frees a mutex created with dbus_mutex_new(); does 73a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * nothing if passed a #NULL pointer. 74a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 75a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Penningtonvoid 76cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_mutex_free (DBusMutex *mutex) 77a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington{ 78a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington if (mutex && thread_functions.mutex_free) 79a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington (* thread_functions.mutex_free) (mutex); 80a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington} 81a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 82a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/** 83a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Locks a mutex. Does nothing if passed a #NULL pointer. 84a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Locks are not recursive. 85a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 86a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * @returns #TRUE on success 87a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 88a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Penningtondbus_bool_t 89cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_mutex_lock (DBusMutex *mutex) 90a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington{ 91a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington if (mutex && thread_functions.mutex_lock) 92a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington return (* thread_functions.mutex_lock) (mutex); 93a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington else 94a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington return TRUE; 95a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington} 96a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 97a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/** 98a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Unlocks a mutex. Does nothing if passed a #NULL pointer. 99a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 100a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * @returns #TRUE on success 101a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 102a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Penningtondbus_bool_t 103cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_mutex_unlock (DBusMutex *mutex) 104a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington{ 105a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington if (mutex && thread_functions.mutex_unlock) 106a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington return (* thread_functions.mutex_unlock) (mutex); 107a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington else 108a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington return TRUE; 109a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington} 110a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 111a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington/** 112fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Creates a new condition variable using the function supplied 113fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * to dbus_threads_init(), or creates a no-op condition variable 114fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * if threads are not initialized. May return #NULL even if 115fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * threads are initialized, indicating out-of-memory. 116fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * 117fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * @returns new mutex or #NULL 118fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson */ 119fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander LarssonDBusCondVar * 120cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_condvar_new (void) 121fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 122fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson if (thread_functions.condvar_new) 123fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson return (* thread_functions.condvar_new) (); 124fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson else 125bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return _DBUS_DUMMY_CONDVAR; 126fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 127fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 128fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** 129fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Frees a conditional variable created with dbus_condvar_new(); does 130fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * nothing if passed a #NULL pointer. 131fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson */ 132fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid 133cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_condvar_free (DBusCondVar *cond) 134fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 135fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson if (cond && thread_functions.condvar_free) 136fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson (* thread_functions.condvar_free) (cond); 137fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 138fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 139fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** 140fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Atomically unlocks the mutex and waits for the conditions 141fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * variable to be signalled. Locks the mutex again before 142fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * returning. 143fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Does nothing if passed a #NULL pointer. 144fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson */ 145fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid 146cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_condvar_wait (DBusCondVar *cond, 147cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington DBusMutex *mutex) 148fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 149fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson if (cond && mutex && thread_functions.condvar_wait) 150fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson (* thread_functions.condvar_wait) (cond, mutex); 151fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 152fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 153fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** 154fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Atomically unlocks the mutex and waits for the conditions 155fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * variable to be signalled, or for a timeout. Locks the 156fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * mutex again before returning. 157fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Does nothing if passed a #NULL pointer. 158fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * 159c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington * @param cond the condition variable 160c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington * @param mutex the mutex 161fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * @param timeout_milliseconds the maximum time to wait 162fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * @returns TRUE if the condition was reached, or FALSE if the 163fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * timeout was reached. 164fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson */ 165fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssondbus_bool_t 166cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_condvar_wait_timeout (DBusCondVar *cond, 167cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington DBusMutex *mutex, 168cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington int timeout_milliseconds) 169fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 170fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson if (cond && mutex && thread_functions.condvar_wait) 171fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson return (* thread_functions.condvar_wait_timeout) (cond, mutex, timeout_milliseconds); 172fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson else 173bf07fc88a330061c59186bf4a11218b5d51aec6fAnders Carlsson return TRUE; 174fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 175fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 176fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** 177fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * If there are threads waiting on the condition variable, wake 178fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * up exactly one. 179fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Does nothing if passed a #NULL pointer. 180fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson */ 181fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid 182cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_condvar_wake_one (DBusCondVar *cond) 183fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 184fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson if (cond && thread_functions.condvar_wake_one) 185fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson (* thread_functions.condvar_wake_one) (cond); 186fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 187fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 188fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** 189fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * If there are threads waiting on the condition variable, wake 190fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * up all of them. 191fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson * Does nothing if passed a #NULL pointer. 192fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson */ 193fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid 194cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington_dbus_condvar_wake_all (DBusCondVar *cond) 195fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 196fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson if (cond && thread_functions.condvar_wake_all) 197fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson (* thread_functions.condvar_wake_all) (cond); 198fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 199fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 200c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtonstatic void 201c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtonshutdown_global_locks (void *data) 202c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington{ 203c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington DBusMutex ***locks = data; 204c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington int i; 205c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 206c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington i = 0; 207c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington while (i < _DBUS_N_GLOBAL_LOCKS) 208c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington { 209cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington _dbus_mutex_free (*(locks[i])); 210c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington *(locks[i]) = NULL; 211c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington ++i; 212c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington } 213c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 214c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dbus_free (locks); 215c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington} 216c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 217fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonstatic dbus_bool_t 218c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtoninit_global_locks (void) 219fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson{ 220fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson int i; 221c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington DBusMutex ***dynamic_global_locks; 222fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 223c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington DBusMutex **global_locks[] = { 224c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#define LOCK_ADDR(name) (& _dbus_lock_##name) 225c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington LOCK_ADDR (list), 226c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington LOCK_ADDR (connection_slots), 227583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington LOCK_ADDR (pending_call_slots), 228c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington LOCK_ADDR (server_slots), 229958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington LOCK_ADDR (message_slots), 230c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington LOCK_ADDR (atomic), 231bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington LOCK_ADDR (bus), 23288cd5da3c0ec86fed29942b062c2f7bf0f8fda44Havoc Pennington LOCK_ADDR (shutdown_funcs), 2337fc350740c64ebd095615b8384de0bce0b4d8074Havoc Pennington LOCK_ADDR (system_users), 234ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington LOCK_ADDR (message_cache), 235ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington LOCK_ADDR (shared_connections) 236c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#undef LOCK_ADDR 237fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson }; 238c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 239c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington _dbus_assert (_DBUS_N_ELEMENTS (global_locks) == 240c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington _DBUS_N_GLOBAL_LOCKS); 241c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 242c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington i = 0; 243fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 244c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dynamic_global_locks = dbus_new (DBusMutex**, _DBUS_N_GLOBAL_LOCKS); 245c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington if (dynamic_global_locks == NULL) 246c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington goto failed; 247c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 248c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington while (i < _DBUS_N_ELEMENTS (global_locks)) 249fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson { 250cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington *global_locks[i] = _dbus_mutex_new (); 251fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 252c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington if (*global_locks[i] == NULL) 253c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington goto failed; 254c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 255c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dynamic_global_locks[i] = global_locks[i]; 256c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 257c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington ++i; 258fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson } 259c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 260c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington if (!_dbus_register_shutdown_func (shutdown_global_locks, 261c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dynamic_global_locks)) 262c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington goto failed; 263c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 264fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson return TRUE; 265c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 266c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington failed: 267c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington dbus_free (dynamic_global_locks); 268c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 269c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington for (i = i - 1; i >= 0; i--) 270c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington { 271cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington _dbus_mutex_free (*global_locks[i]); 272c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington *global_locks[i] = NULL; 273c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington } 274c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington return FALSE; 275fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson} 276fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 277cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington/** @} */ /* end of internals */ 278cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington 279cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington/** 280cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * @defgroup DBusThreads Thread functions 281cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * @ingroup DBus 282cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * @brief dbus_threads_init() 283cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * 284cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * Functions and macros related to threads and thread locks. 285cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * 286cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * @{ 287cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington */ 288fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson 289fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson/** 290cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington * 291a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * Initializes threads. If this function is not called, 2927652304bff969afb3969603149bb385efe861fe8John (J * the D-Bus library will not lock any data structures. 2937652304bff969afb3969603149bb385efe861fe8John (J * If it is called, D-Bus will do locking, at some cost 294a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * in efficiency. Note that this function must be called 2957652304bff969afb3969603149bb385efe861fe8John (J * BEFORE using any other D-Bus functions. 296a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * 297cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington * This function may be called more than once, as long 298cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington * as you pass in the same functions each time. If it's 299cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington * called multiple times with different functions, then 300cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington * a warning is printed, because someone is confused. 30196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * 302a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * @param functions functions for using threads 30396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * @returns #TRUE on success, #FALSE if no memory 304a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 30596a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtondbus_bool_t 306a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Penningtondbus_threads_init (const DBusThreadFunctions *functions) 307a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington{ 308a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert (functions != NULL); 309a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 310a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington /* these base functions are required. Future additions to 311a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * DBusThreadFunctions may be optional. 312a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 313fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_MUTEX_NEW_MASK); 314fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_MUTEX_FREE_MASK); 315fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_MUTEX_LOCK_MASK); 316fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_MUTEX_UNLOCK_MASK); 317fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_NEW_MASK); 318fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_FREE_MASK); 319fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_MASK); 320fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_TIMEOUT_MASK); 321fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ONE_MASK); 322fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->mask & DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ALL_MASK); 323a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert (functions->mutex_new != NULL); 324a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert (functions->mutex_free != NULL); 325a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert (functions->mutex_lock != NULL); 326a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert (functions->mutex_unlock != NULL); 327fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_new != NULL); 328fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_free != NULL); 329fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_wait != NULL); 330fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_wait_timeout != NULL); 331fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_wake_one != NULL); 332fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_assert (functions->condvar_wake_all != NULL); 333a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 334a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington /* Check that all bits in the mask actually are valid mask bits. 335a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * ensures people won't write code that breaks when we add 336a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington * new bits. 337a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington */ 338a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington _dbus_assert ((functions->mask & ~DBUS_THREAD_FUNCTIONS_ALL_MASK) == 0); 339c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 340c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington if (thread_init_generation != _dbus_current_generation) 341c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington thread_functions.mask = 0; /* allow re-init in new generation */ 342a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 343a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington if (thread_functions.mask != 0) 344a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington { 345cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington /* Silently allow multiple init if the functions are the same ones. 346cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington * Well, we only bother checking two of them, just out of laziness. 347cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington */ 348cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington if (thread_functions.mask == functions->mask && 349cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington thread_functions.mutex_new == functions->mutex_new && 350cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington thread_functions.condvar_new == functions->condvar_new) 351cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington { 352cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington return TRUE; 353cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington } 354cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington else 355cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington { 356cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington _dbus_warn ("dbus_threads_init() called twice with two different sets of functions\n"); 357cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington return FALSE; 358cef11442f69e9a649731f3b2a12b655996da265bHavoc Pennington } 359a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington } 360a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 361a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington thread_functions.mutex_new = functions->mutex_new; 362a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington thread_functions.mutex_free = functions->mutex_free; 363a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington thread_functions.mutex_lock = functions->mutex_lock; 364a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington thread_functions.mutex_unlock = functions->mutex_unlock; 365a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 366fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_new = functions->condvar_new; 367fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_free = functions->condvar_free; 368fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_wait = functions->condvar_wait; 369fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_wait_timeout = functions->condvar_wait_timeout; 370fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_wake_one = functions->condvar_wake_one; 371fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.condvar_wake_all = functions->condvar_wake_all; 37296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 373fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson thread_functions.mask = functions->mask; 37496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 375c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington if (!init_global_locks ()) 37696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 377c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 378c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington thread_init_generation = _dbus_current_generation; 37996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 380fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson return TRUE; 381a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington} 382a0e550bc608e96a574f3ea8ed4cf3635733c4a09Havoc Pennington 383a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington/** @} */ 384bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 385bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington#ifdef DBUS_BUILD_TESTS 386bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington/** Fake mutex used for debugging */ 387bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtontypedef struct DBusFakeMutex DBusFakeMutex; 388bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington/** Fake mutex used for debugging */ 389bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstruct DBusFakeMutex 390bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 391bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_bool_t locked; /**< Mutex is "locked" */ 392bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington}; 393bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 394bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic DBusMutex * dbus_fake_mutex_new (void); 395bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_mutex_free (DBusMutex *mutex); 396bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t dbus_fake_mutex_lock (DBusMutex *mutex); 397bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t dbus_fake_mutex_unlock (DBusMutex *mutex); 398bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic DBusCondVar* dbus_fake_condvar_new (void); 399bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_condvar_free (DBusCondVar *cond); 400bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_condvar_wait (DBusCondVar *cond, 401bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusMutex *mutex); 402bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t dbus_fake_condvar_wait_timeout (DBusCondVar *cond, 403bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusMutex *mutex, 404bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington int timeout_msec); 405bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_condvar_wake_one (DBusCondVar *cond); 406bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void dbus_fake_condvar_wake_all (DBusCondVar *cond); 407bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 408bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 409bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic const DBusThreadFunctions fake_functions = 410bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 411bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_MUTEX_NEW_MASK | 412bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_MUTEX_FREE_MASK | 413bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_MUTEX_LOCK_MASK | 414bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_MUTEX_UNLOCK_MASK | 415bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_NEW_MASK | 416bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_FREE_MASK | 417bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_MASK | 418bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_TIMEOUT_MASK | 419bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ONE_MASK| 420bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ALL_MASK, 421bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_mutex_new, 422bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_mutex_free, 423bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_mutex_lock, 424bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_mutex_unlock, 425bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_new, 426bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_free, 427bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_wait, 428bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_wait_timeout, 429bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_wake_one, 430bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_fake_condvar_wake_all 431bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington}; 432bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 433bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic DBusMutex * 434bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_mutex_new (void) 435bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 436bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusFakeMutex *mutex; 437bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 438bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington mutex = dbus_new0 (DBusFakeMutex, 1); 439bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 440bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return (DBusMutex *)mutex; 441bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 442bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 443bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 444bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_mutex_free (DBusMutex *mutex) 445bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 446bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusFakeMutex *fake = (DBusFakeMutex*) mutex; 447bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 448bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington _dbus_assert (!fake->locked); 449bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 450bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_free (fake); 451bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 452bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 453bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t 454bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_mutex_lock (DBusMutex *mutex) 455bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 456bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusFakeMutex *fake = (DBusFakeMutex*) mutex; 457bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 458bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington _dbus_assert (!fake->locked); 459bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 460bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington fake->locked = TRUE; 461bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 462bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return TRUE; 463bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 464bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 465bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t 466bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_mutex_unlock (DBusMutex *mutex) 467bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 468bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusFakeMutex *fake = (DBusFakeMutex*) mutex; 469bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 470bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington _dbus_assert (fake->locked); 471bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 472bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington fake->locked = FALSE; 473bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 474bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return TRUE; 475bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 476bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 477bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic DBusCondVar* 478bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_new (void) 479bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 480bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return (DBusCondVar*) _dbus_strdup ("FakeCondvar"); 481bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 482bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 483bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 484bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_free (DBusCondVar *cond) 485bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 486bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington dbus_free (cond); 487bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 488bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 489bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 490bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_wait (DBusCondVar *cond, 491ab10ae902d8aa7c2b98fd080a7458127b1b8e648Havoc Pennington DBusMutex *mutex) 492bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 493bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 494bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 495bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 496bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic dbus_bool_t 497bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_wait_timeout (DBusCondVar *cond, 498bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington DBusMutex *mutex, 499bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington int timeout_msec) 500bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 501bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return TRUE; 502bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 503bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 504bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 505bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_wake_one (DBusCondVar *cond) 506bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 507bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 508bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 509bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 510bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtonstatic void 511bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_fake_condvar_wake_all (DBusCondVar *cond) 512bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 513bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 514bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 515bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 516bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_bool_t 517bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington_dbus_threads_init_debug (void) 518bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington{ 519bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington return dbus_threads_init (&fake_functions); 520bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington} 521bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 522bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington#endif /* DBUS_BUILD_TESTS */ 523