Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit567894a

Browse files
committed
Rewrite Lock_create(), Lock_close(), and Lock_destroy() function.
1 parentb92c8ac commit567894a

File tree

2 files changed

+56
-19
lines changed

2 files changed

+56
-19
lines changed

‎apache2/ag_mdb/ag_mdb.cpp‎

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,31 @@
2121
intLock_create(structagmdb_lock *new_lock,constchar* lock_name,int lock_name_length) {
2222
#ifndef _WIN32
2323
union semun sem_union;
24-
int lock_id =AGMDB_hash(lock_name, lock_name_length, DEFAULT_AGMDB_ID_RANGE);
24+
int lock_id = -1;
25+
#else
26+
int read_lock_name_len =0;
27+
int write_lock_name_len =0;
28+
char* read_lock_name =NULL;
29+
char* write_lock_name =NULL;
30+
bool lock_exists =false;
31+
#endif
32+
if (new_lock ==NULL)
33+
return AGMDB_ERROR_HANDLE_NULL;
34+
#ifndef _WIN32
35+
lock_id =AGMDB_hash(lock_name, lock_name_length, DEFAULT_AGMDB_ID_RANGE);
2536
new_lock->sem_id =semget(lock_id, SEM_NUMBERS, IPC_CREAT | IPC_EXCL);
2637
if (new_lock->sem_id != -1) {
2738
// A new semaphore set is created, need to initialize the semaphore set
2839
sem_union.val = SEM_READ_INITVAL;
2940
if (semctl(new_lock->sem_id, SEM_ID_READ, SETVAL, sem_union) == -1) {
41+
Lock_destroy(new_lock);
3042
return AGMDB_ERROR_LOCK_LINUX_SEM_CREATE_FAIL;
3143
}
3244

3345
sem_union.val = SEM_WRITE_INITVAL;
3446
if (semctl(new_lock->sem_id, SEM_ID_WRITE, SETVAL, sem_union) == -1) {
35-
// If failed, reset the read lock
36-
sem_union.val =0;
37-
semctl(new_lock->sem_id, SEM_ID_READ, SETVAL, sem_union);
47+
// If failed, destroy the lock
48+
Lock_destroy(new_lock);
3849
return AGMDB_ERROR_LOCK_LINUX_SEM_INIT_FAIL;
3950
}
4051
return AGMDB_SUCCESS_LOCK_CREATE;
@@ -47,39 +58,49 @@ int Lock_create(struct agmdb_lock *new_lock, const char* lock_name, int lock_nam
4758
return AGMDB_SUCCESS_LOCK_OPEN;
4859
}
4960
#else
50-
char read_lock_name[AGMDB_MAX_NAME_LEN];
51-
char write_lock_name[AGMDB_MAX_NAME_LEN];
52-
bool lock_exists =false;
61+
read_lock_name_len = (strlen(READ_LOCK_PREFIX) +strlen(lock_name) +1) *sizeof(char);
62+
write_lock_name_len = (strlen(WRITE_LOCK_PREFIX) +strlen(lock_name) +1) *sizeof(char);
5363

5464
if (AGMDB_isstring(lock_name, lock_name_length) != AGMDB_SUCCESS)
5565
return AGMDB_ERROR_LOCK_WIN_NAME_INVALID_STRING;
56-
sprintf_s(read_lock_name, AGMDB_MAX_NAME_LEN,"DB_%s_LOCK_READ", lock_name);
57-
sprintf_s(write_lock_name, AGMDB_MAX_NAME_LEN,"DB_%s_LOCK_WRITE", lock_name);
66+
67+
read_lock_name = (char *)malloc(read_lock_name_len *sizeof(char));
68+
sprintf_s(read_lock_name, read_lock_name_len,"%s%s", READ_LOCK_PREFIX, lock_name);
5869
new_lock->read_lock_handle =CreateMutex(
5970
NULL,// Default security settings.
6071
FALSE,// Do not take the lock after created.
6172
read_lock_name);// The name of read lock.
62-
if (new_lock->read_lock_handle ==NULL)
73+
free(read_lock_name);
74+
75+
if (new_lock->read_lock_handle ==NULL) {
76+
new_lock->read_lock_handle = INVALID_HANDLE_VALUE;
6377
return AGMDB_ERROR_LOCK_WIN_MUTEX_CREATE_FAIL;
78+
}
79+
6480
if (GetLastError() == ERROR_ALREADY_EXISTS)
6581
lock_exists =true;
6682

83+
write_lock_name = (char *)malloc(write_lock_name_len *sizeof(char));
84+
sprintf_s(write_lock_name, write_lock_name_len,"%s%s", WRITE_LOCK_PREFIX, lock_name);
6785
new_lock->write_lock_handle =CreateMutex(
6886
NULL,// Default security settings.
6987
FALSE,// Do not take the lock after created.
7088
write_lock_name);// The name of write lock.
89+
free(write_lock_name);
90+
7191
if (new_lock->write_lock_handle ==NULL) {
7292
CloseHandle(new_lock->read_lock_handle);
73-
new_lock->read_lock_handle =NULL;
93+
new_lock->read_lock_handle = INVALID_HANDLE_VALUE;
94+
new_lock->write_lock_handle = INVALID_HANDLE_VALUE;
7495
return AGMDB_ERROR_LOCK_WIN_MUTEX_CREATE_FAIL;
7596
}
7697

7798
if ((GetLastError() == ERROR_ALREADY_EXISTS) != lock_exists) {
7899
// One lock exists, another not.
79100
CloseHandle(new_lock->read_lock_handle);
80-
new_lock->read_lock_handle =NULL;
101+
new_lock->read_lock_handle =INVALID_HANDLE_VALUE;
81102
CloseHandle(new_lock->write_lock_handle);
82-
new_lock->write_lock_handle =NULL;
103+
new_lock->write_lock_handle =INVALID_HANDLE_VALUE;
83104
return AGMDB_ERROR_LOCK_WIN_ONLY_ONE_LOCK_EXISTS;
84105
}
85106

@@ -99,12 +120,19 @@ int Lock_create(struct agmdb_lock *new_lock, const char* lock_name, int lock_nam
99120
** AGMDB_ERROR if failed.
100121
*/
101122
intLock_destroy(structagmdb_lock *db_lock) {
123+
int rc = AGMDB_SUCCESS;
124+
if (db_lock ==NULL)
125+
return AGMDB_ERROR_HANDLE_NULL;
126+
rc =Lock_close(db_lock);
127+
if (AGMDB_isError(rc))
128+
return rc;
102129
/* Windows doesn't do anything*/
103130
#ifndef _WIN32
104-
int rc;
105131
rc =semctl(db_lock->sem_id,0, IPC_RMID);
106132
if (rc == -1)
107133
return AGMDB_ERROR_LOCK_LINUX_SEM_DESTROY_FAIL;
134+
else
135+
db_lock->sem_id = -1;
108136
#endif
109137
return AGMDB_SUCCESS;
110138
}
@@ -116,22 +144,24 @@ int Lock_destroy(struct agmdb_lock *db_lock) {
116144
** AGMDB_ERROR if failed.
117145
*/
118146
intLock_close(structagmdb_lock *db_lock) {
147+
if (db_lock ==NULL)
148+
return AGMDB_ERROR_HANDLE_NULL;
119149
/* Linux doesn't do anything*/
120150
#ifdef _WIN32
121151
BOOL rc_read =1;
122152
BOOL rc_write =1;
123-
if (db_lock->read_lock_handle !=NULL)
153+
if (db_lock->read_lock_handle !=INVALID_HANDLE_VALUE)
124154
{
125155
rc_read =CloseHandle(db_lock->read_lock_handle);
126156
if (rc_read !=0)
127-
db_lock->read_lock_handle =NULL;
157+
db_lock->read_lock_handle =INVALID_HANDLE_VALUE;
128158
}
129159

130-
if (db_lock->write_lock_handle !=NULL)
160+
if (db_lock->write_lock_handle !=INVALID_HANDLE_VALUE)
131161
{
132162
rc_write =CloseHandle(db_lock->write_lock_handle);
133163
if (rc_write !=0)
134-
db_lock->write_lock_handle =NULL;
164+
db_lock->write_lock_handle =INVALID_HANDLE_VALUE;
135165
}
136166

137167
if (rc_read ==0 || rc_write ==0)

‎apache2/ag_mdb/ag_mdb_internal.h‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ extern "C" {
5353
*/
5454

5555
#defineDEFAULT_AGMDB_ID_RANGE 0x8fffffff // the default range of database ID mapped by database's name
56-
#defineAGMDB_MAX_NAME_LEN 256 // The name limit of lock and shm's name.
5756

5857
/* Hash Function Default Setting */
5958
#defineDEFAULT_HASH_MAGIC_SEED 0 // the seed of hash function in AGMDB_hash()
@@ -337,6 +336,14 @@ int Entry_setKeyValue(CPTR_VOID shm_base, PTR_OFFSET entry_id, const char* key,
337336
**========================================================
338337
*/
339338

339+
/**
340+
** Define the name prefix of Read/Write lock on Windows
341+
*/
342+
#ifdef_WIN32
343+
#defineREAD_LOCK_PREFIX "DB_LOCK_READ_"
344+
#defineWRITE_LOCK_PREFIX "DB_LOCK_WRITE_"
345+
#endif
346+
340347
/**
341348
** Required by Linux.
342349
** @param val:

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp