mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 16:23:01 +00:00
Fix thread synchronization, use critical sections.
Rewrite some functions (optimize). svn path=/trunk/; revision=22691
This commit is contained in:
parent
410ae9c26b
commit
0e79c3011a
2 changed files with 78 additions and 59 deletions
|
@ -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;
|
||||||
|
|
|
@ -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++)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue