summaryrefslogtreecommitdiff
path: root/libs/libmdbx/src/test/darwin
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2019-08-28 18:35:09 +0300
committerGeorge Hazan <ghazan@miranda.im>2019-08-28 18:35:09 +0300
commitdc7dfedb811ebac3b078113443da231043bd4b29 (patch)
tree04ba9abd6ba6fe57244f138048833f071f2857c1 /libs/libmdbx/src/test/darwin
parent491d424f91413ca196d0611c36605651b7723433 (diff)
libmdbx: merge with 0.3.2
Diffstat (limited to 'libs/libmdbx/src/test/darwin')
-rw-r--r--libs/libmdbx/src/test/darwin/LICENSE24
-rw-r--r--libs/libmdbx/src/test/darwin/README.md8
-rw-r--r--libs/libmdbx/src/test/darwin/pthread_barrier.c110
-rw-r--r--libs/libmdbx/src/test/darwin/pthread_barrier.h83
4 files changed, 225 insertions, 0 deletions
diff --git a/libs/libmdbx/src/test/darwin/LICENSE b/libs/libmdbx/src/test/darwin/LICENSE
new file mode 100644
index 0000000000..6a0dd3066b
--- /dev/null
+++ b/libs/libmdbx/src/test/darwin/LICENSE
@@ -0,0 +1,24 @@
+Copyright (c) 2015, Aleksey Demakov
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT HOLDER OR CONTRIBUTORS 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.
+
diff --git a/libs/libmdbx/src/test/darwin/README.md b/libs/libmdbx/src/test/darwin/README.md
new file mode 100644
index 0000000000..a6a8fd1a91
--- /dev/null
+++ b/libs/libmdbx/src/test/darwin/README.md
@@ -0,0 +1,8 @@
+# DarwinPthreadBarrier
+
+A pthread_barrier_t implementation for Mac OS/X
+
+There is no pthread_barrier_t in Mac OS/X pthreads. This project fixes
+this omission by providing a simple-minded barrier implementation based
+on a pair of pthread_mutex_t and pthread_cond_t.
+
diff --git a/libs/libmdbx/src/test/darwin/pthread_barrier.c b/libs/libmdbx/src/test/darwin/pthread_barrier.c
new file mode 100644
index 0000000000..054aa00708
--- /dev/null
+++ b/libs/libmdbx/src/test/darwin/pthread_barrier.c
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2015, Aleksey Demakov
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT HOLDER OR CONTRIBUTORS 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.
+ */
+
+#include "pthread_barrier.h"
+
+#include <errno.h>
+
+#ifdef __APPLE__
+
+int pthread_barrierattr_init(pthread_barrierattr_t *attr) {
+ memset(attr, 0, sizeof(pthread_barrierattr_t));
+ int m = pthread_mutexattr_init(&attr->mattr);
+ int c = pthread_condattr_init(&attr->cattr);
+ return m ? m : c;
+}
+
+int pthread_barrierattr_destroy(pthread_barrierattr_t *attr) {
+ int c = pthread_condattr_destroy(&attr->cattr);
+ int m = pthread_mutexattr_destroy(&attr->mattr);
+ return m ? m : c;
+}
+
+int pthread_barrierattr_getpshared(const pthread_barrierattr_t *__restrict attr,
+ int *__restrict pshared) {
+ return pthread_condattr_getpshared(&attr->cattr, pshared);
+}
+
+int pthread_barrierattr_setpshared(pthread_barrierattr_t *attr, int pshared) {
+ int m = pthread_mutexattr_setpshared(&attr->mattr, pshared);
+ int c = pthread_condattr_setpshared(&attr->cattr, pshared);
+ return m ? m : c;
+}
+
+int pthread_barrier_init(pthread_barrier_t *__restrict barrier,
+ const pthread_barrierattr_t *__restrict attr,
+ unsigned count) {
+ if (count == 0)
+ return errno = EINVAL;
+
+ int rc = pthread_mutex_init(&barrier->mutex, attr ? &attr->mattr : 0);
+ if (rc)
+ return rc;
+
+ rc = pthread_cond_init(&barrier->cond, attr ? &attr->cattr : 0);
+ if (rc) {
+ int errno_save = errno;
+ pthread_mutex_destroy(&barrier->mutex);
+ errno = errno_save;
+ return rc;
+ }
+
+ barrier->limit = count;
+ barrier->count = 0;
+ barrier->phase = 0;
+ return 0;
+}
+
+int pthread_barrier_destroy(pthread_barrier_t *barrier) {
+ pthread_mutex_destroy(&barrier->mutex);
+ pthread_cond_destroy(&barrier->cond);
+ return 0;
+}
+
+int pthread_barrier_wait(pthread_barrier_t *barrier) {
+ int rc = pthread_mutex_lock(&barrier->mutex);
+ if (rc)
+ return rc;
+
+ barrier->count++;
+ if (barrier->count >= barrier->limit) {
+ barrier->phase++;
+ barrier->count = 0;
+ pthread_cond_broadcast(&barrier->cond);
+ pthread_mutex_unlock(&barrier->mutex);
+ return PTHREAD_BARRIER_SERIAL_THREAD;
+ } else {
+ unsigned phase = barrier->phase;
+ do
+ pthread_cond_wait(&barrier->cond, &barrier->mutex);
+ while (phase == barrier->phase);
+ pthread_mutex_unlock(&barrier->mutex);
+ return 0;
+ }
+}
+
+#endif /* __APPLE__ */
diff --git a/libs/libmdbx/src/test/darwin/pthread_barrier.h b/libs/libmdbx/src/test/darwin/pthread_barrier.h
new file mode 100644
index 0000000000..efa9b9b751
--- /dev/null
+++ b/libs/libmdbx/src/test/darwin/pthread_barrier.h
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2015, Aleksey Demakov
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT HOLDER OR CONTRIBUTORS 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 PTHREAD_BARRIER_H
+#define PTHREAD_BARRIER_H
+
+#include <pthread.h>
+
+#ifdef __APPLE__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if !defined(PTHREAD_BARRIER_SERIAL_THREAD)
+#define PTHREAD_BARRIER_SERIAL_THREAD (1)
+#endif
+
+#if !defined(PTHREAD_PROCESS_PRIVATE)
+#define PTHREAD_PROCESS_PRIVATE (42)
+#endif
+#if !defined(PTHREAD_PROCESS_SHARED)
+#define PTHREAD_PROCESS_SHARED (43)
+#endif
+
+typedef struct {
+ pthread_mutexattr_t mattr;
+ pthread_condattr_t cattr;
+} pthread_barrierattr_t;
+
+typedef struct {
+ pthread_mutex_t mutex;
+ pthread_cond_t cond;
+ unsigned int limit;
+ unsigned int count;
+ unsigned int phase;
+} pthread_barrier_t;
+
+int pthread_barrierattr_init(pthread_barrierattr_t *attr);
+int pthread_barrierattr_destroy(pthread_barrierattr_t *attr);
+
+int pthread_barrierattr_getpshared(const pthread_barrierattr_t *__restrict attr,
+ int *__restrict pshared);
+int pthread_barrierattr_setpshared(pthread_barrierattr_t *attr, int pshared);
+
+int pthread_barrier_init(pthread_barrier_t *__restrict barrier,
+ const pthread_barrierattr_t *__restrict attr,
+ unsigned int count);
+int pthread_barrier_destroy(pthread_barrier_t *barrier);
+
+int pthread_barrier_wait(pthread_barrier_t *barrier);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __APPLE__ */
+
+#endif /* PTHREAD_BARRIER_H */