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