mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-20 22:59:34 -05:00
Cleanup midl, start documenting internals
This commit is contained in:
parent
b30d0266e7
commit
e91dae3ed5
5 changed files with 117 additions and 42 deletions
|
|
@ -308,7 +308,7 @@ EXTRACT_PRIVATE = NO
|
||||||
# If the EXTRACT_STATIC tag is set to YES all static members of a file
|
# If the EXTRACT_STATIC tag is set to YES all static members of a file
|
||||||
# will be included in the documentation.
|
# will be included in the documentation.
|
||||||
|
|
||||||
EXTRACT_STATIC = NO
|
EXTRACT_STATIC = YES
|
||||||
|
|
||||||
# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
|
# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
|
||||||
# defined locally in source files will be included in the documentation.
|
# defined locally in source files will be included in the documentation.
|
||||||
|
|
@ -581,7 +581,7 @@ WARN_LOGFILE =
|
||||||
# directories like "/usr/src/myproject". Separate the files or directories
|
# directories like "/usr/src/myproject". Separate the files or directories
|
||||||
# with spaces.
|
# with spaces.
|
||||||
|
|
||||||
INPUT = mdb.h
|
INPUT = mdb.c mdb.h midl.c midl.h
|
||||||
|
|
||||||
# This tag can be used to specify the character encoding of the source files
|
# This tag can be used to specify the character encoding of the source files
|
||||||
# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
|
# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,20 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
|
#include <pthread.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "mdb.h"
|
||||||
|
#include "midl.h"
|
||||||
|
|
||||||
|
/** @defgroup internal MDB Internals
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/** @defgroup compat Windows Compatibility Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#define pthread_t DWORD
|
#define pthread_t DWORD
|
||||||
#define pthread_mutex_t HANDLE
|
#define pthread_mutex_t HANDLE
|
||||||
|
|
@ -71,33 +85,25 @@
|
||||||
#define LOCK_MUTEX_W(env) pthread_mutex_lock(env->me_wmutex)
|
#define LOCK_MUTEX_W(env) pthread_mutex_lock(env->me_wmutex)
|
||||||
#define UNLOCK_MUTEX_W(env) pthread_mutex_unlock(env->me_wmutex)
|
#define UNLOCK_MUTEX_W(env) pthread_mutex_unlock(env->me_wmutex)
|
||||||
#define getpid() GetCurrentProcessId()
|
#define getpid() GetCurrentProcessId()
|
||||||
#else
|
|
||||||
#include <pthread.h>
|
|
||||||
#define LOCK_MUTEX_R(env) pthread_mutex_lock(&env->me_txns->mti_mutex)
|
|
||||||
#define UNLOCK_MUTEX_R(env) pthread_mutex_unlock(&env->me_txns->mti_mutex)
|
|
||||||
#define LOCK_MUTEX_W(env) pthread_mutex_lock(&env->me_txns->mti_wmutex)
|
|
||||||
#define UNLOCK_MUTEX_W(env) pthread_mutex_unlock(&env->me_txns->mti_wmutex)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#define fdatasync(fd) !FlushFileBuffers(fd)
|
#define fdatasync(fd) !FlushFileBuffers(fd)
|
||||||
#define ErrCode() GetLastError()
|
#define ErrCode() GetLastError()
|
||||||
#define GetPageSize(x) {SYSTEM_INFO si; GetSystemInfo(&si); (x) = si.dwPageSize;}
|
#define GetPageSize(x) {SYSTEM_INFO si; GetSystemInfo(&si); (x) = si.dwPageSize;}
|
||||||
#define close(fd) CloseHandle(fd)
|
#define close(fd) CloseHandle(fd)
|
||||||
#define munmap(ptr,len) UnmapViewOfFile(ptr)
|
#define munmap(ptr,len) UnmapViewOfFile(ptr)
|
||||||
#else
|
#else
|
||||||
|
#define LOCK_MUTEX_R(env) pthread_mutex_lock(&env->me_txns->mti_mutex)
|
||||||
|
#define UNLOCK_MUTEX_R(env) pthread_mutex_unlock(&env->me_txns->mti_mutex)
|
||||||
|
#define LOCK_MUTEX_W(env) pthread_mutex_lock(&env->me_txns->mti_wmutex)
|
||||||
|
#define UNLOCK_MUTEX_W(env) pthread_mutex_unlock(&env->me_txns->mti_wmutex)
|
||||||
#define ErrCode() errno
|
#define ErrCode() errno
|
||||||
#define HANDLE int
|
#define HANDLE int
|
||||||
#define INVALID_HANDLE_VALUE -1
|
#define INVALID_HANDLE_VALUE -1
|
||||||
#define GetPageSize(x) (x) = sysconf(_SC_PAGE_SIZE)
|
#define GetPageSize(x) (x) = sysconf(_SC_PAGE_SIZE)
|
||||||
#endif
|
#endif
|
||||||
#include "mdb.h"
|
|
||||||
|
|
||||||
#define ULONG unsigned long
|
/** @} */
|
||||||
typedef ULONG pgno_t;
|
|
||||||
|
|
||||||
#include "midl.h"
|
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
/* Note: If O_DSYNC is undefined but exists in /usr/include,
|
/* Note: If O_DSYNC is undefined but exists in /usr/include,
|
||||||
* preferably set some compiler flag to get the definition.
|
* preferably set some compiler flag to get the definition.
|
||||||
* Otherwise compile with the less efficient -DMDB_DSYNC=O_SYNC.
|
* Otherwise compile with the less efficient -DMDB_DSYNC=O_SYNC.
|
||||||
|
|
@ -105,6 +111,10 @@ typedef ULONG pgno_t;
|
||||||
#ifndef MDB_DSYNC
|
#ifndef MDB_DSYNC
|
||||||
# define MDB_DSYNC O_DSYNC
|
# define MDB_DSYNC O_DSYNC
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ULONG unsigned long
|
||||||
|
typedef ULONG pgno_t;
|
||||||
|
|
||||||
#ifndef DEBUG
|
#ifndef DEBUG
|
||||||
#define DEBUG 0
|
#define DEBUG 0
|
||||||
|
|
@ -382,7 +392,7 @@ struct MDB_txn {
|
||||||
MDB_env *mt_env;
|
MDB_env *mt_env;
|
||||||
pgno_t *mt_free_pgs; /* this is an IDL */
|
pgno_t *mt_free_pgs; /* this is an IDL */
|
||||||
union {
|
union {
|
||||||
MIDL2 *dirty_list; /* modified pages */
|
ID2L dirty_list; /* modified pages */
|
||||||
MDB_reader *reader;
|
MDB_reader *reader;
|
||||||
} mt_u;
|
} mt_u;
|
||||||
MDB_dbx *mt_dbxs; /* array */
|
MDB_dbx *mt_dbxs; /* array */
|
||||||
|
|
@ -429,7 +439,7 @@ struct MDB_env {
|
||||||
pthread_key_t me_txkey; /* thread-key for readers */
|
pthread_key_t me_txkey; /* thread-key for readers */
|
||||||
MDB_dpage *me_dpages;
|
MDB_dpage *me_dpages;
|
||||||
pgno_t me_free_pgs[MDB_IDL_UM_SIZE];
|
pgno_t me_free_pgs[MDB_IDL_UM_SIZE];
|
||||||
MIDL2 me_dirty_list[MDB_IDL_DB_SIZE];
|
ID2 me_dirty_list[MDB_IDL_DB_SIZE];
|
||||||
LAZY_RWLOCK_DEF(me_dblock);
|
LAZY_RWLOCK_DEF(me_dblock);
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
HANDLE me_rmutex; /* Windows mutexes don't reside in shared mem */
|
HANDLE me_rmutex; /* Windows mutexes don't reside in shared mem */
|
||||||
|
|
@ -643,7 +653,7 @@ mdb_alloc_page(MDB_txn *txn, MDB_dbi dbi, MDB_page *parent, unsigned int parent_
|
||||||
{
|
{
|
||||||
MDB_dpage *dp;
|
MDB_dpage *dp;
|
||||||
pgno_t pgno = P_INVALID;
|
pgno_t pgno = P_INVALID;
|
||||||
MIDL2 mid;
|
ID2 mid;
|
||||||
|
|
||||||
if (txn->mt_txnid > 2) {
|
if (txn->mt_txnid > 2) {
|
||||||
|
|
||||||
|
|
@ -752,7 +762,7 @@ mdb_alloc_page(MDB_txn *txn, MDB_dbi dbi, MDB_page *parent, unsigned int parent_
|
||||||
}
|
}
|
||||||
mid.mid = dp->p.mp_pgno;
|
mid.mid = dp->p.mp_pgno;
|
||||||
mid.mptr = dp;
|
mid.mptr = dp;
|
||||||
mdb_midl2_insert(txn->mt_u.dirty_list, &mid);
|
mdb_mid2l_insert(txn->mt_u.dirty_list, &mid);
|
||||||
|
|
||||||
return dp;
|
return dp;
|
||||||
}
|
}
|
||||||
|
|
@ -2059,10 +2069,8 @@ mdb_get_page(MDB_txn *txn, pgno_t pgno, MDB_page **ret)
|
||||||
|
|
||||||
if (!F_ISSET(txn->mt_flags, MDB_TXN_RDONLY) && txn->mt_u.dirty_list[0].mid) {
|
if (!F_ISSET(txn->mt_flags, MDB_TXN_RDONLY) && txn->mt_u.dirty_list[0].mid) {
|
||||||
MDB_dpage *dp;
|
MDB_dpage *dp;
|
||||||
MIDL2 id;
|
|
||||||
unsigned x;
|
unsigned x;
|
||||||
id.mid = pgno;
|
x = mdb_mid2l_search(txn->mt_u.dirty_list, pgno);
|
||||||
x = mdb_midl2_search(txn->mt_u.dirty_list, &id);
|
|
||||||
if (x <= txn->mt_u.dirty_list[0].mid && txn->mt_u.dirty_list[x].mid == pgno) {
|
if (x <= txn->mt_u.dirty_list[0].mid && txn->mt_u.dirty_list[x].mid == pgno) {
|
||||||
dp = txn->mt_u.dirty_list[x].mptr;
|
dp = txn->mt_u.dirty_list[x].mptr;
|
||||||
p = &dp->p;
|
p = &dp->p;
|
||||||
|
|
@ -4138,3 +4146,5 @@ int mdb_set_relfunc(MDB_txn *txn, MDB_dbi dbi, MDB_rel_func *rel)
|
||||||
txn->mt_dbxs[dbi].md_rel = rel;
|
txn->mt_dbxs[dbi].md_rel = rel;
|
||||||
return MDB_SUCCESS;
|
return MDB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,9 @@
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
/** @defgroup public Public API
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
/** @defgroup Version Version Macros
|
/** @defgroup Version Version Macros
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
@ -782,4 +785,5 @@ int mdb_cursor_count(MDB_cursor *cursor, unsigned long *countp);
|
||||||
*/
|
*/
|
||||||
int mdb_cmp(MDB_txn *txn, MDB_dbi dbi, const MDB_val *a, const MDB_val *b);
|
int mdb_cmp(MDB_txn *txn, MDB_dbi dbi, const MDB_val *a, const MDB_val *b);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
#endif /* _MDB_H_ */
|
#endif /* _MDB_H_ */
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
/* idl.c - ldap bdb back-end ID list functions */
|
/** @file midl.c
|
||||||
|
* @brief ldap bdb back-end ID List functions */
|
||||||
/* $OpenLDAP$ */
|
/* $OpenLDAP$ */
|
||||||
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
|
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
|
||||||
*
|
*
|
||||||
|
|
@ -19,11 +20,15 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include "midl.h"
|
#include "midl.h"
|
||||||
|
|
||||||
typedef unsigned long pgno_t;
|
/** @defgroup internal MDB Internals
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/** @defgroup idls ID List Management
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define CMP(x,y) ( (x) < (y) ? -1 : (x) > (y) )
|
||||||
|
|
||||||
#define CMP(x,y) ( (x) > (y) ? -1 : (x) < (y) )
|
static unsigned mdb_midl_search( IDL ids, ID id )
|
||||||
|
|
||||||
unsigned mdb_midl_search( ID *ids, ID id )
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* binary search of id in ids
|
* binary search of id in ids
|
||||||
|
|
@ -38,7 +43,7 @@ unsigned mdb_midl_search( ID *ids, ID id )
|
||||||
while( 0 < n ) {
|
while( 0 < n ) {
|
||||||
int pivot = n >> 1;
|
int pivot = n >> 1;
|
||||||
cursor = base + pivot;
|
cursor = base + pivot;
|
||||||
val = CMP( id, ids[cursor + 1] );
|
val = CMP( ids[cursor + 1], id );
|
||||||
|
|
||||||
if( val < 0 ) {
|
if( val < 0 ) {
|
||||||
n = pivot;
|
n = pivot;
|
||||||
|
|
@ -59,7 +64,7 @@ unsigned mdb_midl_search( ID *ids, ID id )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int mdb_midl_insert( ID *ids, ID id )
|
int mdb_midl_insert( IDL ids, ID id )
|
||||||
{
|
{
|
||||||
unsigned x, i;
|
unsigned x, i;
|
||||||
|
|
||||||
|
|
@ -108,7 +113,7 @@ int mdb_midl_insert( ID *ids, ID id )
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned mdb_midl2_search( MIDL2 *ids, MIDL2 *id )
|
unsigned mdb_mid2l_search( ID2L ids, ID id )
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* binary search of id in ids
|
* binary search of id in ids
|
||||||
|
|
@ -123,7 +128,7 @@ unsigned mdb_midl2_search( MIDL2 *ids, MIDL2 *id )
|
||||||
while( 0 < n ) {
|
while( 0 < n ) {
|
||||||
int pivot = n >> 1;
|
int pivot = n >> 1;
|
||||||
cursor = base + pivot;
|
cursor = base + pivot;
|
||||||
val = CMP( ids[cursor + 1].mid, id->mid );
|
val = CMP( id, ids[cursor + 1].mid );
|
||||||
|
|
||||||
if( val < 0 ) {
|
if( val < 0 ) {
|
||||||
n = pivot;
|
n = pivot;
|
||||||
|
|
@ -144,11 +149,11 @@ unsigned mdb_midl2_search( MIDL2 *ids, MIDL2 *id )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int mdb_midl2_insert( MIDL2 *ids, MIDL2 *id )
|
int mdb_mid2l_insert( ID2L ids, ID2 *id )
|
||||||
{
|
{
|
||||||
unsigned x, i;
|
unsigned x, i;
|
||||||
|
|
||||||
x = mdb_midl2_search( ids, id );
|
x = mdb_mid2l_search( ids, id->mid );
|
||||||
assert( x > 0 );
|
assert( x > 0 );
|
||||||
|
|
||||||
if( x < 1 ) {
|
if( x < 1 ) {
|
||||||
|
|
@ -175,3 +180,5 @@ int mdb_midl2_insert( MIDL2 *ids, MIDL2 *id )
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
/** @} */
|
||||||
|
/** @} */
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,13 @@
|
||||||
/* idl.h - ldap bdb back-end ID list header file */
|
/** @file midl.h
|
||||||
|
* @brief ldap bdb back-end ID List header file.
|
||||||
|
*
|
||||||
|
* This file was originally part of back-bdb but has been
|
||||||
|
* modified for use in libmdb. Most of the macros defined
|
||||||
|
* in this file are unused, just left over from the original.
|
||||||
|
*
|
||||||
|
* This file is only used internally in libmdb and its definitions
|
||||||
|
* are not exposed publicly.
|
||||||
|
*/
|
||||||
/* $OpenLDAP$ */
|
/* $OpenLDAP$ */
|
||||||
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
|
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
|
||||||
*
|
*
|
||||||
|
|
@ -17,7 +26,24 @@
|
||||||
#ifndef _MDB_MIDL_H_
|
#ifndef _MDB_MIDL_H_
|
||||||
#define _MDB_MIDL_H_
|
#define _MDB_MIDL_H_
|
||||||
|
|
||||||
|
/** @defgroup internal MDB Internals
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/** @defgroup idls ID List Management
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/** An ID should be the largest integer type supported on a machine.
|
||||||
|
*/
|
||||||
#define ID unsigned long
|
#define ID unsigned long
|
||||||
|
|
||||||
|
/** An IDL is an ID List, a sorted array of IDs. The first
|
||||||
|
* element of the array is a counter for how many actual
|
||||||
|
* IDs are in the list. In the original back-bdb code, IDLs are
|
||||||
|
* sorted in ascending order. For libmdb IDLs are sorted in
|
||||||
|
* descending order.
|
||||||
|
*/
|
||||||
|
typedef ID *IDL;
|
||||||
|
|
||||||
#define NOID (~(ID)0)
|
#define NOID (~(ID)0)
|
||||||
|
|
||||||
/* IDL sizes - likely should be even bigger
|
/* IDL sizes - likely should be even bigger
|
||||||
|
|
@ -71,14 +97,42 @@
|
||||||
#define MDB_IDL_N( ids ) ( MDB_IDL_IS_RANGE(ids) \
|
#define MDB_IDL_N( ids ) ( MDB_IDL_IS_RANGE(ids) \
|
||||||
? ((ids)[2]-(ids)[1])+1 : (ids)[0] )
|
? ((ids)[2]-(ids)[1])+1 : (ids)[0] )
|
||||||
|
|
||||||
int mdb_midl_insert( ID *ids, ID id );
|
/** Insert an ID into an IDL.
|
||||||
|
* @param[in,out] ids The IDL to insert into.
|
||||||
|
* @param[in] id The ID to insert.
|
||||||
|
* @return 0 on success, -1 if the ID was already present in the IDL.
|
||||||
|
*/
|
||||||
|
int mdb_midl_insert( IDL ids, ID id );
|
||||||
|
|
||||||
typedef struct MIDL2 {
|
/** An ID2 is an ID/pointer pair.
|
||||||
ID mid;
|
*/
|
||||||
void *mptr;
|
typedef struct ID2 {
|
||||||
} MIDL2;
|
ID mid; /**< The ID */
|
||||||
|
void *mptr; /**< The pointer */
|
||||||
|
} ID2;
|
||||||
|
|
||||||
unsigned mdb_midl2_search( MIDL2 *ids, MIDL2 *id );
|
/** An ID2L is an ID2 List, a sorted array of ID2s.
|
||||||
int mdb_midl2_insert( MIDL2 *ids, MIDL2 *id );
|
* The first element's \b mid member is a count of how many actual
|
||||||
|
* elements are in the array. The \b mptr member of the first element is unused.
|
||||||
|
* The array is sorted in ascending order by \b mid.
|
||||||
|
*/
|
||||||
|
typedef ID2 *ID2L;
|
||||||
|
|
||||||
|
/** Search for an ID in an ID2L.
|
||||||
|
* @param[in] ids The ID2L to search.
|
||||||
|
* @param[in] id The ID to search for.
|
||||||
|
* @return The index of the first ID2 whose \b mid member is greater than or equal to \b id.
|
||||||
|
*/
|
||||||
|
unsigned mdb_mid2l_search( ID2L ids, ID id );
|
||||||
|
|
||||||
|
|
||||||
|
/** Insert an ID2 into a ID2L.
|
||||||
|
* @param[in,out] ids The ID2L to insert into.
|
||||||
|
* @param[in] id The ID2 to insert.
|
||||||
|
* @return 0 on success, -1 if the ID was already present in the MIDL2.
|
||||||
|
*/
|
||||||
|
int mdb_mid2l_insert( ID2L ids, ID2 *id );
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
/** @} */
|
||||||
#endif /* _MDB_MIDL_H_ */
|
#endif /* _MDB_MIDL_H_ */
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue