diff --git a/Makefile b/Makefile index 1abc03d6..92623b7d 100644 --- a/Makefile +++ b/Makefile @@ -23,6 +23,7 @@ suffix ?= CC ?= gcc CXX ?= g++ +LD ?= ld CFLAGS ?= -O2 -g3 -Wall -Werror -Wextra -ffunction-sections -fPIC -fvisibility=hidden XCFLAGS ?= -DNDEBUG=1 -DMDBX_DEBUG=0 -DLIBMDBX_EXPORTS=1 @@ -32,8 +33,8 @@ TESTDB ?= $(shell [ -d /dev/shm ] && echo /dev/shm || echo /tmp)/mdbx-test.db TESTLOG ?= $(shell [ -d /dev/shm ] && echo /dev/shm || echo /tmp)/mdbx-test.log # LY: '--no-as-needed,-lrt' for ability to built with modern glibc, but then run with the old -LDFLAGS ?= -Wl,--gc-sections,-z,relro,-O1,--no-as-needed,-lrt -EXE_LDFLAGS ?= -pthread -lrt +LDFLAGS ?= $(shell $(LD) --help 2>/dev/null | grep -q -- --gc-sections && echo '-Wl,--gc-sections,-z,relro,-O1')$(shell $(LD) --help 2>/dev/null | grep -q -- -dead_strip && echo '-Wl,-dead_strip') +EXE_LDFLAGS ?= -pthread # LY: just for benchmarking IOARENA ?= $(shell \ diff --git a/src/bits.h b/src/bits.h index 52e89f45..aded72c8 100644 --- a/src/bits.h +++ b/src/bits.h @@ -30,6 +30,10 @@ # define _FILE_OFFSET_BITS 64 #endif +#ifdef __APPLE__ +#define _DARWIN_C_SOURCE +#endif + #ifdef _MSC_VER # if _MSC_VER < 1400 # error "Microsoft Visual C++ 8.0 (Visual Studio 2005) or later version is required" diff --git a/src/lck-posix.c b/src/lck-posix.c index bbb07c4f..37f4026e 100644 --- a/src/lck-posix.c +++ b/src/lck-posix.c @@ -18,7 +18,7 @@ * even though they don't support Robust Mutexes. * Compile with -DMDBX_USE_ROBUST=0. */ #ifndef MDBX_USE_ROBUST -#if defined(EOWNERDEAD) || _POSIX_C_SOURCE >= 200809L +#if (defined(EOWNERDEAD) || _POSIX_C_SOURCE >= 200809L) && !defined(__APPLE__) #define MDBX_USE_ROBUST 1 #else #define MDBX_USE_ROBUST 0 diff --git a/src/mdbx.c b/src/mdbx.c index 138f4e0e..93eef3d0 100644 --- a/src/mdbx.c +++ b/src/mdbx.c @@ -292,6 +292,16 @@ static CRITICAL_SECTION rthc_critical_section; #else int __cxa_thread_atexit_impl(void (*dtor)(void *), void *obj, void *dso_symbol) __attribute__((weak)); +#ifdef __APPLE__ /* FIXME: Thread-Local Storage destructors & DSO-unloading */ +int __cxa_thread_atexit_impl(void (*dtor)(void *), void *obj, + void *dso_symbol) { + (void)dtor; + (void)obj; + (void)dso_symbol; + return -1; +} +#endif /* __APPLE__ */ + static pthread_mutex_t mdbx_rthc_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t mdbx_rthc_cond = PTHREAD_COND_INITIALIZER; static mdbx_thread_key_t mdbx_rthc_key; @@ -515,9 +525,9 @@ __cold void mdbx_rthc_global_dtor(void) { mdbx_thread_key_delete(key); for (MDBX_reader *rthc = rthc_table[i].begin; rthc < rthc_table[i].end; ++rthc) { - mdbx_trace("== [%i] = key %u, %p ... %p, rthc %p (%+i), " + mdbx_trace("== [%i] = key %zu, %p ... %p, rthc %p (%+i), " "rthc-pid %i, current-pid %i", - i, key, rthc_table[i].begin, rthc_table[i].end, rthc, + i, (size_t)key, rthc_table[i].begin, rthc_table[i].end, rthc, (int)(rthc - rthc_table[i].begin), rthc->mr_pid, self_pid); if (rthc->mr_pid == self_pid) { rthc->mr_pid = 0; @@ -553,8 +563,8 @@ __cold int mdbx_rthc_alloc(mdbx_thread_key_t *key, MDBX_reader *begin, return rc; mdbx_rthc_lock(); - mdbx_trace(">> key 0x%x, rthc_count %u, rthc_limit %u", *key, rthc_count, - rthc_limit); + mdbx_trace(">> key %zu, rthc_count %u, rthc_limit %u", (size_t)*key, + rthc_count, rthc_limit); if (rthc_count == rthc_limit) { rthc_entry_t *new_table = mdbx_realloc((rthc_table == rthc_table_static) ? nullptr : rthc_table, @@ -568,13 +578,14 @@ __cold int mdbx_rthc_alloc(mdbx_thread_key_t *key, MDBX_reader *begin, rthc_table = new_table; rthc_limit *= 2; } - mdbx_trace("== [%i] = key %u, %p ... %p", rthc_count, *key, begin, end); + mdbx_trace("== [%i] = key %zu, %p ... %p", rthc_count, (size_t)*key, begin, + end); rthc_table[rthc_count].key = *key; rthc_table[rthc_count].begin = begin; rthc_table[rthc_count].end = end; ++rthc_count; - mdbx_trace("<< key 0x%x, rthc_count %u, rthc_limit %u", *key, rthc_count, - rthc_limit); + mdbx_trace("<< key %zu, rthc_count %u, rthc_limit %u", (size_t)*key, + rthc_count, rthc_limit); mdbx_rthc_unlock(); return MDBX_SUCCESS; @@ -587,8 +598,8 @@ bailout: __cold void mdbx_rthc_remove(const mdbx_thread_key_t key) { mdbx_thread_key_delete(key); mdbx_rthc_lock(); - mdbx_trace(">> key 0x%x, rthc_count %u, rthc_limit %u", key, rthc_count, - rthc_limit); + mdbx_trace(">> key %zu, rthc_count %u, rthc_limit %u", (size_t)key, + rthc_count, rthc_limit); for (unsigned i = 0; i < rthc_count; ++i) { if (key == rthc_table[i].key) { @@ -614,8 +625,8 @@ __cold void mdbx_rthc_remove(const mdbx_thread_key_t key) { } } - mdbx_trace("<< key 0x%x, rthc_count %u, rthc_limit %u", key, rthc_count, - rthc_limit); + mdbx_trace("<< key %zu, rthc_count %u, rthc_limit %u", (size_t)key, + rthc_count, rthc_limit); mdbx_rthc_unlock(); } diff --git a/src/osal.c b/src/osal.c index e0858733..4988c04c 100644 --- a/src/osal.c +++ b/src/osal.c @@ -159,9 +159,14 @@ typedef struct _FILE_PROVIDER_EXTERNAL_INFO_V1 { /* Prototype should match libc runtime. ISO POSIX (2003) & LSB 1.x-3.x */ __nothrow __noreturn void __assert_fail(const char *assertion, const char *file, unsigned line, const char *function); -#elif (defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \ - defined(__BSD__) || defined(__NETBSD__) || defined(__bsdi__) || \ - defined(__DragonFly__)) +#elif defined(__APPLE__) || defined(__MACH__) +__nothrow __noreturn void __assert_rtn(const char *function, const char *file, + int line, const char *assertion); +#define __assert_fail(assertion, file, line, function) \ + __assert_rtn(function, file, line, assertion) +#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \ + defined(__BSD__) || defined(__NETBSD__) || defined(__bsdi__) || \ + defined(__DragonFly__) __nothrow __noreturn void __assert(const char *function, const char *file, int line, const char *assertion); #define __assert_fail(assertion, file, line, function) \ @@ -548,6 +553,9 @@ int mdbx_openfile(const char *pathname, int flags, mode_t mode, if (fd_flags != -1) (void)fcntl(*fd, F_SETFL, fd_flags | O_DIRECT); #endif /* O_DIRECT */ +#if defined(F_NOCACHE) + (void)fcntl(*fd, F_NOCACHE, 1); +#endif /* F_NOCACHE */ } #endif @@ -626,7 +634,7 @@ int mdbx_pwrite(mdbx_filehandle_t fd, const void *buf, size_t bytes, int mdbx_pwritev(mdbx_filehandle_t fd, struct iovec *iov, int iovcnt, uint64_t offset, size_t expected_written) { -#if defined(_WIN32) || defined(_WIN64) +#if defined(_WIN32) || defined(_WIN64) || defined(__APPLE__) size_t written = 0; for (int i = 0; i < iovcnt; ++i) { int rc = mdbx_pwrite(fd, iov[i].iov_base, iov[i].iov_len, offset); @@ -1158,7 +1166,10 @@ retry_mapview:; return rc; #else if (limit != map->length) { -#if defined(_GNU_SOURCE) && !defined(__FreeBSD__) +#if defined(_GNU_SOURCE) && \ + !(defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \ + defined(__BSD__) || defined(__NETBSD__) || defined(__bsdi__) || \ + defined(__DragonFly__) || defined(__APPLE__) || defined(__MACH__)) void *ptr = mremap(map->address, map->length, limit, /* LY: in case changing the mapping size calling code must guarantees the absence of competing threads, and diff --git a/src/osal.h b/src/osal.h index d57a380a..0e847a2f 100644 --- a/src/osal.h +++ b/src/osal.h @@ -55,7 +55,7 @@ #include #if !(defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \ defined(__BSD__) || defined(__NETBSD__) || defined(__bsdi__) || \ - defined(__DragonFly__)) + defined(__DragonFly__) || defined(__APPLE__) || defined(__MACH__)) #include #endif /* xBSD */