Fix thread synchronization, use critical sections.

Rewrite some functions (optimize).


svn path=/trunk/; revision=22691
This commit is contained in:
Saveliy Tretiakov 2006-06-29 17:36:04 +00:00
parent 410ae9c26b
commit 0e79c3011a
2 changed files with 78 additions and 59 deletions

View file

@ -22,8 +22,11 @@ SERVICE_TABLE_ENTRY ServiceTable[2] =
HANDLE MyHeap = NULL; HANDLE MyHeap = NULL;
PLOGFILE SystemLog = NULL; PLOGFILE SystemLog = NULL;
PLOGFILE ApplicationLog = NULL; PLOGFILE ApplicationLog = NULL;
PLOGFILE SecurityLog = NULL;
BOOL onLiveCD = FALSE; // On livecd events will go to debug output only BOOL onLiveCD = FALSE; // On livecd events will go to debug output only
extern CRITICAL_SECTION LogListCs;
VOID CALLBACK ServiceMain(DWORD argc, LPTSTR *argv) VOID CALLBACK ServiceMain(DWORD argc, LPTSTR *argv)
{ {
HANDLE hThread; HANDLE hThread;
@ -65,6 +68,8 @@ int main(int argc, char *argv[])
return 1; return 1;
} }
InitializeCriticalSection(&LogListCs);
/* /*
This will be fixed in near future This will be fixed in near future
*/ */
@ -103,7 +108,9 @@ int main(int argc, char *argv[])
StartServiceCtrlDispatcher(ServiceTable); StartServiceCtrlDispatcher(ServiceTable);
LogfClose(SystemLog); LogfClose(SystemLog);
DeleteCriticalSection(&LogListCs);
HeapDestroy(MyHeap); HeapDestroy(MyHeap);
return 0; return 0;

View file

@ -8,7 +8,8 @@
#include "eventlog.h" #include "eventlog.h"
PLOGFILE _LogListHead = NULL; PLOGFILE LogListHead = NULL;
CRITICAL_SECTION LogListCs;
extern HANDLE MyHeap; extern HANDLE MyHeap;
BOOL LogfInitializeNew(PLOGFILE LogFile) BOOL LogfInitializeNew(PLOGFILE LogFile)
@ -292,107 +293,118 @@ VOID LogfClose(PLOGFILE LogFile)
return; return;
} }
PLOGFILE LogfListHead()
{
return _LogListHead;
}
PLOGFILE LogfListItemByName(WCHAR *Name) PLOGFILE LogfListItemByName(WCHAR *Name)
{ {
PLOGFILE Item; PLOGFILE Item, Ret = NULL;
Item = LogfListHead();
while(Item) EnterCriticalSection(&LogListCs);
{
for(Item = LogListHead; Item; Item = (PLOGFILE)Item->Next)
if(Item->LogName && lstrcmpW(Item->LogName, Name)==0) if(Item->LogName && lstrcmpW(Item->LogName, Name)==0)
return Item; {
Item = (PLOGFILE)Item->Next; Ret = Item;
} break;
return NULL; }
LeaveCriticalSection(&LogListCs);
return Ret;
} }
/* index starting from 1 */ /* index starting from 1 */
INT LogfListItemIndexByName(WCHAR *Name) INT LogfListItemIndexByName(WCHAR *Name)
{ {
PLOGFILE Item; PLOGFILE Item;
INT i = 1; INT ret = 0, i = 1;
Item = LogfListHead(); EnterCriticalSection(&LogListCs);
while(Item) for(Item = LogListHead; Item; i++, Item = (PLOGFILE)Item->Next)
{
if(Item->LogName && lstrcmpW(Item->LogName, Name)==0) if(Item->LogName && lstrcmpW(Item->LogName, Name)==0)
return i; {
Item = (PLOGFILE)Item->Next; ret = i;
i++; break;
} }
return 0; LeaveCriticalSection(&LogListCs);
return ret;
} }
/* index starting from 1 */ /* index starting from 1 */
PLOGFILE LogfListItemByIndex(INT Index) PLOGFILE LogfListItemByIndex(INT Index)
{ {
INT i = 1; INT i = 1;
PLOGFILE Item; PLOGFILE Item = LogListHead;
Item = LogfListHead();
while(Item) EnterCriticalSection(&LogListCs);
{ for(; Item && i<Index; Item = (PLOGFILE)Item->Next, i++);
if(i == Index) LeaveCriticalSection(&LogListCs);
return Item;
i++; return Item;
Item = (PLOGFILE)Item->Next;
}
return NULL;
} }
INT LogfListItemCount() INT LogfListItemCount()
{ {
PLOGFILE Item = NULL; PLOGFILE Item = LogListHead;
INT i = 1; INT i = 0;
Item = LogfListHead();
if(Item) EnterCriticalSection(&LogListCs);
{ while(Item)
while(Item->Next) {
{ i++;
i++; Item = (PLOGFILE) Item->Next;
Item = (PLOGFILE) Item->Next;
}
return i;
} }
else return 0; LeaveCriticalSection(&LogListCs);
return i;
} }
VOID LogfListAddItem(PLOGFILE Item) VOID LogfListAddItem(PLOGFILE Item)
{ {
PLOGFILE List; EnterCriticalSection(&LogListCs);
List = LogfListHead();
if(List) if(LogListHead)
{ {
PLOGFILE List = LogListHead;
while(List->Next) while(List->Next)
List = (PLOGFILE)List->Next; List = (PLOGFILE)List->Next;
Item->Prev = (PVOID)List; Item->Prev = (PVOID)List;
Item->Next = NULL; Item->Next = NULL;
InterlockedExchange((PLONG)&List->Next, (LONG)Item); List->Next = Item;
} }
else { else
{
Item->Next = NULL; Item->Next = NULL;
Item->Prev = NULL; Item->Prev = NULL;
InterlockedExchange((PLONG)&_LogListHead, (LONG)Item); LogListHead = Item;
} }
LeaveCriticalSection(&LogListCs);
} }
VOID LogfListRemoveItem(PLOGFILE Item) VOID LogfListRemoveItem(PLOGFILE Item)
{ {
if(Item->Prev) PLOGFILE prev = (PLOGFILE)Item->Prev;
PLOGFILE next = (PLOGFILE)Item->Next;
EnterCriticalSection(&LogListCs);
if(prev && next)
{ {
InterlockedExchange((PLONG)&((PLOGFILE)Item->Prev)->Next, prev->Next = next;
(LONG)Item->Next); next->Prev = prev;
} }
else { else if(next)
InterlockedExchange((PLONG)&_LogListHead, (LONG)Item->Next); {
LogListHead = next;
next->Prev = NULL;
} }
else if(prev) prev->Next = NULL;
else LogListHead = NULL;
LeaveCriticalSection(&LogListCs);
} }
BOOL LogfReadEvent(PLOGFILE LogFile, BOOL LogfReadEvent(PLOGFILE LogFile,
@ -562,7 +574,7 @@ BOOL LogfWriteData(PLOGFILE LogFile,
ULONG LogfOffsetByNumber(PLOGFILE LogFile, ULONG LogfOffsetByNumber(PLOGFILE LogFile,
DWORD RecordNumber) DWORD RecordNumber)
/* Returns NULL if nothing found. */ /* Returns 0 if nothing found. */
{ {
DWORD i; DWORD i;
for(i = 0; i < LogFile->OffsetInfoNext; i++) for(i = 0; i < LogFile->OffsetInfoNext; i++)