dbus-threads.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:9k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
  2. /* dbus-threads.h  D-Bus threads handling
  3.  *
  4.  * Copyright (C) 2002  Red Hat Inc.
  5.  *
  6.  * Licensed under the Academic Free License version 2.1
  7.  * 
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  * 
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  21.  *
  22.  */
  23. #if !defined (DBUS_INSIDE_DBUS_H) && !defined (DBUS_COMPILATION)
  24. #error "Only <dbus/dbus.h> can be included directly, this file may disappear or change contents."
  25. #endif
  26. #ifndef DBUS_THREADS_H
  27. #define DBUS_THREADS_H
  28. #include <dbus/dbus-macros.h>
  29. #include <dbus/dbus-types.h>
  30. DBUS_BEGIN_DECLS
  31. /**
  32.  * @addtogroup DBusThreads
  33.  * @{
  34.  */
  35. /** An opaque mutex type provided by the #DBusThreadFunctions implementation installed by dbus_threads_init(). */
  36. typedef struct DBusMutex DBusMutex;
  37. /** An opaque condition variable type provided by the #DBusThreadFunctions implementation installed by dbus_threads_init(). */
  38. typedef struct DBusCondVar DBusCondVar;
  39. /** Deprecated, provide DBusRecursiveMutexNewFunction instead. */
  40. typedef DBusMutex*  (* DBusMutexNewFunction)    (void);
  41. /** Deprecated, provide DBusRecursiveMutexFreeFunction instead. */
  42. typedef void        (* DBusMutexFreeFunction)   (DBusMutex *mutex);
  43. /** Deprecated, provide DBusRecursiveMutexLockFunction instead. Return value is lock success, but gets ignored in practice. */
  44. typedef dbus_bool_t (* DBusMutexLockFunction)   (DBusMutex *mutex);
  45. /** Deprecated, provide DBusRecursiveMutexUnlockFunction instead. Return value is unlock success, but gets ignored in practice. */
  46. typedef dbus_bool_t (* DBusMutexUnlockFunction) (DBusMutex *mutex);
  47. /** Creates a new recursively-lockable mutex, or returns #NULL if not
  48.  * enough memory.  Can only fail due to lack of memory.  Found in
  49.  * #DBusThreadFunctions. Do not just use PTHREAD_MUTEX_RECURSIVE for
  50.  * this, because it does not save/restore the recursion count when
  51.  * waiting on a condition. libdbus requires the Java-style behavior
  52.  * where the mutex is fully unlocked to wait on a condition.
  53.  */
  54. typedef DBusMutex*  (* DBusRecursiveMutexNewFunction)    (void);
  55. /** Frees a recursively-lockable mutex.  Found in #DBusThreadFunctions.
  56.  */
  57. typedef void        (* DBusRecursiveMutexFreeFunction)   (DBusMutex *mutex);
  58. /** Locks a recursively-lockable mutex.  Found in #DBusThreadFunctions.
  59.  * Can only fail due to lack of memory.
  60.  */
  61. typedef void        (* DBusRecursiveMutexLockFunction)   (DBusMutex *mutex);
  62. /** Unlocks a recursively-lockable mutex.  Found in #DBusThreadFunctions.
  63.  * Can only fail due to lack of memory.
  64.  */
  65. typedef void        (* DBusRecursiveMutexUnlockFunction) (DBusMutex *mutex);
  66. /** Creates a new condition variable.  Found in #DBusThreadFunctions.
  67.  * Can only fail (returning #NULL) due to lack of memory.
  68.  */
  69. typedef DBusCondVar*  (* DBusCondVarNewFunction)         (void);
  70. /** Frees a condition variable.  Found in #DBusThreadFunctions.
  71.  */
  72. typedef void          (* DBusCondVarFreeFunction)        (DBusCondVar *cond);
  73. /** Waits on a condition variable.  Found in
  74.  * #DBusThreadFunctions. Must work with either a recursive or
  75.  * nonrecursive mutex, whichever the thread implementation
  76.  * provides. Note that PTHREAD_MUTEX_RECURSIVE does not work with
  77.  * condition variables (does not save/restore the recursion count) so
  78.  * don't try using simply pthread_cond_wait() and a
  79.  * PTHREAD_MUTEX_RECURSIVE to implement this, it won't work right.
  80.  *
  81.  * Has no error conditions. Must succeed if it returns.
  82.  */
  83. typedef void          (* DBusCondVarWaitFunction)        (DBusCondVar *cond,
  84.   DBusMutex   *mutex);
  85. /** Waits on a condition variable with a timeout.  Found in
  86.  *  #DBusThreadFunctions. Returns #TRUE if the wait did not
  87.  *  time out, and #FALSE if it did.
  88.  *
  89.  * Has no error conditions. Must succeed if it returns. 
  90.  */
  91. typedef dbus_bool_t   (* DBusCondVarWaitTimeoutFunction) (DBusCondVar *cond,
  92.   DBusMutex   *mutex,
  93.   int          timeout_milliseconds);
  94. /** Wakes one waiting thread on a condition variable.  Found in #DBusThreadFunctions.
  95.  *
  96.  * Has no error conditions. Must succeed if it returns.
  97.  */
  98. typedef void          (* DBusCondVarWakeOneFunction) (DBusCondVar *cond);
  99. /** Wakes all waiting threads on a condition variable.  Found in #DBusThreadFunctions.
  100.  *
  101.  * Has no error conditions. Must succeed if it returns.
  102.  */
  103. typedef void          (* DBusCondVarWakeAllFunction) (DBusCondVar *cond);
  104. /**
  105.  * Flags indicating which functions are present in #DBusThreadFunctions. Used to allow
  106.  * the library to detect older callers of dbus_threads_init() if new possible functions
  107.  * are added to #DBusThreadFunctions.
  108.  */
  109. typedef enum 
  110. {
  111.   DBUS_THREAD_FUNCTIONS_MUTEX_NEW_MASK      = 1 << 0,
  112.   DBUS_THREAD_FUNCTIONS_MUTEX_FREE_MASK     = 1 << 1,
  113.   DBUS_THREAD_FUNCTIONS_MUTEX_LOCK_MASK     = 1 << 2,
  114.   DBUS_THREAD_FUNCTIONS_MUTEX_UNLOCK_MASK   = 1 << 3,
  115.   DBUS_THREAD_FUNCTIONS_CONDVAR_NEW_MASK    = 1 << 4,
  116.   DBUS_THREAD_FUNCTIONS_CONDVAR_FREE_MASK   = 1 << 5,
  117.   DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_MASK   = 1 << 6,
  118.   DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_TIMEOUT_MASK   = 1 << 7,
  119.   DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ONE_MASK = 1 << 8,
  120.   DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ALL_MASK = 1 << 9,
  121.   DBUS_THREAD_FUNCTIONS_RECURSIVE_MUTEX_NEW_MASK    = 1 << 10,
  122.   DBUS_THREAD_FUNCTIONS_RECURSIVE_MUTEX_FREE_MASK   = 1 << 11,
  123.   DBUS_THREAD_FUNCTIONS_RECURSIVE_MUTEX_LOCK_MASK   = 1 << 12,
  124.   DBUS_THREAD_FUNCTIONS_RECURSIVE_MUTEX_UNLOCK_MASK = 1 << 13,
  125.   DBUS_THREAD_FUNCTIONS_ALL_MASK     = (1 << 14) - 1
  126. } DBusThreadFunctionsMask;
  127. /**
  128.  * Functions that must be implemented to make the D-Bus library
  129.  * thread-aware. The recursive mutex functions should be specified
  130.  * rather than the old, deprecated nonrecursive ones.
  131.  *
  132.  * The condition variable functions have to work with recursive
  133.  * mutexes if you provide those, or with nonrecursive mutexes if you
  134.  * provide those.
  135.  *
  136.  * If implementing threads using pthreads, be aware that
  137.  * PTHREAD_MUTEX_RECURSIVE is broken in combination with condition
  138.  * variables. libdbus relies on the Java-style behavior that when
  139.  * waiting on a condition, the recursion count is saved and restored,
  140.  * and the mutex is completely unlocked, not just decremented one
  141.  * level of recursion.
  142.  *
  143.  * Thus with pthreads you probably have to roll your own emulated
  144.  * recursive mutexes, you can't use PTHREAD_MUTEX_RECURSIVE. This is
  145.  * what dbus_threads_init_default() does on platforms that use
  146.  * pthreads.
  147.  */
  148. typedef struct
  149. {
  150.   unsigned int mask; /**< Mask indicating which functions are present. */
  151.   DBusMutexNewFunction mutex_new; /**< Function to create a mutex; optional and deprecated. */
  152.   DBusMutexFreeFunction mutex_free; /**< Function to free a mutex; optional and deprecated. */
  153.   DBusMutexLockFunction mutex_lock; /**< Function to lock a mutex; optional and deprecated. */
  154.   DBusMutexUnlockFunction mutex_unlock; /**< Function to unlock a mutex; optional and deprecated. */
  155.   DBusCondVarNewFunction condvar_new; /**< Function to create a condition variable */
  156.   DBusCondVarFreeFunction condvar_free; /**< Function to free a condition variable */
  157.   DBusCondVarWaitFunction condvar_wait; /**< Function to wait on a condition */
  158.   DBusCondVarWaitTimeoutFunction condvar_wait_timeout; /**< Function to wait on a condition with a timeout */
  159.   DBusCondVarWakeOneFunction condvar_wake_one; /**< Function to wake one thread waiting on the condition */
  160.   DBusCondVarWakeAllFunction condvar_wake_all; /**< Function to wake all threads waiting on the condition */
  161.  
  162.   DBusRecursiveMutexNewFunction recursive_mutex_new; /**< Function to create a recursive mutex */
  163.   DBusRecursiveMutexFreeFunction recursive_mutex_free; /**< Function to free a recursive mutex */
  164.   DBusRecursiveMutexLockFunction recursive_mutex_lock; /**< Function to lock a recursive mutex */
  165.   DBusRecursiveMutexUnlockFunction recursive_mutex_unlock; /**< Function to unlock a recursive mutex */
  166.   void (* padding1) (void); /**< Reserved for future expansion */
  167.   void (* padding2) (void); /**< Reserved for future expansion */
  168.   void (* padding3) (void); /**< Reserved for future expansion */
  169.   void (* padding4) (void); /**< Reserved for future expansion */
  170.   
  171. } DBusThreadFunctions;
  172. dbus_bool_t  dbus_threads_init         (const DBusThreadFunctions *functions);
  173. dbus_bool_t  dbus_threads_init_default (void);
  174. /** @} */
  175. DBUS_END_DECLS
  176. #endif /* DBUS_THREADS_H */