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