From cbd39236065544d5f5ac914dfd1099f740b27476 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sat, 21 Jul 2012 08:10:36 +0000 Subject: no more direct access to critsecs in mmap git-svn-id: http://svn.miranda-ng.org/main/trunk@1089 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Db3x_mmap/dbcache.cpp | 15 ++-- plugins/Db3x_mmap/dbcontacts.cpp | 83 ++++++++--------- plugins/Db3x_mmap/dbevents.cpp | 178 ++++++++++++++++++------------------- plugins/Db3x_mmap/dbsettings.cpp | 186 +++++++++++++++++---------------------- 4 files changed, 213 insertions(+), 249 deletions(-) diff --git a/plugins/Db3x_mmap/dbcache.cpp b/plugins/Db3x_mmap/dbcache.cpp index 03fcc7d7d0..466aa7a00d 100644 --- a/plugins/Db3x_mmap/dbcache.cpp +++ b/plugins/Db3x_mmap/dbcache.cpp @@ -54,7 +54,7 @@ void CDdxMmap::ReMap(DWORD needed) } } else - m_dwFileSize += m_ChunkSize; + m_dwFileSize += m_ChunkSize; // FlushViewOfFile(m_pDbCache, 0); UnmapViewOfFile(m_pDbCache); @@ -68,8 +68,8 @@ void CDdxMmap::DBMoveChunk(DWORD ofsDest,DWORD ofsSource,int bytes) { int x = 0; log3("move %d %08x->%08x",bytes,ofsSource,ofsDest); - if (ofsDest+bytes>m_dwFileSize) ReMap(ofsDest+bytes-m_dwFileSize); - if (ofsSource+bytes>m_dwFileSize) { + if (ofsDest+bytes > m_dwFileSize) ReMap(ofsDest+bytes-m_dwFileSize); + if (ofsSource+bytes > m_dwFileSize) { x = ofsSource+bytes-m_dwFileSize; log0("buggy move!"); _ASSERT(0); @@ -100,7 +100,7 @@ PBYTE CDdxMmap::DBRead(DWORD ofs,int bytesRequired,int *bytesAvail) void CDdxMmap::DBWrite(DWORD ofs,PVOID pData,int bytes) { log2("write %d@%08x",bytes,ofs); - if (ofs+bytes>m_dwFileSize) ReMap(ofs+bytes-m_dwFileSize); + if (ofs+bytes > m_dwFileSize) ReMap(ofs+bytes-m_dwFileSize); MoveMemory(m_pDbCache+ofs,pData,bytes); logg(); } @@ -160,13 +160,12 @@ void CDdxMmap::DBFlush(int setting) int CDdxMmap::InitCache(void) { - DWORD x; - m_dwFileSize = GetFileSize(m_hDbFile, NULL); // Align to chunk - x = m_dwFileSize % m_ChunkSize; - if (x) m_dwFileSize += m_ChunkSize - x; + DWORD x = m_dwFileSize % m_ChunkSize; + if (x) + m_dwFileSize += m_ChunkSize - x; Map(); diff --git a/plugins/Db3x_mmap/dbcontacts.cpp b/plugins/Db3x_mmap/dbcontacts.cpp index c23db78f30..b8d4a843b8 100644 --- a/plugins/Db3x_mmap/dbcontacts.cpp +++ b/plugins/Db3x_mmap/dbcontacts.cpp @@ -39,9 +39,9 @@ DBCachedContactValueList* CDdxMmap::AddToCachedContactList(HANDLE hContact, int int CDdxMmap::CheckProto(HANDLE hContact, const char *proto) { - static char protobuf[MAX_PATH] = {0}; - static DBVARIANT dbv; - static DBCONTACTGETSETTING sVal = {proto_module,proto_setting,&dbv}; + char protobuf[MAX_PATH] = {0}; + DBVARIANT dbv; + DBCONTACTGETSETTING sVal = {proto_module,proto_setting,&dbv}; dbv.type = DBVT_ASCIIZ; dbv.pszVal = protobuf; @@ -106,35 +106,31 @@ STDMETHODIMP_(HANDLE) CDdxMmap::FindNextContact(HANDLE hContact, const char *szP STDMETHODIMP_(LONG) CDdxMmap::DeleteContact(HANDLE hContact) { - DWORD ofsThis,ofsNext,ofsFirstEvent; - DBContactSettings *dbcs; - DBEvent *dbe; - int index; - if (hContact == NULL) return 1; - { - mir_cslock lck(m_csDbAccess); - DBContact *dbc = (DBContact*)DBRead(hContact, sizeof(DBContact), NULL); - if (dbc->signature != DBCONTACT_SIGNATURE) - return 1; + mir_cslockfull lck(m_csDbAccess); + DBContact *dbc = (DBContact*)DBRead(hContact, sizeof(DBContact), NULL); + if (dbc->signature != DBCONTACT_SIGNATURE) + return 1; - if (hContact == (HANDLE)m_dbHeader.ofsUser) { - log0("FATAL: del of user chain attempted."); - return 1; - } - log0("del contact"); + if (hContact == (HANDLE)m_dbHeader.ofsUser) { + log0("FATAL: del of user chain attempted."); + return 1; } + lck.unlock(); + log0("del contact"); + // call notifier while outside mutex NotifyEventHooks(hContactDeletedEvent, (WPARAM)hContact, 0); // get back in - mir_cslock lck(m_csDbAccess); + lck.lock(); DBCachedContactValueList VLtemp; VLtemp.hContact = hContact; + int index; if ((index = m_lContacts.getIndex(&VLtemp)) != -1) { DBCachedContactValueList *VL = m_lContacts[index]; DBCachedContactValue* V = VL->first; @@ -151,21 +147,21 @@ STDMETHODIMP_(LONG) CDdxMmap::DeleteContact(HANDLE hContact) m_lContacts.remove(index); } - DBContact *dbc = (DBContact*)DBRead(hContact, sizeof(DBContact), NULL); + dbc = (DBContact*)DBRead(hContact, sizeof(DBContact), NULL); //delete settings chain - ofsThis = dbc->ofsFirstSettings; - ofsFirstEvent = dbc->ofsFirstEvent; + DWORD ofsThis = dbc->ofsFirstSettings; + DWORD ofsFirstEvent = dbc->ofsFirstEvent; while (ofsThis) { - dbcs = (DBContactSettings*)DBRead(ofsThis,sizeof(DBContactSettings),NULL); - ofsNext = dbcs->ofsNext; + DBContactSettings *dbcs = (DBContactSettings*)DBRead(ofsThis,sizeof(DBContactSettings),NULL); + DWORD ofsNext = dbcs->ofsNext; DeleteSpace(ofsThis,offsetof(DBContactSettings,blob)+dbcs->cbBlob); ofsThis = ofsNext; } //delete event chain ofsThis = ofsFirstEvent; while (ofsThis) { - dbe = (DBEvent*)DBRead(ofsThis,sizeof(DBEvent),NULL); - ofsNext = dbe->ofsNext; + DBEvent *dbe = (DBEvent*)DBRead(ofsThis,sizeof(DBEvent),NULL); + DWORD ofsNext = dbe->ofsNext; DeleteSpace(ofsThis,offsetof(DBEvent,blob)+dbe->cbBlob); ofsThis = ofsNext; } @@ -176,7 +172,7 @@ STDMETHODIMP_(LONG) CDdxMmap::DeleteContact(HANDLE hContact) DBWrite(0,&m_dbHeader,sizeof(m_dbHeader)); } else { - ofsNext = dbc->ofsNext; + DWORD ofsNext = dbc->ofsNext; ofsThis = m_dbHeader.ofsFirstContact; DBContact *dbcPrev = (DBContact*)DBRead(ofsThis,sizeof(DBContact),NULL); while (dbcPrev->ofsNext != (DWORD)hContact) { @@ -230,24 +226,19 @@ STDMETHODIMP_(HANDLE) CDdxMmap::AddContact() STDMETHODIMP_(BOOL) CDdxMmap::IsDbContact(HANDLE hContact) { - DBContact *dbc; - DWORD ofsContact = (DWORD)hContact; - int ret; + mir_cslock lck(m_csDbAccess); - EnterCriticalSection(&m_csDbAccess); - { - int index; - DBCachedContactValueList VLtemp; - VLtemp.hContact = hContact; - if ((index = m_lContacts.getIndex(&VLtemp)) != -1) - ret = TRUE; - else { - dbc = (DBContact*)DBRead(ofsContact,sizeof(DBContact),NULL); - ret = dbc->signature == DBCONTACT_SIGNATURE; - if (ret) - AddToCachedContactList(hContact, index); - } } - - LeaveCriticalSection(&m_csDbAccess); - return ret; + DBCachedContactValueList VLtemp; + VLtemp.hContact = hContact; + int index = m_lContacts.getIndex(&VLtemp); + if (index != -1) + return TRUE; + + DBContact *dbc = (DBContact*)DBRead(hContact,sizeof(DBContact),NULL); + if (dbc->signature == DBCONTACT_SIGNATURE) { + AddToCachedContactList(hContact, index); + return TRUE; + } + + return FALSE; } diff --git a/plugins/Db3x_mmap/dbevents.cpp b/plugins/Db3x_mmap/dbevents.cpp index ba4f496868..22245d4515 100644 --- a/plugins/Db3x_mmap/dbevents.cpp +++ b/plugins/Db3x_mmap/dbevents.cpp @@ -48,88 +48,86 @@ STDMETHODIMP_(HANDLE) CDdxMmap::AddEvent(HANDLE hContact, DBEVENTINFO *dbei) return 0; BOOL neednotify; - DWORD ofsNew; - { - mir_cslock lck(m_csDbAccess); - - DWORD ofsContact = (hContact == 0) ? m_dbHeader.ofsUser : (DWORD)hContact; - DBContact dbc = *(DBContact*)DBRead(ofsContact,sizeof(DBContact),NULL); - if (dbc.signature != DBCONTACT_SIGNATURE) - return 0; - - ofsNew = CreateNewSpace(offsetof(DBEvent,blob) + dbei->cbBlob); - DWORD ofsModuleName = GetModuleNameOfs(dbei->szModule); - - DBEvent dbe; - dbe.signature = DBEVENT_SIGNATURE; - dbe.ofsModuleName = ofsModuleName; - dbe.timestamp = dbei->timestamp; - dbe.flags = dbei->flags; - dbe.eventType = dbei->eventType; - dbe.cbBlob = dbei->cbBlob; - //find where to put it - sort by timestamp - if (dbc.eventCount == 0) { + mir_cslockfull lck(m_csDbAccess); + + DWORD ofsContact = (hContact == 0) ? m_dbHeader.ofsUser : (DWORD)hContact; + DBContact dbc = *(DBContact*)DBRead(ofsContact,sizeof(DBContact),NULL); + if (dbc.signature != DBCONTACT_SIGNATURE) + return 0; + + DWORD ofsNew = CreateNewSpace(offsetof(DBEvent,blob) + dbei->cbBlob); + DWORD ofsModuleName = GetModuleNameOfs(dbei->szModule); + + DBEvent dbe; + dbe.signature = DBEVENT_SIGNATURE; + dbe.ofsModuleName = ofsModuleName; + dbe.timestamp = dbei->timestamp; + dbe.flags = dbei->flags; + dbe.eventType = dbei->eventType; + dbe.cbBlob = dbei->cbBlob; + //find where to put it - sort by timestamp + if (dbc.eventCount == 0) { + dbe.ofsPrev = (DWORD)hContact; + dbe.ofsNext = 0; + dbe.flags |= DBEF_FIRST; + dbc.ofsFirstEvent = dbc.ofsLastEvent = ofsNew; + } + else { + DBEvent *dbeTest = (DBEvent*)DBRead(dbc.ofsFirstEvent,sizeof(DBEvent),NULL); + // Should new event be placed before first event in chain? + if (dbei->timestamp < dbeTest->timestamp) { dbe.ofsPrev = (DWORD)hContact; - dbe.ofsNext = 0; + dbe.ofsNext = dbc.ofsFirstEvent; dbe.flags |= DBEF_FIRST; - dbc.ofsFirstEvent = dbc.ofsLastEvent = ofsNew; + dbc.ofsFirstEvent = ofsNew; + dbeTest = (DBEvent*)DBRead(dbe.ofsNext,sizeof(DBEvent),NULL); + dbeTest->flags &= ~DBEF_FIRST; + dbeTest->ofsPrev = ofsNew; + DBWrite(dbe.ofsNext,dbeTest,sizeof(DBEvent)); } else { - DBEvent *dbeTest = (DBEvent*)DBRead(dbc.ofsFirstEvent,sizeof(DBEvent),NULL); - // Should new event be placed before first event in chain? - if (dbei->timestamp < dbeTest->timestamp) { - dbe.ofsPrev = (DWORD)hContact; - dbe.ofsNext = dbc.ofsFirstEvent; - dbe.flags |= DBEF_FIRST; - dbc.ofsFirstEvent = ofsNew; - dbeTest = (DBEvent*)DBRead(dbe.ofsNext,sizeof(DBEvent),NULL); - dbeTest->flags &= ~DBEF_FIRST; - dbeTest->ofsPrev = ofsNew; - DBWrite(dbe.ofsNext,dbeTest,sizeof(DBEvent)); - } - else { - // Loop through the chain, starting at the end - DWORD ofsThis = dbc.ofsLastEvent; - dbeTest = (DBEvent*)DBRead(ofsThis, sizeof(DBEvent), NULL); - for (;;) { - // If the new event's timesstamp is equal to or greater than the - // current dbevent, it will be inserted after. If not, continue - // with the previous dbevent in chain. - if (dbe.timestamp >= dbeTest->timestamp) { - dbe.ofsPrev = ofsThis; - dbe.ofsNext = dbeTest->ofsNext; - dbeTest->ofsNext = ofsNew; - DBWrite(ofsThis, dbeTest, sizeof(DBEvent)); - if (dbe.ofsNext == 0) - dbc.ofsLastEvent = ofsNew; - else { - dbeTest = (DBEvent*)DBRead(dbe.ofsNext, sizeof(DBEvent), NULL); - dbeTest->ofsPrev = ofsNew; - DBWrite(dbe.ofsNext, dbeTest, sizeof(DBEvent)); - } - break; + // Loop through the chain, starting at the end + DWORD ofsThis = dbc.ofsLastEvent; + dbeTest = (DBEvent*)DBRead(ofsThis, sizeof(DBEvent), NULL); + for (;;) { + // If the new event's timesstamp is equal to or greater than the + // current dbevent, it will be inserted after. If not, continue + // with the previous dbevent in chain. + if (dbe.timestamp >= dbeTest->timestamp) { + dbe.ofsPrev = ofsThis; + dbe.ofsNext = dbeTest->ofsNext; + dbeTest->ofsNext = ofsNew; + DBWrite(ofsThis, dbeTest, sizeof(DBEvent)); + if (dbe.ofsNext == 0) + dbc.ofsLastEvent = ofsNew; + else { + dbeTest = (DBEvent*)DBRead(dbe.ofsNext, sizeof(DBEvent), NULL); + dbeTest->ofsPrev = ofsNew; + DBWrite(dbe.ofsNext, dbeTest, sizeof(DBEvent)); } - ofsThis = dbeTest->ofsPrev; - dbeTest = (DBEvent*)DBRead(ofsThis, sizeof(DBEvent), NULL); + break; } + ofsThis = dbeTest->ofsPrev; + dbeTest = (DBEvent*)DBRead(ofsThis, sizeof(DBEvent), NULL); } } - dbc.eventCount++; + } + dbc.eventCount++; - if (!(dbe.flags&(DBEF_READ|DBEF_SENT))) { - if (dbe.timestamppBlob,dbei->cbBlob); - DBFlush(0); + neednotify = TRUE; } + else neednotify = m_safetyMode; + + DBWrite(ofsContact,&dbc,sizeof(DBContact)); + DBWrite(ofsNew,&dbe,offsetof(DBEvent,blob)); + DBWrite(ofsNew+offsetof(DBEvent,blob),dbei->pBlob,dbei->cbBlob); + DBFlush(0); + lck.unlock(); log1("add event @ %08x",ofsNew); @@ -142,26 +140,25 @@ STDMETHODIMP_(HANDLE) CDdxMmap::AddEvent(HANDLE hContact, DBEVENTINFO *dbei) STDMETHODIMP_(BOOL) CDdxMmap::DeleteEvent(HANDLE hContact, HANDLE hDbEvent) { - DWORD ofsContact,ofsThis; - { - mir_cslock lck(m_csDbAccess); - - ofsContact = (hContact == 0) ? m_dbHeader.ofsUser : (DWORD)hContact; - DBContact dbc = *(DBContact*)DBRead(ofsContact, sizeof(DBContact), NULL); - DBEvent dbe = *(DBEvent*)DBRead(hDbEvent, sizeof(DBEvent), NULL); - if (dbc.signature != DBCONTACT_SIGNATURE || dbe.signature != DBEVENT_SIGNATURE) - return 1; - } + mir_cslockfull lck(m_csDbAccess); + + DWORD ofsContact = (hContact == 0) ? m_dbHeader.ofsUser : (DWORD)hContact; + DBContact dbc = *(DBContact*)DBRead(ofsContact, sizeof(DBContact), NULL); + DBEvent dbe = *(DBEvent*)DBRead(hDbEvent, sizeof(DBEvent), NULL); + if (dbc.signature != DBCONTACT_SIGNATURE || dbe.signature != DBEVENT_SIGNATURE) + return 1; + lck.unlock(); log1("delete event @ %08x",wParam); //call notifier while outside mutex NotifyEventHooks(hEventDeletedEvent,(WPARAM)hContact, (LPARAM)hDbEvent); //get back in - mir_cslock lck(m_csDbAccess); - DBContact dbc = *(DBContact*)DBRead(ofsContact,sizeof(DBContact),NULL); - DBEvent dbe = *(DBEvent*)DBRead(hDbEvent,sizeof(DBEvent),NULL); + lck.lock(); + dbc = *(DBContact*)DBRead(ofsContact,sizeof(DBContact),NULL); + dbe = *(DBEvent*)DBRead(hDbEvent,sizeof(DBEvent),NULL); + //check if this was the first unread, if so, recalc the first unread if (dbc.ofsFirstUnreadEvent == (DWORD)hDbEvent) { DBEvent *dbeNext = &dbe; @@ -171,7 +168,7 @@ STDMETHODIMP_(BOOL) CDdxMmap::DeleteEvent(HANDLE hContact, HANDLE hDbEvent) dbc.timestampFirstUnread = 0; break; } - ofsThis = dbeNext->ofsNext; + DWORD ofsThis = dbeNext->ofsNext; dbeNext = (DBEvent*)DBRead(ofsThis,sizeof(DBEvent),NULL); if ( !(dbeNext->flags & (DBEF_READ | DBEF_SENT))) { dbc.ofsFirstUnreadEvent = ofsThis; @@ -259,7 +256,6 @@ STDMETHODIMP_(BOOL) CDdxMmap::GetEvent(HANDLE hDbEvent, DBEVENTINFO *dbei) STDMETHODIMP_(BOOL) CDdxMmap::MarkEventRead(HANDLE hContact, HANDLE hDbEvent) { - INT_PTR ret; DBEvent *dbe; DBContact dbc; DWORD ofsThis; @@ -272,15 +268,13 @@ STDMETHODIMP_(BOOL) CDdxMmap::MarkEventRead(HANDLE hContact, HANDLE hDbEvent) if (dbe->signature != DBEVENT_SIGNATURE || dbc.signature != DBCONTACT_SIGNATURE) return -1; - if (dbe->flags&DBEF_READ || dbe->flags&DBEF_SENT) { - ret = (INT_PTR)dbe->flags; - return ret; - } + if ((dbe->flags & DBEF_READ) || (dbe->flags & DBEF_SENT)) + return (INT_PTR)dbe->flags; log1("mark read @ %08x",wParam); dbe->flags |= DBEF_READ; DBWrite((DWORD)hDbEvent,dbe,sizeof(DBEvent)); - ret = (int)dbe->flags; + BOOL ret = dbe->flags; if (dbc.ofsFirstUnreadEvent == (DWORD)hDbEvent) { for (;;) { if (dbe->ofsNext == 0) { @@ -297,7 +291,7 @@ STDMETHODIMP_(BOOL) CDdxMmap::MarkEventRead(HANDLE hContact, HANDLE hDbEvent) } } } - DBWrite((DWORD)hContact,&dbc,sizeof(DBContact)); + DBWrite((DWORD)hContact, &dbc, sizeof(DBContact)); DBFlush(0); return ret; } diff --git a/plugins/Db3x_mmap/dbsettings.cpp b/plugins/Db3x_mmap/dbsettings.cpp index 96df28a227..9423d7141c 100644 --- a/plugins/Db3x_mmap/dbsettings.cpp +++ b/plugins/Db3x_mmap/dbsettings.cpp @@ -228,7 +228,7 @@ int CDdxMmap::GetContactSettingWorker(HANDLE hContact,DBCONTACTGETSETTING *dbcgs return 1; } - EnterCriticalSection(&m_csDbAccess); + mir_cslock lck(m_csDbAccess); log3("get [%08p] %s/%s",hContact,dbcgs->szModule,dbcgs->szSetting); @@ -269,7 +269,6 @@ int CDdxMmap::GetContactSettingWorker(HANDLE hContact,DBCONTACTGETSETTING *dbcgs default: log1( "get cached crap: %d", dbcgs->pValue->type ); break; } - LeaveCriticalSection(&m_csDbAccess); return ( pCachedValue->type == DBVT_DELETED ) ? 1 : 0; } } @@ -277,10 +276,9 @@ int CDdxMmap::GetContactSettingWorker(HANDLE hContact,DBCONTACTGETSETTING *dbcgs if (hContact == NULL) ofsContact = m_dbHeader.ofsUser; else ofsContact = (DWORD)hContact; dbc = (DBContact*)DBRead(ofsContact,sizeof(DBContact),NULL); - if (dbc->signature != DBCONTACT_SIGNATURE) { - LeaveCriticalSection(&m_csDbAccess); + if (dbc->signature != DBCONTACT_SIGNATURE) return 1; - } + ofsSettingsGroup = GetSettingsGroupOfsByModuleNameOfs(dbc,ofsModuleName); if (ofsSettingsGroup) { ofsBlobPtr = ofsSettingsGroup+offsetof(DBContactSettings,blob); @@ -290,17 +288,15 @@ int CDdxMmap::GetContactSettingWorker(HANDLE hContact,DBCONTACTGETSETTING *dbcgs if (pBlob[0] == settingNameLen && !memcmp(pBlob+1,dbcgs->szSetting,settingNameLen)) { MoveAlong(1+settingNameLen); NeedBytes(5); - if (isStatic && pBlob[0]&DBVTF_VARIABLELENGTH && VLT(dbcgs->pValue->type) != VLT(pBlob[0])) { - LeaveCriticalSection(&m_csDbAccess); + if (isStatic && pBlob[0]&DBVTF_VARIABLELENGTH && VLT(dbcgs->pValue->type) != VLT(pBlob[0])) return 1; - } + dbcgs->pValue->type = pBlob[0]; switch(pBlob[0]) { - case DBVT_DELETED: { /* this setting is deleted */ + case DBVT_DELETED: /* this setting is deleted */ dbcgs->pValue->type = DBVT_DELETED; - LeaveCriticalSection(&m_csDbAccess); return 2; - } + case DBVT_BYTE: dbcgs->pValue->bVal = pBlob[1]; break; case DBVT_WORD: dbcgs->pValue->wVal = *(PWORD)(pBlob+1); break; case DBVT_DWORD: dbcgs->pValue->dVal = *(PDWORD)(pBlob+1); break; @@ -342,7 +338,6 @@ int CDdxMmap::GetContactSettingWorker(HANDLE hContact,DBCONTACTGETSETTING *dbcgs SetCachedVariant(dbcgs->pValue,pCachedValue); } - LeaveCriticalSection(&m_csDbAccess); logg(); return 0; } @@ -361,7 +356,6 @@ int CDdxMmap::GetContactSettingWorker(HANDLE hContact,DBCONTACTGETSETTING *dbcgs pCachedValue->type = DBVT_DELETED; } - LeaveCriticalSection(&m_csDbAccess); logg(); return 1; } @@ -486,12 +480,12 @@ STDMETHODIMP_(BOOL) CDdxMmap::FreeVariant(DBVARIANT *dbv) STDMETHODIMP_(BOOL) CDdxMmap::SetSettingResident(BOOL bIsResident, const char *pszSettingName) { size_t cbSettingNameLen = strlen(pszSettingName) + 2; - if (cbSettingNameLen < 512) { + if (cbSettingNameLen < 512) { char* szSetting; char szTemp[512]; strcpy( szTemp+1, pszSettingName); - EnterCriticalSection(&m_csDbAccess); + mir_cslock lck(m_csDbAccess); int idx = m_lSettings.getIndex(szTemp); if (idx == -1) szSetting = InsertCachedSetting( szTemp, cbSettingNameLen); @@ -507,8 +501,6 @@ STDMETHODIMP_(BOOL) CDdxMmap::SetSettingResident(BOOL bIsResident, const char *p } else if (!bIsResident) m_lResidentSettings.remove(idx); - - LeaveCriticalSection(&m_csDbAccess); } return 0; } @@ -516,7 +508,6 @@ STDMETHODIMP_(BOOL) CDdxMmap::SetSettingResident(BOOL bIsResident, const char *p STDMETHODIMP_(BOOL) CDdxMmap::WriteContactSetting(HANDLE hContact, DBCONTACTWRITESETTING *dbcws) { DBCONTACTWRITESETTING tmp; - DBContact dbc; DWORD ofsModuleName; DBContactSettings dbcs; PBYTE pBlob; @@ -581,46 +572,42 @@ STDMETHODIMP_(BOOL) CDdxMmap::WriteContactSetting(HANDLE hContact, DBCONTACTWRIT } } - EnterCriticalSection(&m_csDbAccess); - { - char* szCachedSettingName = GetCachedSetting(tmp.szModule, tmp.szSetting, moduleNameLen, settingNameLen); - if ( tmp.value.type != DBVT_BLOB ) { - DBVARIANT* pCachedValue = GetCachedValuePtr(hContact, szCachedSettingName, 1); - if ( pCachedValue != NULL ) { - BOOL bIsIdentical = FALSE; - if ( pCachedValue->type == tmp.value.type ) { - switch(tmp.value.type) { - case DBVT_BYTE: bIsIdentical = pCachedValue->bVal == tmp.value.bVal; break; - case DBVT_WORD: bIsIdentical = pCachedValue->wVal == tmp.value.wVal; break; - case DBVT_DWORD: bIsIdentical = pCachedValue->dVal == tmp.value.dVal; break; - case DBVT_UTF8: - case DBVT_ASCIIZ: bIsIdentical = strcmp( pCachedValue->pszVal, tmp.value.pszVal ) == 0; break; - } - if ( bIsIdentical ) { - LeaveCriticalSection(&m_csDbAccess); - return 0; - } + mir_cslockfull lck(m_csDbAccess); + + char* szCachedSettingName = GetCachedSetting(tmp.szModule, tmp.szSetting, moduleNameLen, settingNameLen); + if ( tmp.value.type != DBVT_BLOB ) { + DBVARIANT* pCachedValue = GetCachedValuePtr(hContact, szCachedSettingName, 1); + if ( pCachedValue != NULL ) { + BOOL bIsIdentical = FALSE; + if ( pCachedValue->type == tmp.value.type ) { + switch(tmp.value.type) { + case DBVT_BYTE: bIsIdentical = pCachedValue->bVal == tmp.value.bVal; break; + case DBVT_WORD: bIsIdentical = pCachedValue->wVal == tmp.value.wVal; break; + case DBVT_DWORD: bIsIdentical = pCachedValue->dVal == tmp.value.dVal; break; + case DBVT_UTF8: + case DBVT_ASCIIZ: bIsIdentical = strcmp( pCachedValue->pszVal, tmp.value.pszVal ) == 0; break; } - SetCachedVariant(&tmp.value, pCachedValue); - } - if ( szCachedSettingName[-1] != 0 ) { - LeaveCriticalSection(&m_csDbAccess); - NotifyEventHooks(hSettingChangeEvent, (WPARAM)hContact, (LPARAM)&tmp); - return 0; + if ( bIsIdentical ) + return 0; } + SetCachedVariant(&tmp.value, pCachedValue); + } + if ( szCachedSettingName[-1] != 0 ) { + lck.unlock(); + NotifyEventHooks(hSettingChangeEvent, (WPARAM)hContact, (LPARAM)&tmp); + return 0; } - else GetCachedValuePtr(hContact, szCachedSettingName, -1); } + else GetCachedValuePtr(hContact, szCachedSettingName, -1); ofsModuleName = GetModuleNameOfs(tmp.szModule); if (hContact == 0) ofsContact = m_dbHeader.ofsUser; else ofsContact = (DWORD)hContact; - dbc = *(DBContact*)DBRead(ofsContact,sizeof(DBContact),NULL); - if (dbc.signature != DBCONTACT_SIGNATURE) { - LeaveCriticalSection(&m_csDbAccess); + DBContact dbc = *(DBContact*)DBRead(ofsContact,sizeof(DBContact),NULL); + if (dbc.signature != DBCONTACT_SIGNATURE) return 1; - } + log0("write setting"); //make sure the module group exists ofsSettingsGroup = GetSettingsGroupOfsByModuleNameOfs(&dbc,ofsModuleName); @@ -696,7 +683,7 @@ STDMETHODIMP_(BOOL) CDdxMmap::WriteContactSetting(HANDLE hContact, DBCONTACTWRIT } //quit DBFlush(1); - LeaveCriticalSection(&m_csDbAccess); + lck.unlock(); //notify NotifyEventHooks(hSettingChangeEvent, (WPARAM)hContact, (LPARAM)&tmp); return 0; @@ -713,7 +700,7 @@ STDMETHODIMP_(BOOL) CDdxMmap::WriteContactSetting(HANDLE hContact, DBCONTACTWRIT else bytesRequired = tmp.value.type; bytesRequired += 2+settingNameLen; bytesRequired += ofsBlobPtr+1-(ofsSettingsGroup+offsetof(DBContactSettings,blob)); - if ((DWORD)bytesRequired>dbcs.cbBlob) { + if ((DWORD)bytesRequired > dbcs.cbBlob) { //doesn't fit: move entire group DBContactSettings *dbcsPrev; DWORD ofsDbcsPrev,ofsNew; @@ -774,12 +761,14 @@ STDMETHODIMP_(BOOL) CDdxMmap::WriteContactSetting(HANDLE hContact, DBCONTACTWRIT MoveAlong(2+tmp.value.cpbVal); break; } - { BYTE zero = 0; - DBWrite(ofsBlobPtr,&zero,1); - } + + BYTE zero = 0; + DBWrite(ofsBlobPtr,&zero,1); + //quit DBFlush(1); - LeaveCriticalSection(&m_csDbAccess); + lck.unlock(); + //notify NotifyEventHooks(hSettingChangeEvent, (WPARAM)hContact, (LPARAM)&tmp ); return 0; @@ -794,42 +783,39 @@ STDMETHODIMP_(BOOL) CDdxMmap::DeleteContactSetting(HANDLE hContact, DBCONTACTGET char* szCachedSettingName; WPARAM saveWparam = (WPARAM)hContact; - if ((!dbcgs->szModule) || (!dbcgs->szSetting)) + if ( !dbcgs->szModule || !dbcgs->szSetting) return 1; + // the db format can't tolerate more than 255 bytes of space (incl. null) for settings+module name settingNameLen = (int)strlen(dbcgs->szSetting); moduleNameLen = (int)strlen(dbcgs->szModule); - if ( settingNameLen > 0xFE ) - { + if ( settingNameLen > 0xFE ) { #ifdef _DEBUG OutputDebugStringA("DeleteContactSetting() got a > 255 setting name length. \n"); #endif return 1; } - if ( moduleNameLen > 0xFE ) - { + if ( moduleNameLen > 0xFE ) { #ifdef _DEBUG OutputDebugStringA("DeleteContactSetting() got a > 255 module name length. \n"); #endif return 1; } - EnterCriticalSection(&m_csDbAccess); + mir_cslockfull lck(m_csDbAccess); ofsModuleName = GetModuleNameOfs(dbcgs->szModule); if (hContact == 0) hContact = (HANDLE)m_dbHeader.ofsUser; dbc = (DBContact*)DBRead(hContact,sizeof(DBContact),NULL); - if (dbc->signature != DBCONTACT_SIGNATURE) { - LeaveCriticalSection(&m_csDbAccess); + if (dbc->signature != DBCONTACT_SIGNATURE) return 1; - } + //make sure the module group exists ofsSettingsGroup = GetSettingsGroupOfsByModuleNameOfs(dbc,ofsModuleName); - if (ofsSettingsGroup == 0) { - LeaveCriticalSection(&m_csDbAccess); + if (ofsSettingsGroup == 0) return 1; - } + //find if the setting exists ofsBlobPtr = ofsSettingsGroup+offsetof(DBContactSettings,blob); pBlob = (PBYTE)DBRead(ofsBlobPtr,1,&bytesRemaining); @@ -843,42 +829,40 @@ STDMETHODIMP_(BOOL) CDdxMmap::DeleteContactSetting(HANDLE hContact, DBCONTACTGET MoveAlong(1+GetSettingValueLength(pBlob)); NeedBytes(1); } - if (!pBlob[0]) { //setting didn't exist - LeaveCriticalSection(&m_csDbAccess); + if (!pBlob[0]) //setting didn't exist return 1; - } - { //bin it - int nameLen,valLen; - DWORD ofsSettingToCut; - MoveAlong(1+settingNameLen); + + //bin it + int nameLen,valLen; + DWORD ofsSettingToCut; + MoveAlong(1+settingNameLen); + NeedBytes(3); + nameLen = 1+settingNameLen; + valLen = 1+GetSettingValueLength(pBlob); + ofsSettingToCut = ofsBlobPtr-nameLen; + MoveAlong(valLen); + NeedBytes(1); + while (pBlob[0]) { + MoveAlong(pBlob[0]+1); NeedBytes(3); - nameLen = 1+settingNameLen; - valLen = 1+GetSettingValueLength(pBlob); - ofsSettingToCut = ofsBlobPtr-nameLen; - MoveAlong(valLen); + MoveAlong(1+GetSettingValueLength(pBlob)); NeedBytes(1); - while (pBlob[0]) { - MoveAlong(pBlob[0]+1); - NeedBytes(3); - MoveAlong(1+GetSettingValueLength(pBlob)); - NeedBytes(1); - } - DBMoveChunk(ofsSettingToCut,ofsSettingToCut+nameLen+valLen,ofsBlobPtr+1-ofsSettingToCut); } + DBMoveChunk(ofsSettingToCut,ofsSettingToCut+nameLen+valLen,ofsBlobPtr+1-ofsSettingToCut); szCachedSettingName = GetCachedSetting(dbcgs->szModule,dbcgs->szSetting,moduleNameLen,settingNameLen); GetCachedValuePtr((HANDLE)saveWparam, szCachedSettingName, -1 ); //quit DBFlush(1); - LeaveCriticalSection(&m_csDbAccess); - { //notify - DBCONTACTWRITESETTING dbcws = {0}; - dbcws.szModule = dbcgs->szModule; - dbcws.szSetting = dbcgs->szSetting; - dbcws.value.type = DBVT_DELETED; - NotifyEventHooks(hSettingChangeEvent,saveWparam,(LPARAM)&dbcws); - } + lck.unlock(); + + //notify + DBCONTACTWRITESETTING dbcws = {0}; + dbcws.szModule = dbcgs->szModule; + dbcws.szSetting = dbcgs->szSetting; + dbcws.value.type = DBVT_DELETED; + NotifyEventHooks(hSettingChangeEvent,saveWparam,(LPARAM)&dbcws); return 0; } @@ -893,27 +877,24 @@ STDMETHODIMP_(BOOL) CDdxMmap::EnumContactSettings(HANDLE hContact, DBCONTACTENUM if (!dbces->szModule) return -1; - EnterCriticalSection(&m_csDbAccess); + mir_cslock lck(m_csDbAccess); ofsModuleName = GetModuleNameOfs(dbces->szModule); if (hContact == 0) ofsContact = m_dbHeader.ofsUser; else ofsContact = (DWORD)hContact; dbc = (DBContact*)DBRead(ofsContact,sizeof(DBContact),NULL); - if (dbc->signature != DBCONTACT_SIGNATURE) { - LeaveCriticalSection(&m_csDbAccess); + if (dbc->signature != DBCONTACT_SIGNATURE) return -1; - } + dbces->ofsSettings = GetSettingsGroupOfsByModuleNameOfs(dbc,ofsModuleName); - if (!dbces->ofsSettings) { - LeaveCriticalSection(&m_csDbAccess); + if ( !dbces->ofsSettings) return -1; - } + ofsBlobPtr = dbces->ofsSettings+offsetof(DBContactSettings,blob); pBlob = (PBYTE)DBRead(ofsBlobPtr,1,&bytesRemaining); - if (pBlob[0] == 0) { - LeaveCriticalSection(&m_csDbAccess); + if (pBlob[0] == 0) return -1; - } + result = 0; while (pBlob[0]) { NeedBytes(1); @@ -925,7 +906,6 @@ STDMETHODIMP_(BOOL) CDdxMmap::EnumContactSettings(HANDLE hContact, DBCONTACTENUM MoveAlong(1+GetSettingValueLength(pBlob)); NeedBytes(1); } - LeaveCriticalSection(&m_csDbAccess); return result; } -- cgit v1.2.3