mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
2.4 KiB
154 lines
2.4 KiB
#include <rpc.h>
|
|
#include <sysinc.h>
|
|
#include <windows.h>
|
|
#include <critsec.hxx>
|
|
#include <sdict.hxx>
|
|
#include <wmsgheap.hxx>
|
|
#include <wmsgthrd.hxx>
|
|
#include <wmsgproc.hxx>
|
|
#include <wmsgpack.hxx>
|
|
#include <wmsgport.hxx>
|
|
#include <wmsgsys.hxx>
|
|
|
|
WMSG_PROC * WmsgProc = NULL;
|
|
|
|
WMSG_PROC::WMSG_PROC(
|
|
)
|
|
{
|
|
ObjectType = WmsgProcObjectType;
|
|
|
|
Sys = WmsgSystemGetContext();
|
|
|
|
Next = Prev = NULL;
|
|
|
|
TlsIndex = TlsAlloc();
|
|
if (TlsIndex == 0xffffffff) {
|
|
RaiseException(GetLastError(), EXCEPTION_NONCONTINUABLE, 0, NULL);
|
|
}
|
|
|
|
WmsgProc = this;
|
|
}
|
|
|
|
WMSG_PROC::~WMSG_PROC(
|
|
)
|
|
{
|
|
ASSERT(ObjectType == WmsgProcObjectType);
|
|
|
|
CritSec.Enter();
|
|
|
|
ObjectList.DisconnectOrphans();
|
|
|
|
ObjectList.DereferenceOrphans();
|
|
|
|
TlsFree(TlsIndex);
|
|
|
|
CritSec.Leave();
|
|
|
|
WmsgProc = NULL;
|
|
|
|
Sys->Dereference();
|
|
Sys = NULL;
|
|
}
|
|
|
|
VOID
|
|
WMSG_PROC::InsertHeapObject(
|
|
WMSG_SHARED_HEAP_OBJECT * HeapObject
|
|
)
|
|
{
|
|
ASSERT(ObjectType == WmsgProcObjectType);
|
|
|
|
CritSec.Enter();
|
|
|
|
ObjectList.Insert(HeapObject);
|
|
|
|
CritSec.Leave();
|
|
}
|
|
|
|
BOOL
|
|
WMSG_PROC::RemoveHeapObject(
|
|
WMSG_SHARED_HEAP_OBJECT * HeapObject
|
|
)
|
|
{
|
|
BOOL Result;
|
|
|
|
ASSERT(ObjectType == WmsgProcObjectType);
|
|
|
|
CritSec.Enter();
|
|
|
|
Result = ObjectList.Remove(HeapObject);
|
|
|
|
CritSec.Leave();
|
|
|
|
return (Result);
|
|
}
|
|
|
|
BOOL
|
|
WMSG_PROC::InsertThread(
|
|
WMSG_THREAD * Thread
|
|
)
|
|
{
|
|
int Key;
|
|
|
|
CritSec.Enter();
|
|
Key = ThreadDict.Insert(Thread);
|
|
CritSec.Leave();
|
|
if (Key == -1) {
|
|
return (FALSE);
|
|
}
|
|
Thread->DictKey = Key;
|
|
return (TRUE);
|
|
}
|
|
|
|
VOID
|
|
WMSG_PROC::RemoveThread(
|
|
WMSG_THREAD * Thread
|
|
)
|
|
{
|
|
WMSG_THREAD * RemovedThread;
|
|
|
|
CritSec.Enter();
|
|
RemovedThread = ThreadDict.Delete(Thread->DictKey);
|
|
ASSERT(RemovedThread != NULL);
|
|
CritSec.Leave();
|
|
}
|
|
|
|
VOID
|
|
WMSG_PROC::DestroyThreads(
|
|
)
|
|
{
|
|
WMSG_THREAD * Thread;
|
|
|
|
CritSec.Enter();
|
|
ThreadDict.Reset();
|
|
while( (Thread = ThreadDict.Next())) {
|
|
WmsgThreadDelete(Thread);
|
|
}
|
|
CritSec.Leave();
|
|
}
|
|
|
|
WMSG_PROC *
|
|
WmsgProcGet(
|
|
)
|
|
{
|
|
if (WmsgProc == NULL) {
|
|
WmsgProc = new WMSG_PROC();
|
|
if (WmsgProc == NULL) {
|
|
return (NULL);
|
|
}
|
|
}
|
|
|
|
return (WmsgProc);
|
|
}
|
|
|
|
VOID
|
|
WmsgProcDelete(
|
|
)
|
|
{
|
|
ASSERT(WmsgProc != NULL);
|
|
|
|
if (WmsgProc != NULL) {
|
|
WmsgProc->DestroyThreads();
|
|
delete WmsgProc;
|
|
WmsgProc = NULL;
|
|
}
|
|
}
|