void mowgli_atomic_bootstrap() {
for(int i = 0; i < 256; i++)
- mowgli_mutex_create(&mowgli_atomic_mutex[i]);
+ mowgli_mutex_init(&mowgli_atomic_mutex[i]);
}
bh->use_mmap = allocator != NULL ? FALSE : TRUE;
#endif
- if(mowgli_mutex_create(&bh->mutex) != 0)
+ if(mowgli_mutex_init(&bh->mutex) != 0)
mowgli_throw_exception_fatal("heap mutex can't be created");
if (flags & BH_NOW)
if (heap->empty_block)
mowgli_heap_shrink(heap, heap->empty_block);
- mowgli_mutex_destroy(&heap->mutex);
+ mowgli_mutex_uninit(&heap->mutex);
/* everything related to heap has gone, time for itself */
mowgli_free(heap);
eventloop->eventloop_ops = &_mowgli_winsock_pollops;
#endif
- if (mowgli_mutex_create(&eventloop->mutex) != 0)
+ if (mowgli_mutex_init(&eventloop->mutex) != 0)
{
mowgli_log("couldn't create mutex for eventloop %p, aborting...", eventloop);
abort();
{
eventloop->eventloop_ops->pollshutdown(eventloop);
- mowgli_mutex_destroy(&eventloop->mutex);
+ mowgli_mutex_uninit(&eventloop->mutex);
mowgli_heap_free(eventloop_heap, eventloop);
}
#ifndef __MOWGLI_EVENTLOOP_EVENTLOOP_H__
#define __MOWGLI_EVENTLOOP_EVENTLOOP_H__
-#include "thread/thread.h"
-
#ifndef _WIN32
typedef int mowgli_descriptor_t;
{
mowgli_global_storage_dict = mowgli_patricia_create(_storage_key_canon);
- mowgli_mutex_create(&mowgli_global_storage_lock);
+ mowgli_mutex_init(&mowgli_global_storage_lock);
}
void *
#include "container/list.h"
#include "object/class.h"
#include "object/object.h"
+
#include "core/allocation_policy.h"
#include "core/alloc.h"
+
+#include "thread/thread.h"
+#include "thread/mutex.h"
+
#include "base/memslice.h"
#include "container/patricia.h"
#include "module/module.h"
#include "core/allocator.h"
#include "base/formatter.h"
#include "container/index.h"
-#include "thread/thread.h"
+
#include "ext/confparse.h"
#include "ext/program_opts.h"
#include "concurrent/atomic.h"
posix_mutexops.c \
win32_mutexops.c
-INCLUDES = thread.h
+INCLUDES = thread.h mutex.h
include ../../../buildsys.mk
return &_mowgli_null_mutex_ops;
}
-int mowgli_mutex_create(mowgli_mutex_t *mutex)
+mowgli_mutex_t *mowgli_mutex_create(void)
+{
+ mowgli_mutex_t *mutex = mowgli_alloc(sizeof(mowgli_mutex_t));
+
+ return_val_if_fail(mutex != NULL, NULL);
+
+ if(mowgli_mutex_init(mutex)) {
+ return mutex;
+ } else {
+ mowgli_free(mutex);
+ return NULL;
+ }
+}
+
+int mowgli_mutex_init(mowgli_mutex_t *mutex)
{
static bool initialized = false;
mowgli_mutex_ops_t *mutex_ops = get_mutex_platform();
return mutex_ops->mutex_unlock(mutex);
}
-int mowgli_mutex_destroy(mowgli_mutex_t *mutex)
+int mowgli_mutex_uninit(mowgli_mutex_t *mutex)
{
mowgli_mutex_ops_t *mutex_ops = get_mutex_platform();
return mutex_ops->mutex_destroy(mutex);
}
+mowgli_mutex_t *mowgli_mutex_destroy(mowgli_mutex_t *mutex) {
+ if(mutex != NULL)
+ return NULL;
+
+ return_val_if_fail(mowgli_mutex_uninit(mutex) != 0, NULL);
+
+ mowgli_free(mutex);
+
+ return NULL;
+}
+
void mowgli_mutex_set_policy(mowgli_thread_policy_t policy)
{
switch (policy)
--- /dev/null
+/*
+ * libmowgli: A collection of useful routines for programming.
+ * mutex.h: Cross-platform mutexes.
+ *
+ * Copyright (c) 2011 William Pitcock <nenolod@dereferenced.org>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice is present in all copies.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __MOWGLI_MUTEX_H__
+#define __MOWGLI_MUTEX_H__
+
+#if defined(__sun) || defined(__sco)
+# include <thread.h>
+# include <synch.h>
+# define MOWGLI_FEATURE_HAVE_NATIVE_MUTEXES
+# define MOWGLI_NATIVE_MUTEX_DECL(name) mutex_t (name)
+#elif defined(_WIN32)
+# define MOWGLI_FEATURE_HAVE_NATIVE_MUTEXES
+# define MOWGLI_NATIVE_MUTEX_DECL(name) HANDLE (name)
+#else
+# include <pthread.h>
+#endif
+
+typedef struct {
+#ifdef MOWGLI_FEATURE_HAVE_NATIVE_MUTEXES
+ MOWGLI_NATIVE_MUTEX_DECL(mutex);
+#else
+ pthread_mutex_t mutex;
+#endif
+} mowgli_mutex_t;
+
+#ifdef MOWGLI_NATIVE_MUTEX_DECL
+# undef MOWGLI_NATIVE_MUTEX_DECL
+#endif
+
+typedef struct {
+ int (*mutex_create)(mowgli_mutex_t *mutex);
+ int (*mutex_lock)(mowgli_mutex_t *mutex);
+ int (*mutex_trylock)(mowgli_mutex_t *mutex);
+ int (*mutex_unlock)(mowgli_mutex_t *mutex);
+ int (*mutex_destroy)(mowgli_mutex_t *mutex);
+} mowgli_mutex_ops_t;
+
+mowgli_mutex_t *mowgli_mutex_create(void);
+int mowgli_mutex_init(mowgli_mutex_t* mutex);
+int mowgli_mutex_lock(mowgli_mutex_t *mutex);
+int mowgli_mutex_trylock(mowgli_mutex_t *mutex);
+int mowgli_mutex_unlock(mowgli_mutex_t *mutex);
+int mowgli_mutex_uninit(mowgli_mutex_t *mutex);
+mowgli_mutex_t *mowgli_mutex_destroy(mowgli_mutex_t *mutex);
+
+void mowgli_mutex_set_policy(mowgli_thread_policy_t policy);
+
+/* simple dispatch function to set the ops up for the various subsystems. */
+static inline void mowgli_thread_set_policy(mowgli_thread_policy_t policy)
+{
+ mowgli_mutex_set_policy(policy);
+}
+
+#endif
+
#if defined(__sun) || defined(__sco)
# include <thread.h>
-# include <synch.h>
-# define MOWGLI_FEATURE_HAVE_NATIVE_MUTEXES
# define MOWGLI_FEATURE_HAVE_NATIVE_THREADS
-# define MOWGLI_NATIVE_MUTEX_DECL(name) mutex_t (name)
# define MOWGLI_NATIVE_THREAD_DECL(name) thread_t (name)
#elif defined(_WIN32)
-# define MOWGLI_FEATURE_HAVE_NATIVE_MUTEXES
# define MOWGLI_FEATURE_HAVE_NATIVE_THREADS
-# define MOWGLI_NATIVE_MUTEX_DECL(name) HANDLE (name)
# define MOWGLI_NATIVE_THREAD_DECL(name) HANDLE (name)
#else
# include <pthread.h>
#endif
-typedef struct {
-#ifdef MOWGLI_FEATURE_HAVE_NATIVE_MUTEXES
- MOWGLI_NATIVE_MUTEX_DECL(mutex);
-#else
- pthread_mutex_t mutex;
-#endif
-} mowgli_mutex_t;
-
-#ifdef MOWGLI_NATIVE_MUTEX_DECL
-# undef MOWGLI_NATIVE_MUTEX_DECL
-#endif
-
-typedef struct {
- int (*mutex_create)(mowgli_mutex_t *mutex);
- int (*mutex_lock)(mowgli_mutex_t *mutex);
- int (*mutex_trylock)(mowgli_mutex_t *mutex);
- int (*mutex_unlock)(mowgli_mutex_t *mutex);
- int (*mutex_destroy)(mowgli_mutex_t *mutex);
-} mowgli_mutex_ops_t;
-
-int mowgli_mutex_create(mowgli_mutex_t *mutex);
-int mowgli_mutex_lock(mowgli_mutex_t *mutex);
-int mowgli_mutex_trylock(mowgli_mutex_t *mutex);
-int mowgli_mutex_unlock(mowgli_mutex_t *mutex);
-int mowgli_mutex_destroy(mowgli_mutex_t *mutex);
-
typedef struct {
#ifdef MOWGLI_FEATURE_HAVE_NATIVE_THREADS
MOWGLI_NATIVE_THREAD_DECL(thread);
MOWGLI_THREAD_POLICY_DISABLED,
} mowgli_thread_policy_t;
-void mowgli_mutex_set_policy(mowgli_thread_policy_t policy);
-
-/* simple dispatch function to set the ops up for the various subsystems. */
-static inline void mowgli_thread_set_policy(mowgli_thread_policy_t policy)
-{
- mowgli_mutex_set_policy(policy);
-}
+#endif
-#endif /* !__MOWGLI_THREAD_H__ */