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