Main Page | Modules | Data Structures | File List | Data Fields | Related Pages

dbus-gthread.c

00001 /* -*- mode: C; c-file-style: "gnu" -*- */ 00002 /* dbus-gthread.c GThread integration 00003 * 00004 * Copyright (C) 2002 CodeFactory AB 00005 * 00006 * Licensed under the Academic Free License version 2.1 00007 * 00008 * This program is free software; you can redistribute it and/or modify 00009 * it under the terms of the GNU General Public License as published by 00010 * the Free Software Foundation; either version 2 of the License, or 00011 * (at your option) any later version. 00012 * 00013 * This program is distributed in the hope that it will be useful, 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00016 * GNU General Public License for more details. 00017 * 00018 * You should have received a copy of the GNU General Public License 00019 * along with this program; if not, write to the Free Software 00020 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00021 * 00022 */ 00023 00024 #include <glib.h> 00025 #include <dbus/dbus.h> 00026 #include <dbus/dbus-glib.h> 00027 #include <dbus/dbus-glib-lowlevel.h> 00028 00033 static DBusMutex * dbus_gmutex_new (void); 00034 static void dbus_gmutex_free (DBusMutex *mutex); 00035 static dbus_bool_t dbus_gmutex_lock (DBusMutex *mutex); 00036 static dbus_bool_t dbus_gmutex_unlock (DBusMutex *mutex); 00037 00038 00039 static DBusCondVar* dbus_gcondvar_new (void); 00040 static void dbus_gcondvar_free (DBusCondVar *cond); 00041 static void dbus_gcondvar_wait (DBusCondVar *cond, 00042 DBusMutex *mutex); 00043 static dbus_bool_t dbus_gcondvar_wait_timeout (DBusCondVar *cond, 00044 DBusMutex *mutex, 00045 int timeout_msec); 00046 static void dbus_gcondvar_wake_one (DBusCondVar *cond); 00047 static void dbus_gcondvar_wake_all (DBusCondVar *cond); 00048 00049 00050 static const DBusThreadFunctions functions = 00051 { 00052 DBUS_THREAD_FUNCTIONS_MUTEX_NEW_MASK | 00053 DBUS_THREAD_FUNCTIONS_MUTEX_FREE_MASK | 00054 DBUS_THREAD_FUNCTIONS_MUTEX_LOCK_MASK | 00055 DBUS_THREAD_FUNCTIONS_MUTEX_UNLOCK_MASK | 00056 DBUS_THREAD_FUNCTIONS_CONDVAR_NEW_MASK | 00057 DBUS_THREAD_FUNCTIONS_CONDVAR_FREE_MASK | 00058 DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_MASK | 00059 DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_TIMEOUT_MASK | 00060 DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ONE_MASK| 00061 DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ALL_MASK, 00062 dbus_gmutex_new, 00063 dbus_gmutex_free, 00064 dbus_gmutex_lock, 00065 dbus_gmutex_unlock, 00066 dbus_gcondvar_new, 00067 dbus_gcondvar_free, 00068 dbus_gcondvar_wait, 00069 dbus_gcondvar_wait_timeout, 00070 dbus_gcondvar_wake_one, 00071 dbus_gcondvar_wake_all 00072 }; 00073 00074 static DBusMutex * 00075 dbus_gmutex_new (void) 00076 { 00077 GMutex *mutex; 00078 00079 mutex = g_mutex_new (); 00080 00081 return (DBusMutex *)mutex; 00082 } 00083 00084 static void 00085 dbus_gmutex_free (DBusMutex *mutex) 00086 { 00087 g_mutex_free ((GMutex *)mutex); 00088 } 00089 00090 static dbus_bool_t 00091 dbus_gmutex_lock (DBusMutex *mutex) 00092 { 00093 g_mutex_lock ((GMutex *)mutex); 00094 00095 return TRUE; 00096 } 00097 00098 static dbus_bool_t 00099 dbus_gmutex_unlock (DBusMutex *mutex) 00100 { 00101 g_mutex_unlock ((GMutex *)mutex); 00102 00103 return TRUE; 00104 } 00105 00106 static DBusCondVar* 00107 dbus_gcondvar_new (void) 00108 { 00109 return (DBusCondVar*)g_cond_new (); 00110 } 00111 00112 static void 00113 dbus_gcondvar_free (DBusCondVar *cond) 00114 { 00115 g_cond_free ((GCond *)cond); 00116 } 00117 00118 static void 00119 dbus_gcondvar_wait (DBusCondVar *cond, 00120 DBusMutex *mutex) 00121 { 00122 g_cond_wait ((GCond *)cond, (GMutex *)mutex); 00123 } 00124 00125 static dbus_bool_t 00126 dbus_gcondvar_wait_timeout (DBusCondVar *cond, 00127 DBusMutex *mutex, 00128 int timeout_msec) 00129 { 00130 GTimeVal now; 00131 00132 g_get_current_time (&now); 00133 00134 now.tv_sec += timeout_msec / 1000; 00135 now.tv_usec += (timeout_msec % 1000) * 1000; 00136 if (now.tv_usec > G_USEC_PER_SEC) 00137 { 00138 now.tv_sec += 1; 00139 now.tv_usec -= G_USEC_PER_SEC; 00140 } 00141 00142 return g_cond_timed_wait ((GCond *)cond, (GMutex *)mutex, &now); 00143 } 00144 00145 static void 00146 dbus_gcondvar_wake_one (DBusCondVar *cond) 00147 { 00148 g_cond_signal ((GCond *)cond); 00149 } 00150 00151 static void 00152 dbus_gcondvar_wake_all (DBusCondVar *cond) 00153 { 00154 g_cond_broadcast ((GCond *)cond); 00155 } 00156 00168 void 00169 dbus_g_thread_init (void) 00170 { 00171 if (!g_thread_supported ()) 00172 g_error ("g_thread_init() must be called before dbus_threads_init()"); 00173 00174 dbus_threads_init (&functions); 00175 } 00176

Generated on Mon Jun 27 07:48:21 2005 for D-BUS by doxygen 1.3.7