mirror of
https://github.com/isar/libmdbx.git
synced 2025-08-23 09:04:26 +08:00
mdbx: new testset (initial, stub).
Initial stub for https://github.com/ReOpen/libmdbx/issues/8
This commit is contained in:
@@ -96,11 +96,11 @@
|
||||
#endif
|
||||
|
||||
#if defined(__i386) || defined(__x86_64) || defined(_M_IX86)
|
||||
# define MISALIGNED_OK 1 /* TODO */
|
||||
# define UNALIGNED_OK 1 /* TODO */
|
||||
#endif
|
||||
#ifndef MISALIGNED_OK
|
||||
# define MISALIGNED_OK 0
|
||||
#endif /* MISALIGNED_OK */
|
||||
#ifndef UNALIGNED_OK
|
||||
# define UNALIGNED_OK 0
|
||||
#endif /* UNALIGNED_OK */
|
||||
|
||||
#if (-6 & 5) || CHAR_BIT != 8 || UINT_MAX < 0xffffffff || ULONG_MAX % 0xFFFF
|
||||
# error "Sanity checking failed: Two's complement, reasonably sized integer types"
|
||||
|
@@ -283,6 +283,13 @@
|
||||
# endif
|
||||
#endif /* unlikely */
|
||||
|
||||
#if !defined(__noop) && !defined(_MSC_VER)
|
||||
static __inline int __do_noop(void* crutch, ...) {
|
||||
(void) crutch; return 0;
|
||||
}
|
||||
# define __noop(...) __do_noop(0, __VA_ARGS__)
|
||||
#endif /* __noop */
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/* Wrapper around __func__, which is a C99 feature */
|
||||
|
@@ -287,12 +287,14 @@ void mdbx_lck_destroy(MDB_env *env) {
|
||||
/* double `unlock` for robustly remove overlapped shared/exclusive locks */
|
||||
while (funlock(env->me_lfd, LCK_LOWER))
|
||||
;
|
||||
rc = GetLastError();
|
||||
assert(rc == ERROR_NOT_LOCKED);
|
||||
(void)rc;
|
||||
SetLastError(ERROR_SUCCESS);
|
||||
|
||||
while (funlock(env->me_lfd, LCK_UPPER))
|
||||
;
|
||||
rc = GetLastError();
|
||||
assert(rc == ERROR_NOT_LOCKED);
|
||||
(void)rc;
|
||||
SetLastError(ERROR_SUCCESS);
|
||||
|
52
src/mdbx.c
52
src/mdbx.c
@@ -538,7 +538,7 @@ static __inline MDB_node *NODEPTR(MDB_page *p, unsigned i) {
|
||||
#define NODEKSZ(node) ((node)->mn_ksize)
|
||||
|
||||
/** Copy a page number from src to dst */
|
||||
#if MISALIGNED_OK
|
||||
#if UNALIGNED_OK
|
||||
#define COPY_PGNO(dst, src) dst = src
|
||||
#elif SIZE_MAX > 4294967295UL
|
||||
#define COPY_PGNO(dst, src) \
|
||||
@@ -560,7 +560,7 @@ static __inline MDB_node *NODEPTR(MDB_page *p, unsigned i) {
|
||||
*d++ = *s++; \
|
||||
*d = *s; \
|
||||
} while (0)
|
||||
#endif /* MISALIGNED_OK */
|
||||
#endif /* UNALIGNED_OK */
|
||||
|
||||
/** The address of a key in a LEAF2 page.
|
||||
* LEAF2 pages are used for #MDB_DUPFIXED sorted-duplicate
|
||||
@@ -754,16 +754,31 @@ static const char *__mdbx_strerr(int errnum) {
|
||||
}
|
||||
}
|
||||
|
||||
const char *mdbx_strerror_r(int errnum, char *buf, size_t buflen) {
|
||||
const char *__cold mdbx_strerror_r(int errnum, char *buf, size_t buflen) {
|
||||
const char *msg = __mdbx_strerr(errnum);
|
||||
if (!msg) {
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
(void)errnum;
|
||||
(void)buf;
|
||||
(void)buflen;
|
||||
msg = FIXME;
|
||||
#else
|
||||
if (!buflen)
|
||||
return NULL;
|
||||
#ifdef _MSC_VER
|
||||
int rc = strerror_s(buf, buflen, errnum);
|
||||
assert(rc == 0);
|
||||
(void)rc;
|
||||
return buf;
|
||||
#elif defined(_GNU_SOURCE)
|
||||
/* GNU-specific */
|
||||
msg = strerror_r(errnum, buf, buflen);
|
||||
#elif (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600)
|
||||
/* XSI-compliant */
|
||||
int rc = strerror_r(errnum, buf, buflen);
|
||||
if (rc) {
|
||||
rc = snprintf(buf, buflen, "error %d", errnum);
|
||||
assert(rc > 0);
|
||||
}
|
||||
return buf;
|
||||
#else
|
||||
strncpy(buf, strerror(errnum), buflen);
|
||||
buf[buflen - 1] = '\0';
|
||||
return buf;
|
||||
#endif
|
||||
}
|
||||
return msg;
|
||||
@@ -772,9 +787,12 @@ const char *mdbx_strerror_r(int errnum, char *buf, size_t buflen) {
|
||||
const char *__cold mdbx_strerror(int errnum) {
|
||||
const char *msg = __mdbx_strerr(errnum);
|
||||
if (!msg) {
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
(void)errnum;
|
||||
msg = FIXME;
|
||||
#ifdef _MSC_VER
|
||||
static __thread char buffer[1024];
|
||||
int rc = strerror_s(buffer, sizeof(buffer), errnum);
|
||||
assert(rc == 0);
|
||||
(void)rc;
|
||||
msg = buffer;
|
||||
#else
|
||||
msg = strerror(errnum);
|
||||
#endif
|
||||
@@ -3776,7 +3794,7 @@ int __cold mdbx_env_set_maxreaders(MDB_env *env, unsigned readers) {
|
||||
if (unlikely(env->me_signature != MDBX_ME_SIGNATURE))
|
||||
return MDBX_EBADSIGN;
|
||||
|
||||
if (unlikely(env->me_map))
|
||||
if (unlikely(env->me_map || readers > INT16_MAX))
|
||||
return EINVAL;
|
||||
|
||||
env->me_maxreaders = readers;
|
||||
@@ -4247,7 +4265,7 @@ static int __hot mdbx_cmp_int_a2(const MDB_val *a, const MDB_val *b) {
|
||||
mdbx_assert(NULL, a->mv_size == b->mv_size);
|
||||
mdbx_assert(NULL, 0 == (uintptr_t)a->mv_data % sizeof(uint16_t) &&
|
||||
0 == (uintptr_t)b->mv_data % sizeof(uint16_t));
|
||||
#if MISALIGNED_OK
|
||||
#if UNALIGNED_OK
|
||||
switch (a->mv_size) {
|
||||
case 4:
|
||||
return mdbx_cmp2int(*(uint32_t *)a->mv_data, *(uint32_t *)b->mv_data);
|
||||
@@ -4282,7 +4300,7 @@ static int __hot mdbx_cmp_int_a2(const MDB_val *a, const MDB_val *b) {
|
||||
} while (pa != end);
|
||||
return diff;
|
||||
}
|
||||
#endif /* MISALIGNED_OK */
|
||||
#endif /* UNALIGNED_OK */
|
||||
}
|
||||
|
||||
/** Compare two items pointing at unsigneds of unknown alignment.
|
||||
@@ -4291,7 +4309,7 @@ static int __hot mdbx_cmp_int_a2(const MDB_val *a, const MDB_val *b) {
|
||||
*/
|
||||
static int __hot mdbx_cmp_int_ua(const MDB_val *a, const MDB_val *b) {
|
||||
mdbx_assert(NULL, a->mv_size == b->mv_size);
|
||||
#if MISALIGNED_OK
|
||||
#if UNALIGNED_OK
|
||||
switch (a->mv_size) {
|
||||
case 4:
|
||||
return mdbx_cmp2int(*(uint32_t *)a->mv_data, *(uint32_t *)b->mv_data);
|
||||
@@ -4322,7 +4340,7 @@ static int __hot mdbx_cmp_int_ua(const MDB_val *a, const MDB_val *b) {
|
||||
#else /* __BYTE_ORDER__ */
|
||||
return memcmp(a->mv_data, b->mv_data, a->mv_size);
|
||||
#endif /* __BYTE_ORDER__ */
|
||||
#endif /* MISALIGNED_OK */
|
||||
#endif /* UNALIGNED_OK */
|
||||
}
|
||||
|
||||
/** Compare two items lexically */
|
||||
|
@@ -17,7 +17,7 @@
|
||||
#include "./bits.h"
|
||||
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
static int waitfor2errcode(DWORD result) {
|
||||
static int waitstatus2errcode(DWORD result) {
|
||||
switch (result) {
|
||||
case WAIT_OBJECT_0:
|
||||
return MDB_SUCCESS;
|
||||
@@ -183,7 +183,7 @@ int mdbx_mutex_destroy(mdbx_mutex_t *mutex) {
|
||||
int mdbx_mutex_lock(mdbx_mutex_t *mutex) {
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
DWORD code = WaitForSingleObject(*mutex, INFINITE);
|
||||
return waitfor2errcode(code);
|
||||
return waitstatus2errcode(code);
|
||||
#else
|
||||
return pthread_mutex_lock(mutex);
|
||||
#endif
|
||||
@@ -231,7 +231,7 @@ int mdbx_cond_wait(mdbx_cond_t *cond, mdbx_mutex_t *mutex) {
|
||||
DWORD code = SignalObjectAndWait(*mutex, *cond, INFINITE, FALSE);
|
||||
if (code == WAIT_OBJECT_0)
|
||||
code = WaitForSingleObject(*mutex, INFINITE);
|
||||
return waitfor2errcode(code);
|
||||
return waitstatus2errcode(code);
|
||||
#else
|
||||
return pthread_cond_wait(cond, mutex);
|
||||
#endif
|
||||
@@ -555,7 +555,7 @@ int mdbx_thread_create(mdbx_thread_t *thread,
|
||||
int mdbx_thread_join(mdbx_thread_t thread) {
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
DWORD code = WaitForSingleObject(thread, INFINITE);
|
||||
return waitfor2errcode(code);
|
||||
return waitstatus2errcode(code);
|
||||
#else
|
||||
void *unused_retval = &unused_retval;
|
||||
return pthread_join(thread, &unused_retval);
|
||||
|
@@ -172,11 +172,12 @@ typedef pthread_key_t mdbx_thread_key_t;
|
||||
defined(__MIPSEL__) || defined(_MIPSEL) || defined(__MIPSEL) || \
|
||||
defined(__i386) || defined(__x86_64__) || defined(_M_IX86) || \
|
||||
defined(_M_X64) || defined(i386) || defined(_X86_) || defined(__i386__) || \
|
||||
defined(_X86_64_) || defined(_M_ARM) || defined(__e2k__)
|
||||
defined(_X86_64_) || defined(_M_ARM) || defined(_M_ARM64) || \
|
||||
defined(__e2k__)
|
||||
#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
|
||||
#elif defined(__BIG_ENDIAN__) || defined(_BIG_ENDIAN) || defined(__ARMEB__) || \
|
||||
defined(__THUMBEB__) || defined(__AARCH64EB__) || defined(__MIPSEB__) || \
|
||||
defined(_MIPSEB) || defined(__MIPSEB)
|
||||
defined(_MIPSEB) || defined(__MIPSEB) || defined(_M_IA64)
|
||||
#define __BYTE_ORDER__ __ORDER_BIG_ENDIAN__
|
||||
#else
|
||||
#error __BYTE_ORDER__ should be defined.
|
||||
|
Reference in New Issue
Block a user