Deprecate g_thread_create_full()
[platform/upstream/glib.git] / glib / gthread.h
index 82d40c0..a1c9c3d 100644 (file)
@@ -50,6 +50,9 @@ typedef enum
 
 typedef gpointer (*GThreadFunc) (gpointer data);
 
+/* This is "deprecated", but we can't actually remove it since
+ * g_thread_create_full takes it.
+ */
 typedef enum
 {
   G_THREAD_PRIORITY_LOW,
@@ -73,6 +76,37 @@ typedef struct _GCond           GCond;
 typedef struct _GPrivate        GPrivate;
 typedef struct _GStaticPrivate  GStaticPrivate;
 
+#ifdef G_OS_WIN32
+
+#define G_MUTEX_INIT { NULL }
+struct _GMutex
+{
+    gpointer impl;
+};
+
+#define G_COND_INIT { NULL }
+struct _GCond
+{
+    gpointer impl;
+};
+#else
+
+#include <pthread.h>
+
+#define G_MUTEX_INIT { PTHREAD_MUTEX_INITIALIZER }
+struct _GMutex
+{
+  pthread_mutex_t impl;
+};
+
+#define G_COND_INIT { PTHREAD_COND_INITIALIZER }
+struct _GCond
+{
+  pthread_cond_t impl;
+};
+
+#endif
+
 typedef struct _GThreadFunctions GThreadFunctions;
 struct _GThreadFunctions
 {
@@ -116,7 +150,9 @@ GLIB_VAR GThreadFunctions       g_thread_functions_for_glib_use;
 GLIB_VAR gboolean               g_thread_use_default_impl;
 GLIB_VAR gboolean               g_threads_got_initialized;
 
+#ifndef G_DISABLE_DEPRECATED
 GLIB_VAR guint64   (*g_thread_gettime) (void);
+#endif
 
 /* initializes the mutex/cond/private implementation for glib, might
  * only be called once, and must not be called directly or indirectly
@@ -124,103 +160,21 @@ GLIB_VAR guint64   (*g_thread_gettime) (void);
  */
 void    g_thread_init   (GThreadFunctions       *vtable);
 
-/* Errorcheck mutexes. If you define G_ERRORCHECK_MUTEXES, then all
- * mutexes will check for re-locking and re-unlocking */
-
-/* Initialize thread system with errorcheck mutexes. vtable must be
- * NULL. Do not call directly. Use #define G_ERRORCHECK_MUTEXES
- * instead.
- */
-void    g_thread_init_with_errorcheck_mutexes (GThreadFunctions* vtable);
-
 /* Checks if thread support is initialized.  Identical to the
  * g_thread_supported macro but provided for language bindings.
  */
 gboolean g_thread_get_initialized (void);
 
-/* A random number to recognize debug calls to g_mutex_... */
-#define G_MUTEX_DEBUG_MAGIC 0xf8e18ad7
-
-#ifdef G_ERRORCHECK_MUTEXES
-#define g_thread_init(vtable) g_thread_init_with_errorcheck_mutexes (vtable)
-#endif
-
 /* internal function for fallback static mutex implementation */
 GMutex* g_static_mutex_get_mutex_impl   (GMutex **mutex);
 
-#define g_static_mutex_get_mutex_impl_shortcut(mutex) \
-  (g_atomic_pointer_get (mutex) ? *(mutex) : \
-   g_static_mutex_get_mutex_impl (mutex))
-
-/* shorthands for conditional and unconditional function calls */
-
-#define G_THREAD_UF(op, arglist)                                       \
-    (*g_thread_functions_for_glib_use . op) arglist
-#define G_THREAD_CF(op, fail, arg)                                     \
-    (g_thread_supported () ? G_THREAD_UF (op, arg) : (fail))
-#define G_THREAD_ECF(op, fail, mutex, type)                            \
-    (g_thread_supported () ?                                           \
-      ((type(*)(GMutex*, const gulong, gchar const*))                  \
-      (*g_thread_functions_for_glib_use . op))                         \
-     (mutex, G_MUTEX_DEBUG_MAGIC, G_STRLOC) : (fail))
-
-#ifndef G_ERRORCHECK_MUTEXES
-# define g_mutex_lock(mutex)                                           \
-    G_THREAD_CF (mutex_lock,     (void)0, (mutex))
-# define g_mutex_trylock(mutex)                                                \
-    G_THREAD_CF (mutex_trylock,  TRUE,    (mutex))
-# define g_mutex_unlock(mutex)                                         \
-    G_THREAD_CF (mutex_unlock,   (void)0, (mutex))
-# define g_mutex_free(mutex)                                           \
-    G_THREAD_CF (mutex_free,     (void)0, (mutex))
-# define g_cond_wait(cond, mutex)                                      \
-    G_THREAD_CF (cond_wait,      (void)0, (cond, mutex))
-# define g_cond_timed_wait(cond, mutex, abs_time)                      \
-    G_THREAD_CF (cond_timed_wait, TRUE,   (cond, mutex, abs_time))
-#else /* G_ERRORCHECK_MUTEXES */
-# define g_mutex_lock(mutex)                                           \
-    G_THREAD_ECF (mutex_lock,    (void)0, (mutex), void)
-# define g_mutex_trylock(mutex)                                                \
-    G_THREAD_ECF (mutex_trylock, TRUE,    (mutex), gboolean)
-# define g_mutex_unlock(mutex)                                         \
-    G_THREAD_ECF (mutex_unlock,  (void)0, (mutex), void)
-# define g_mutex_free(mutex)                                           \
-    G_THREAD_ECF (mutex_free,    (void)0, (mutex), void)
-# define g_cond_wait(cond, mutex)                                      \
-    (g_thread_supported () ? ((void(*)(GCond*, GMutex*, gulong, gchar*))\
-      g_thread_functions_for_glib_use.cond_wait)                       \
-        (cond, mutex, G_MUTEX_DEBUG_MAGIC, G_STRLOC) : (void) 0)
-# define g_cond_timed_wait(cond, mutex, abs_time)                      \
-    (g_thread_supported () ?                                           \
-      ((gboolean(*)(GCond*, GMutex*, GTimeVal*, gulong, gchar*))       \
-        g_thread_functions_for_glib_use.cond_timed_wait)               \
-          (cond, mutex, abs_time, G_MUTEX_DEBUG_MAGIC, G_STRLOC) : TRUE)
-#endif /* G_ERRORCHECK_MUTEXES */
-
-#if defined(G_THREADS_ENABLED) && defined(G_THREADS_MANDATORY)
+#if defined(G_THREADS_MANDATORY)
 #define g_thread_supported()     1
 #else
 #define g_thread_supported()    (g_threads_got_initialized)
 #endif
-#define g_mutex_new()            G_THREAD_UF (mutex_new,      ())
-#define g_cond_new()             G_THREAD_UF (cond_new,       ())
-#define g_cond_signal(cond)      G_THREAD_CF (cond_signal,    (void)0, (cond))
-#define g_cond_broadcast(cond)   G_THREAD_CF (cond_broadcast, (void)0, (cond))
-#define g_cond_free(cond)        G_THREAD_CF (cond_free,      (void)0, (cond))
-#define g_private_new(destructor) G_THREAD_UF (private_new, (destructor))
-#define g_private_get(private_key) G_THREAD_CF (private_get, \
-                                                ((gpointer)private_key), \
-                                                (private_key))
-#define g_private_set(private_key, value) G_THREAD_CF (private_set, \
-                                                       (void) (private_key = \
-                                                        (GPrivate*) (value)), \
-                                                       (private_key, value))
-#define g_thread_yield()              G_THREAD_CF (thread_yield, (void)0, ())
-
-#define g_thread_create(func, data, joinable, error)                   \
-  (g_thread_create_full (func, data, 0, joinable, FALSE,               \
-                         G_THREAD_PRIORITY_NORMAL, error))
 
