ITS#7251 fix Apple/Windows shared mutex naming

This commit is contained in:
Howard Chu 2012-04-18 15:59:54 -07:00
parent 20baad4a20
commit fbf9c23304

View File

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