00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <glib.h>
00025 #include <dbus/dbus.h>
00026 #include "dbus-glib.h"
00027
00032 static DBusMutex * dbus_gmutex_new (void);
00033 static void dbus_gmutex_free (DBusMutex *mutex);
00034 static dbus_bool_t dbus_gmutex_lock (DBusMutex *mutex);
00035 static dbus_bool_t dbus_gmutex_unlock (DBusMutex *mutex);
00036
00037
00038 static DBusCondVar* dbus_gcondvar_new (void);
00039 static void dbus_gcondvar_free (DBusCondVar *cond);
00040 static void dbus_gcondvar_wait (DBusCondVar *cond,
00041 DBusMutex *mutex);
00042 static dbus_bool_t dbus_gcondvar_wait_timeout (DBusCondVar *cond,
00043 DBusMutex *mutex,
00044 int timeout_msec);
00045 static void dbus_gcondvar_wake_one (DBusCondVar *cond);
00046 static void dbus_gcondvar_wake_all (DBusCondVar *cond);
00047
00048
00049 static const DBusThreadFunctions functions =
00050 {
00051 DBUS_THREAD_FUNCTIONS_MUTEX_NEW_MASK |
00052 DBUS_THREAD_FUNCTIONS_MUTEX_FREE_MASK |
00053 DBUS_THREAD_FUNCTIONS_MUTEX_LOCK_MASK |
00054 DBUS_THREAD_FUNCTIONS_MUTEX_UNLOCK_MASK |
00055 DBUS_THREAD_FUNCTIONS_CONDVAR_NEW_MASK |
00056 DBUS_THREAD_FUNCTIONS_CONDVAR_FREE_MASK |
00057 DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_MASK |
00058 DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_TIMEOUT_MASK |
00059 DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ONE_MASK|
00060 DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ALL_MASK,
00061 dbus_gmutex_new,
00062 dbus_gmutex_free,
00063 dbus_gmutex_lock,
00064 dbus_gmutex_unlock,
00065 dbus_gcondvar_new,
00066 dbus_gcondvar_free,
00067 dbus_gcondvar_wait,
00068 dbus_gcondvar_wait_timeout,
00069 dbus_gcondvar_wake_one,
00070 dbus_gcondvar_wake_all
00071 };
00072
00073 static DBusMutex *
00074 dbus_gmutex_new (void)
00075 {
00076 GMutex *mutex;
00077
00078 mutex = g_mutex_new ();
00079
00080 return (DBusMutex *)mutex;
00081 }
00082
00083 static void
00084 dbus_gmutex_free (DBusMutex *mutex)
00085 {
00086 g_mutex_free ((GMutex *)mutex);
00087 }
00088
00089 static dbus_bool_t
00090 dbus_gmutex_lock (DBusMutex *mutex)
00091 {
00092 g_mutex_lock ((GMutex *)mutex);
00093
00094 return TRUE;
00095 }
00096
00097 static dbus_bool_t
00098 dbus_gmutex_unlock (DBusMutex *mutex)
00099 {
00100 g_mutex_unlock ((GMutex *)mutex);
00101
00102 return TRUE;
00103 }
00104
00105 static DBusCondVar*
00106 dbus_gcondvar_new (void)
00107 {
00108 return (DBusCondVar*)g_cond_new ();
00109 }
00110
00111 static void
00112 dbus_gcondvar_free (DBusCondVar *cond)
00113 {
00114 g_cond_free ((GCond *)cond);
00115 }
00116
00117 static void
00118 dbus_gcondvar_wait (DBusCondVar *cond,
00119 DBusMutex *mutex)
00120 {
00121 g_cond_wait ((GCond *)cond, (GMutex *)mutex);
00122 }
00123
00124 static dbus_bool_t
00125 dbus_gcondvar_wait_timeout (DBusCondVar *cond,
00126 DBusMutex *mutex,
00127 int timeout_msec)
00128 {
00129 GTimeVal now;
00130
00131 g_get_current_time (&now);
00132
00133 now.tv_sec += timeout_msec / 1000;
00134 now.tv_usec += (timeout_msec % 1000) * 1000;
00135 if (now.tv_usec > G_USEC_PER_SEC)
00136 {
00137 now.tv_sec += 1;
00138 now.tv_usec -= G_USEC_PER_SEC;
00139 }
00140
00141 return g_cond_timed_wait ((GCond *)cond, (GMutex *)mutex, &now);
00142 }
00143
00144 static void
00145 dbus_gcondvar_wake_one (DBusCondVar *cond)
00146 {
00147 g_cond_signal ((GCond *)cond);
00148 }
00149
00150 static void
00151 dbus_gcondvar_wake_all (DBusCondVar *cond)
00152 {
00153 g_cond_broadcast ((GCond *)cond);
00154 }
00155
00167 void
00168 dbus_g_thread_init (void)
00169 {
00170 if (!g_thread_supported ())
00171 g_error ("g_thread_init() must be called before dbus_threads_init()");
00172
00173 dbus_threads_init (&functions);
00174 }
00175