+#ifndef G_DISABLE_DEPRECATED
 GThread* g_thread_create_full  (GThreadFunc            func,
                                 gpointer               data,
                                 gulong                 stack_size,
@@ -228,18 +182,42 @@ GThread* g_thread_create_full  (GThreadFunc            func,
                                 gboolean               bound,
                                 GThreadPriority        priority,
                                 GError               **error);
+#endif
+
+GThread *       g_thread_create                 (GThreadFunc   func,
+                                                 gpointer      data,
+                                                 gboolean      joinable,
+                                                 GError      **error);
+
+GThread *       g_thread_create_with_stack_size (GThreadFunc   func,
+                                                 gpointer      data,
+                                                 gboolean      joinable,
+                                                 gsize         stack_size,
+                                                 GError      **error);
+
 GThread* g_thread_self         (void);
 void     g_thread_exit         (gpointer               retval);
 gpointer g_thread_join         (GThread               *thread);
+void     g_thread_yield        (void);
 
+#ifndef G_DISABLE_DEPRECATED
 void     g_thread_set_priority (GThread               *thread,
                                 GThreadPriority        priority);
+#endif
+
+#ifdef G_OS_WIN32
+typedef GMutex * GStaticMutex;
+#define G_STATIC_MUTEX_INIT NULL
+#define g_static_mutex_get_mutex g_static_mutex_get_mutex_impl
+#else /* G_OS_WIN32 */
+typedef struct {
+  struct _GMutex *unused;
+  GMutex mutex;
+} GStaticMutex;
+#define G_STATIC_MUTEX_INIT { NULL, G_MUTEX_INIT }
+#define g_static_mutex_get_mutex(s) (&(s)->mutex)
+#endif /* G_OS_WIN32 */
 
-/* GStaticMutexes can be statically initialized with the value
- * G_STATIC_MUTEX_INIT, and then they can directly be used, that is
- * much easier, than having to explicitly allocate the mutex before
- * use
- */
 #define g_static_mutex_lock(mutex) \
     g_mutex_lock (g_static_mutex_get_mutex (mutex))
 #define g_static_mutex_trylock(mutex) \
@@ -271,7 +249,7 @@ struct _GStaticRecMutex
   GSystemThread owner;
 };
 
