mirror of
https://git.openldap.org/openldap/openldap.git
synced 2024-12-21 03:10:25 +08:00
ITS#7251 fix Apple/Windows shared mutex naming
This commit is contained in:
parent
20baad4a20
commit
fbf9c23304
@ -2656,13 +2656,14 @@ typedef unsigned long long mdb_hash_t;
|
||||
* hval arg on the first call.
|
||||
*/
|
||||
static mdb_hash_t
|
||||
mdb_hash_str(char *str, mdb_hash_t hval)
|
||||
mdb_hash_val(MDB_val *val, mdb_hash_t hval)
|
||||
{
|
||||
unsigned char *s = (unsigned char *)str; /* unsigned string */
|
||||
unsigned char *s = (unsigned char *)val->mv_data; /* unsigned string */
|
||||
unsigned char *end = s + val->mv_size;
|
||||
/*
|
||||
* FNV-1a hash each octet of the string
|
||||
*/
|
||||
while (*s) {
|
||||
while (s < end) {
|
||||
/* xor the bottom with the current octet */
|
||||
hval ^= (mdb_hash_t)*s++;
|
||||
|
||||
@ -2679,10 +2680,10 @@ mdb_hash_str(char *str, mdb_hash_t hval)
|
||||
* @param[out] hexbuf an array of 17 chars to hold the hash
|
||||
*/
|
||||
static void
|
||||
mdb_hash_hex(char *str, char *hexbuf)
|
||||
mdb_hash_hex(MDB_val *val, char *hexbuf)
|
||||
{
|
||||
int i;
|
||||
mdb_hash_t h = mdb_hash_str(str, MDB_HASH_INIT);
|
||||
mdb_hash_t h = mdb_hash_val(val, MDB_HASH_INIT);
|
||||
for (i=0; i<8; i++) {
|
||||
hexbuf += sprintf(hexbuf, "%02x", (unsigned int)h & 0xff);
|
||||
h >>= 8;
|
||||
@ -2815,7 +2816,15 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl)
|
||||
}
|
||||
if (*excl) {
|
||||
#ifdef _WIN32
|
||||
BY_HANDLE_FILE_INFORMATION stbuf;
|
||||
struct {
|
||||
DWORD volume;
|
||||
DWORD nhigh;
|
||||
DWORD nlow;
|
||||
} idbuf;
|
||||
MDB_val val;
|
||||
char hexbuf[17];
|
||||
|
||||
if (!mdb_sec_inited) {
|
||||
InitializeSecurityDescriptor(&mdb_null_sd,
|
||||
SECURITY_DESCRIPTOR_REVISION);
|
||||
@ -2825,7 +2834,13 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl)
|
||||
mdb_all_sa.lpSecurityDescriptor = &mdb_null_sd;
|
||||
mdb_sec_inited = 1;
|
||||
}
|
||||
mdb_hash_hex(lpath, hexbuf);
|
||||
GetFileInformationByHandle(env->me_lfd, &stbuf);
|
||||
idbuf.volume = stbuf.dwVolumeSerialNumber;
|
||||
idbuf.nhigh = stbuf.nFileIndexHigh;
|
||||
idbuf.nlow = stbuf.nFileIndexLow;
|
||||
val.mv_data = &idbuf;
|
||||
val.mv_size = sizeof(idbuf);
|
||||
mdb_hash_hex(&val, hexbuf);
|
||||
sprintf(env->me_txns->mti_rmname, "Global\\MDBr%s", hexbuf);
|
||||
env->me_rmutex = CreateMutex(&mdb_all_sa, FALSE, env->me_txns->mti_rmname);
|
||||
if (!env->me_rmutex) {
|
||||
@ -2840,8 +2855,20 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl)
|
||||
}
|
||||
#else /* _WIN32 */
|
||||
#ifdef __APPLE__
|
||||
struct stat stbuf;
|
||||
struct {
|
||||
dev_t dev;
|
||||
ino_t ino;
|
||||
} idbuf;
|
||||
MDB_val val;
|
||||
char hexbuf[17];
|
||||
mdb_hash_hex(lpath, hexbuf);
|
||||
|
||||
fstat(env->me_lfd, &stbuf);
|
||||
idbuf.dev = stbuf.st_dev;
|
||||
idbuf.ino = stbuf.st_ino;
|
||||
val.mv_data = &idbuf;
|
||||
val.mv_size = sizeof(idbuf);
|
||||
mdb_hash_hex(&val, hexbuf);
|
||||
sprintf(env->me_txns->mti_rmname, "MDBr%s", hexbuf);
|
||||
if (sem_unlink(env->me_txns->mti_rmname)) {
|
||||
rc = ErrCode();
|
||||
|
Loading…
Reference in New Issue
Block a user