mdbx: new testset (initial, stub).

Initial stub for https://github.com/ReOpen/libmdbx/issues/8
This commit is contained in:
Leo Yuriev
2017-03-30 18:54:57 +03:00
parent 095cd25e23
commit a3644aa6d0
44 changed files with 3120 additions and 2481 deletions

View File

@@ -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"

View File

@@ -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 */

View File

@@ -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);

View File

@@ -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 */

View File

@@ -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);

View File

@@ -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.