Add GRWLock
authorRyan Lortie <desrt@desrt.ca>
Wed, 21 Sep 2011 14:19:36 +0000 (10:19 -0400)
committerRyan Lortie <desrt@desrt.ca>
Wed, 21 Sep 2011 20:09:03 +0000 (16:09 -0400)
glib/glib.symbols
glib/gthread-posix.c
glib/gthread-win32.c
glib/gthread.h
glib/tests/strfuncs.c

index 32bf8c6cf8d1c348a5adee978cd498bf7327aea8..7f798133faaa9930149498989afb7069730cdb66 100644 (file)
@@ -1616,3 +1616,11 @@ g_mutex_unlock
 g_private_new
 g_private_get
 g_private_set
+g_rw_lock_clear
+g_rw_lock_init
+g_rw_lock_reader_lock
+g_rw_lock_reader_trylock
+g_rw_lock_reader_unlock
+g_rw_lock_writer_lock
+g_rw_lock_writer_trylock
+g_rw_lock_writer_unlock
index 76697f23878a9fba9afd3fe45b0e1c8a27454463..c4fd6f2cbf71a719c56e20bbb672007a37d28032 100644 (file)
@@ -197,6 +197,56 @@ g_mutex_trylock (GMutex *mutex)
   return FALSE;
 }
 
+/* {{{1 GRWLock */
+
+void
+g_rw_lock_init (GRWLock *lock)
+{
+  pthread_rwlock_init (&lock->impl, NULL);
+}
+
+void
+g_rw_lock_clear (GRWLock *lock)
+{
+  pthread_rwlock_destroy (&lock->impl);
+}
+
+void
+g_rw_lock_writer_lock (GRWLock *lock)
+{
+  pthread_rwlock_wrlock (&lock->impl);
+}
+
+gboolean
+g_rw_lock_writer_trylock (GRWLock *lock)
+{
+  return pthread_rwlock_trywrlock (&lock->impl);
+}
+
+void
+g_rw_lock_writer_unlock (GRWLock *lock)
+{
+  pthread_rwlock_unlock (&lock->impl);
+}
+
+void
+g_rw_lock_reader_lock (GRWLock *lock)
+{
+  pthread_rwlock_rdlock (&lock->impl);
+}
+
+gboolean
+g_rw_lock_reader_trylock (GRWLock *lock)
+{
+  return pthread_rwlock_tryrdlock (&lock->impl);
+}
+
+void
+g_rw_lock_reader_unlock (GRWLock *lock)
+{
+  pthread_rwlock_unlock (&lock->impl);
+}
+
 /* {{{1 GCond */
 
 /**
index cadd0c7838d332160b5634dfae339a841ee130cf..1213143a6d86817d6d164ba1e42d833645aa6358 100644 (file)
@@ -154,6 +154,57 @@ g_mutex_unlock (GMutex *mutex)
   g_thread_impl_vtable.ReleaseSRWLockExclusive (mutex);
 }
 
+/* {{{1 GRWLock */
+
+void
+g_rw_lock_init (GRWLock *lock)
+{
+  g_thread_impl_vtable.InitializeSRWLock (lock);
+}
+
+void
+g_rw_lock_clear (GRWLock *lock)
+{
+  if (g_thread_impl_vtable.DeleteSRWLock != NULL)
+    g_thread_impl_vtable.DeleteSRWLock (lock);
+}
+
+void
+g_rw_lock_writer_lock (GRWLock *lock)
+{
+  g_thread_impl_vtable.AcquireSRWLockExclusive (lock);
+}
+
+gboolean
+g_rw_lock_writer_trylock (GRWLock *lock)
+{
+  return g_thread_impl_vtable.TryAcquireSRWLockExclusive (lock);
+}
+
+void
+g_rw_lock_writer_unlock (GRWLock *lock)
+{
+  g_thread_impl_vtable.ReleaseSRWLockExclusive (lock);
+}
+
+void
+g_rw_lock_reader_lock (GRWLock *lock)
+{
+  g_thread_impl_vtable.AcquireSRWLockShared (lock);
+}
+
+gboolean
+g_rw_lock_reader_trylock (GRWLock *lock)
+{
+  return g_thread_impl_vtable.TryAcquireSRWLockShared (lock);
+}
+
+void
+g_rw_lock_reader_unlock (GRWLock *lock)
+{
+  g_thread_impl_vtable.ReleaseSRWLockShared (lock);
+}
+
 /* {{{1 GCond */
 void
 g_cond_init (GCond *cond)
index b2db18a3836660593574966c0c31b2ce384aab46..e713f79cc87c80058abd02e9b7d2fb58ae6a42bc 100644 (file)
@@ -53,6 +53,7 @@ typedef gpointer (*GThreadFunc) (gpointer data);
 typedef struct _GThread         GThread;
 
 typedef struct _GMutex          GMutex;
+typedef struct _GRWLock         GRWLock;
 typedef struct _GCond           GCond;
 typedef struct _GPrivate        GPrivate;
 typedef struct _GStaticPrivate  GStaticPrivate;
@@ -62,13 +63,19 @@ typedef struct _GStaticPrivate  GStaticPrivate;
 #define G_MUTEX_INIT { NULL }
 struct _GMutex
 {
-    gpointer impl;
+  gpointer impl;
+};
+
+#define G_RW_LOCK_INIT { NULL }
+struct _GRWLock
+{
+  gpointer impl;
 };
 
 #define G_COND_INIT { NULL }
 struct _GCond
 {
-    gpointer impl;
+  gpointer impl;
 };
 #else
 
@@ -80,6 +87,12 @@ struct _GMutex
   pthread_mutex_t impl;
 };
 
+#define G_RW_LOCK_INIT { PTHREAD_RWLOCK_INITIALIZER }
+struct _GRWLock
+{
+  pthread_rwlock_t impl;
+};
+
 #define G_COND_INIT { PTHREAD_COND_INITIALIZER }
 struct _GCond
 {
@@ -292,6 +305,15 @@ void                    g_mutex_lock                                    (GMutex
 void                    g_mutex_unlock                                  (GMutex         *mutex);
 gboolean                g_mutex_trylock                                 (GMutex         *mutex);
 
+void                    g_rw_lock_init                                  (GRWLock        *lock);
+void                    g_rw_lock_clear                                 (GRWLock        *lock);
+void                    g_rw_lock_writer_lock                           (GRWLock        *lock);
+gboolean                g_rw_lock_writer_trylock                        (GRWLock        *lock);
+void                    g_rw_lock_writer_unlock                         (GRWLock        *lock);
+void                    g_rw_lock_reader_lock                           (GRWLock        *lock);
+gboolean                g_rw_lock_reader_trylock                        (GRWLock        *lock);
+void                    g_rw_lock_reader_unlock                         (GRWLock        *lock);
+
 GCond *                 g_cond_new                                      (void);
 void                    g_cond_free                                     (GCond          *cond);
 void                    g_cond_init                                     (GCond          *cond);
index df8b67dc560723b0e2dac1592b2ac601876acd51..ff632c751678817d1d8bc20688693e4d15c71133 100644 (file)
@@ -19,7 +19,6 @@
  * if advised of the possibility of such damage.
  */
 
-#define _XOPEN_SOURCE
 #include <ctype.h>
 #include <errno.h>
 #include <locale.h>