]> git.sur5r.net Git - openldap/blobdiff - libraries/libmdb/mdb.c
C90 compatibility cleanup in mdb.
[openldap] / libraries / libmdb / mdb.c
index 1363ca4f2a4722703757809a7df9172a09a36c06..db5a11b2b248c8596c15f57b255ed2e5bc60ec83 100644 (file)
 #define pthread_mutex_t        HANDLE
 #define pthread_key_t  DWORD
 #define pthread_self() GetCurrentThreadId()
-#define pthread_key_create(x,y)        *(x) = TlsAlloc()
+#define pthread_key_create(x,y)        (*(x) = TlsAlloc())
 #define pthread_key_delete(x)  TlsFree(x)
 #define pthread_getspecific(x) TlsGetValue(x)
 #define pthread_setspecific(x,y)       TlsSetValue(x,y)
 #define pthread_mutex_unlock(x)        ReleaseMutex(x)
 #define pthread_mutex_lock(x)  WaitForSingleObject(x, INFINITE)
-#define LOCK_MUTEX_R(env)      pthread_mutex_lock(env->me_rmutex)
-#define UNLOCK_MUTEX_R(env)    pthread_mutex_unlock(env->me_rmutex)
-#define LOCK_MUTEX_W(env)      pthread_mutex_lock(env->me_wmutex)
-#define UNLOCK_MUTEX_W(env)    pthread_mutex_unlock(env->me_wmutex)
+#define LOCK_MUTEX_R(env)      pthread_mutex_lock((env)->me_rmutex)
+#define UNLOCK_MUTEX_R(env)    pthread_mutex_unlock((env)->me_rmutex)
+#define LOCK_MUTEX_W(env)      pthread_mutex_lock((env)->me_wmutex)
+#define UNLOCK_MUTEX_W(env)    pthread_mutex_unlock((env)->me_wmutex)
 #define getpid()       GetCurrentProcessId()
-#define        fdatasync(fd)   !FlushFileBuffers(fd)
+#define        fdatasync(fd)   (!FlushFileBuffers(fd))
 #define        ErrCode()       GetLastError()
-#define GetPageSize(x) {SYSTEM_INFO si; GetSystemInfo(&si); (x) = si.dwPageSize;}
+#define GET_PAGESIZE(x) {SYSTEM_INFO si; GetSystemInfo(&si); (x) = si.dwPageSize;}
 #define        close(fd)       CloseHandle(fd)
 #define        munmap(ptr,len) UnmapViewOfFile(ptr)
 #else
        /** Lock the reader mutex.
         */
-#define LOCK_MUTEX_R(env)      pthread_mutex_lock(&env->me_txns->mti_mutex)
+#define LOCK_MUTEX_R(env)      pthread_mutex_lock(&(env)->me_txns->mti_mutex)
        /** Unlock the reader mutex.
         */
-#define UNLOCK_MUTEX_R(env)    pthread_mutex_unlock(&env->me_txns->mti_mutex)
+#define UNLOCK_MUTEX_R(env)    pthread_mutex_unlock(&(env)->me_txns->mti_mutex)
 
        /** Lock the writer mutex.
         *      Only a single write transaction is allowed at a time. Other writers
         *      will block waiting for this mutex.
         */
-#define LOCK_MUTEX_W(env)      pthread_mutex_lock(&env->me_txns->mti_wmutex)
+#define LOCK_MUTEX_W(env)      pthread_mutex_lock(&(env)->me_txns->mti_wmutex)
        /** Unlock the writer mutex.
         */
-#define UNLOCK_MUTEX_W(env)    pthread_mutex_unlock(&env->me_txns->mti_wmutex)
+#define UNLOCK_MUTEX_W(env)    pthread_mutex_unlock(&(env)->me_txns->mti_wmutex)
 
        /** Get the error code for the last failed system function.
         */
         *      Mainly used to initialize file variables and signify that they are
         *      unused.
         */
-#define INVALID_HANDLE_VALUE   -1
+#define INVALID_HANDLE_VALUE   (-1)
 
        /** Get the size of a memory page for the system.
         *      This is the basic size that the platform's memory manager uses, and is
         *      fundamental to the use of memory-mapped files.
         */
-#define        GetPageSize(x)  (x) = sysconf(_SC_PAGE_SIZE)
+#define        GET_PAGESIZE(x) ((x) = sysconf(_SC_PAGE_SIZE))
 #endif
 
 /** @} */
