1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-05 15:55:57 +03:00

Use mutexes to make sqlite3_set_clientdata() and sqlite3_get_clientdata()

threadsafe.

FossilOrigin-Name: 443ea20ddb0f3bf5d77ef59cd4678f0e32d7da328002bb44d6fc080a53a37e29
This commit is contained in:
drh
2023-08-30 18:51:26 +00:00
parent 7fc4223411
commit 3823208d5b
3 changed files with 23 additions and 10 deletions

View File

@@ -3723,8 +3723,16 @@ int sqlite3_collation_needed16(
*/
void *sqlite3_get_clientdata(sqlite3 *db, const char *zName){
DbClientData *p;
for(p=db->pDbData; p && strcmp(p->zName,zName); p=p->pNext){}
return p ? p->pData : 0;
sqlite3_mutex_enter(db->mutex);
for(p=db->pDbData; p; p=p->pNext){
if( strcmp(p->zName, zName)==0 ){
void *pResult = p->pData;
sqlite3_mutex_leave(db->mutex);
return pResult;
}
}
sqlite3_mutex_leave(db->mutex);
return 0;
}
/*
@@ -3737,6 +3745,7 @@ int sqlite3_set_clientdata(
void (*xDestructor)(void*) /* Destructor */
){
DbClientData *p, **pp;
sqlite3_mutex_enter(db->mutex);
pp = &db->pDbData;
for(p=db->pDbData; p && strcmp(p->zName,zName); p=p->pNext){
pp = &p->pNext;
@@ -3747,15 +3756,18 @@ int sqlite3_set_clientdata(
if( pData==0 ){
*pp = p->pNext;
sqlite3_free(p);
sqlite3_mutex_leave(db->mutex);
return SQLITE_OK;
}
}else if( pData==0 ){
sqlite3_mutex_leave(db->mutex);
return SQLITE_OK;
}else{
size_t n = strlen(zName);
p = sqlite3_malloc64( sizeof(DbClientData)+n+1 );
if( p==0 ){
if( xDestructor ) xDestructor(pData);
sqlite3_mutex_leave(db->mutex);
return SQLITE_NOMEM;
}
memcpy(p->zName, zName, n+1);
@@ -3764,6 +3776,7 @@ int sqlite3_set_clientdata(
}
p->pData = pData;
p->xDestructor = xDestructor;
sqlite3_mutex_leave(db->mutex);
return SQLITE_OK;
}