-#define G_STATIC_REC_MUTEX_INIT { G_STATIC_MUTEX_INIT }
+#define G_STATIC_REC_MUTEX_INIT { G_STATIC_MUTEX_INIT, 0, {{0, 0, 0, 0}} }
 void     g_static_rec_mutex_init        (GStaticRecMutex *mutex);
 void     g_static_rec_mutex_lock        (GStaticRecMutex *mutex);
 gboolean g_static_rec_mutex_trylock     (GStaticRecMutex *mutex);
@@ -362,45 +340,68 @@ g_once_init_enter (volatile gsize *value_location)
  */
 extern void glib_dummy_decl (void);
 #define G_LOCK_NAME(name)               g__ ## name ## _lock
-#ifdef  G_THREADS_ENABLED
-#  define G_LOCK_DEFINE_STATIC(name)    static G_LOCK_DEFINE (name)
-#  define G_LOCK_DEFINE(name)           \
-    GStaticMutex G_LOCK_NAME (name) = G_STATIC_MUTEX_INIT
-#  define G_LOCK_EXTERN(name)           extern GStaticMutex G_LOCK_NAME (name)
-
-#  ifdef G_DEBUG_LOCKS
-#    define G_LOCK(name)                G_STMT_START{             \
-        g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,                   \
-               "file %s: line %d (%s): locking: %s ",             \
-               __FILE__,        __LINE__, G_STRFUNC,              \
-               #name);                                            \
-        g_static_mutex_lock (&G_LOCK_NAME (name));                \
-     }G_STMT_END
-#    define G_UNLOCK(name)              G_STMT_START{             \
-        g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,                   \
-               "file %s: line %d (%s): unlocking: %s ",           \
-               __FILE__,        __LINE__, G_STRFUNC,              \
-               #name);                                            \
-       g_static_mutex_unlock (&G_LOCK_NAME (name));               \
-     }G_STMT_END
-#    define G_TRYLOCK(name)                                       \
-        (g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,                  \
-               "file %s: line %d (%s): try locking: %s ",         \
-               __FILE__,        __LINE__, G_STRFUNC,              \
-               #name), g_static_mutex_trylock (&G_LOCK_NAME (name)))
-#  else  /* !G_DEBUG_LOCKS */
-#    define G_LOCK(name) g_static_mutex_lock       (&G_LOCK_NAME (name))
-#    define G_UNLOCK(name) g_static_mutex_unlock   (&G_LOCK_NAME (name))
-#    define G_TRYLOCK(name) g_static_mutex_trylock (&G_LOCK_NAME (name))
-#  endif /* !G_DEBUG_LOCKS */
-#else   /* !G_THREADS_ENABLED */
-#  define G_LOCK_DEFINE_STATIC(name)    extern void glib_dummy_decl (void)
-#  define G_LOCK_DEFINE(name)           extern void glib_dummy_decl (void)
-#  define G_LOCK_EXTERN(name)           extern void glib_dummy_decl (void)
-#  define G_LOCK(name)
-#  define G_UNLOCK(name)
-#  define G_TRYLOCK(name)               (TRUE)
-#endif  /* !G_THREADS_ENABLED */
+#define G_LOCK_DEFINE_STATIC(name)    static G_LOCK_DEFINE (name)
+#define G_LOCK_DEFINE(name)           \
+  GMutex G_LOCK_NAME (name) = G_MUTEX_INIT
+#define G_LOCK_EXTERN(name)           extern GMutex G_LOCK_NAME (name)
+
+#ifdef G_DEBUG_LOCKS
+#  define G_LOCK(name)                G_STMT_START{             \
+      g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,                   \
+             "file %s: line %d (%s): locking: %s ",             \
+             __FILE__,        __LINE__, G_STRFUNC,              \
+             #name);                                            \
+      g_mutex_lock (&G_LOCK_NAME (name));                       \
+   }G_STMT_END
+#  define G_UNLOCK(name)              G_STMT_START{             \
+      g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,                   \
+             "file %s: line %d (%s): unlocking: %s ",           \
+             __FILE__,        __LINE__, G_STRFUNC,              \
+             #name);                                            \
+     g_mutex_unlock (&G_LOCK_NAME (name));                      \
+   }G_STMT_END
+#  define G_TRYLOCK(name)                                       \
+      (g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,                  \
+             "file %s: line %d (%s): try locking: %s ",         \
+             __FILE__,        __LINE__, G_STRFUNC,              \
+             #name), g_mutex_trylock (&G_LOCK_NAME (name)))
+#else  /* !G_DEBUG_LOCKS */
+#  define G_LOCK(name) g_mutex_lock       (&G_LOCK_NAME (name))
+#  define G_UNLOCK(name) g_mutex_unlock   (&G_LOCK_NAME (name))
+#  define G_TRYLOCK(name) g_mutex_trylock (&G_LOCK_NAME (name))
+#endif /* !G_DEBUG_LOCKS */
+
+
+void                    g_mutex_init                                    (GMutex         *mutex);
+void                    g_mutex_clear                                   (GMutex         *mutex);
+
+void                    g_mutex_lock                                    (GMutex         *mutex);
+void                    g_mutex_unlock                                  (GMutex         *mutex);
+gboolean                g_mutex_trylock                                 (GMutex         *mutex);
+
+void                    g_cond_init                                     (GCond          *cond);
+void                    g_cond_clear                                    (GCond          *cond);
+
+void                    g_cond_wait                                     (GCond          *cond,
+                                                                         GMutex         *mutex);
+void                    g_cond_signal                                   (GCond          *cond);
+void                    g_cond_broadcast                                (GCond          *cond);
+gboolean                g_cond_timed_wait                               (GCond          *cond,
+                                                                         GMutex         *mutex,
+                                                                         GTimeVal       *timeval);
+gboolean                g_cond_timedwait                                (GCond          *cond,
+                                                                         GMutex         *mutex,
+                                                                         gint64          abs_time);
+
+GMutex *                g_mutex_new                                     (void);
+void                    g_mutex_free                                    (GMutex         *mutex);
+GCond *                 g_cond_new                                      (void);
+void                    g_cond_free                                     (GCond          *cond);
+
+GPrivate *              g_private_new                                   (GDestroyNotify  notify);
+gpointer                g_private_get                                   (GPrivate       *key);
+void                    g_private_set                                   (GPrivate       *key,
+                                                                         gpointer        value);
 
 G_END_DECLS