@@ -190,7 +190,7 @@ typedef ULONG               pgno_t;
        /** A default memory page size.
         *      The actual size is platform-dependent, but we use this for
         *      boot-strapping. We probably should not be using this any more.
-        *      The #GetPageSize() macro is used to get the actual size.
+        *      The #GET_PAGESIZE() macro is used to get the actual size.
         *
         *      Note that we don't currently support Huge pages. On Linux,
         *      regular data files cannot use Huge pages, and in general
@@ -243,7 +243,7 @@ typedef ULONG               pgno_t;
         */
 #define        DKEY(x) mdb_dkey(x, kbuf)
 #else
-#define        DKBUF
+#define        DKBUF   typedef int dummy_kbuf  /* so we can put ';' after */
 #define DKEY(x)
 #endif
 
@@ -268,7 +268,7 @@ typedef ULONG               pgno_t;
 #define        LAZY_RWLOCK_WRLOCK(x)
        /** Grab the DB table read lock */
 #define        LAZY_RWLOCK_RDLOCK(x)
-       /** Declare the DB table rwlock */
+       /** Declare the DB table rwlock.  Should not be followed by ';'. */
 #define        LAZY_RWLOCK_DEF(x)
        /** Initialize the DB table rwlock */
 #define        LAZY_RWLOCK_INIT(x,y)
@@ -596,7 +596,8 @@ typedef struct MDB_node {
 #define LEAF2KEY(p, i, ks)     ((char *)(p) + PAGEHDRSZ + ((i)*(ks)))
 
        /** Set the \b node's key into \b key, if requested. */
-#define MDB_SET_KEY(node, key) if (key!=NULL) {(key)->mv_size = NODEKSZ(node); (key)->mv_data = NODEKEY(node);}
+#define MDB_SET_KEY(node, key) { if ((key) != NULL) { \
+       (key)->mv_size = NODEKSZ(node); (key)->mv_data = NODEKEY(node); } }
 
        /** Information about a single database in the environment. */
 typedef struct MDB_db {
@@ -768,7 +769,7 @@ struct MDB_env {
        size_t          me_mapsize;             /**< size of the data memory map */
        off_t           me_size;                /**< current file size */
        pgno_t          me_maxpg;               /**< me_mapsize / me_psize */
-       unsigned int    me_psize;       /**< size of a page, from #GetPageSize */
+       unsigned int    me_psize;       /**< size of a page, from #GET_PAGESIZE */
        unsigned int    me_db_toggle;   /**< which DB table is current */
        MDB_dbx         *me_dbxs;               /**< array of static DB info */
        MDB_db          *me_dbs[2];             /**< two arrays of MDB_db info */
@@ -780,7 +781,7 @@ struct MDB_env {
        /** ID2L of pages that were written during a write txn */
        ID2                     me_dirty_list[MDB_IDL_UM_SIZE];
        /** rwlock for the DB tables, if #LAZY_LOCKS is false */
-       LAZY_RWLOCK_DEF(me_dblock);
+       LAZY_RWLOCK_DEF(me_dblock)
 #ifdef _WIN32
        HANDLE          me_rmutex;              /* Windows mutexes don't reside in shared mem */
        HANDLE          me_wmutex;
@@ -1627,7 +1628,7 @@ mdb_env_init_meta(MDB_env *env, MDB_meta *meta)
 
        DPUTS("writing new meta page");
 
-       GetPageSize(psize);
+       GET_PAGESIZE(psize);
 
        meta->mm_magic = MDB_MAGIC;
        meta->mm_version = MDB_VERSION;
@@ -2315,8 +2316,8 @@ cintcmp(const MDB_val *a, const MDB_val *b)
        unsigned short *u, *c;
        int x;
 
-       u = a->mv_data + a->mv_size;
-       c = b->mv_data + a->mv_size;
+       u = (unsigned short *) ((char *) a->mv_data + a->mv_size);
+       c = (unsigned short *) ((char *) b->mv_data + a->mv_size);
        do {
                x = *--u - *--c;
        } while(!x && u > (unsigned short *)a->mv_data);
@@ -3283,9 +3284,11 @@ mdb_cursor_put(MDB_cursor *mc, MDB_val *key, MDB_val *data,
                goto top;
        } else {
                int exact = 0;
-               rc = mdb_cursor_set(mc, key, NULL, MDB_SET, &exact);
+               MDB_val d2;
+               rc = mdb_cursor_set(mc, key, &d2, MDB_SET, &exact);
                if (flags == MDB_NOOVERWRITE && rc == 0) {
                        DPRINTF("duplicate key [%s]", DKEY(key));
+                       *data = d2;
                        return MDB_KEYEXIST;
                }
                if (rc && rc != MDB_NOTFOUND)