diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/main.c b/src/main.c index 257b9b760..6525fc0d7 100644 --- a/src/main.c +++ b/src/main.c @@ -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; } |