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.
148 lines
2.6 KiB
148 lines
2.6 KiB
//
|
|
// Copyright (c) 1996 Microsoft Corporation
|
|
//
|
|
//
|
|
// SYNC.H -- Header for Classes:
|
|
// CSync
|
|
//
|
|
// History:
|
|
// 05/21/96 JosephJ Created
|
|
//
|
|
//
|
|
#ifndef _SYNC_H_
|
|
#define _SYNC_H_
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
// CLASS CSync
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
// Controls access to its parent object. Includes a critical section, and
|
|
// (TODO) mechanism for waiting until all threads have finished using
|
|
// the parent object.
|
|
|
|
// Sample session (pObj is a ptr to a hypothetical parent, which implements
|
|
// methods Load, Unload, OpenSession, CloseSession using the member CSymc
|
|
// object):
|
|
// pObj->Load("mdmusr.inf");
|
|
// hSession = pObj->OpenSession();
|
|
// ... do stuff ...
|
|
// pObj->CloseSession(hSession);
|
|
// hSync = pObj->Unload();
|
|
// if (hSync) WaitForSingleObject(hSync, INFINITE);
|
|
// CloseHandle(hSync);
|
|
|
|
class CSync
|
|
{
|
|
|
|
public:
|
|
|
|
CSync(void) {InitializeCriticalSection(&m_crit);}
|
|
|
|
~CSync()
|
|
{
|
|
EnterCriticalSection(&m_crit);
|
|
DeleteCriticalSection(&m_crit);
|
|
}
|
|
|
|
//-------------- EnterCrit ------------------
|
|
// Claim our critical section
|
|
void EnterCrit(void) const
|
|
{
|
|
EnterCriticalSection((CRITICAL_SECTION *)&m_crit);
|
|
}
|
|
|
|
//-------------- LeaveCrit ------------------
|
|
// Release our critical section
|
|
void LeaveCrit(void) const
|
|
{
|
|
LeaveCriticalSection((CRITICAL_SECTION *)&m_crit);
|
|
}
|
|
|
|
#if (TODO)
|
|
|
|
BOOL BeginLoad(void)
|
|
{
|
|
}
|
|
|
|
void EndLoad(void)
|
|
{
|
|
EnterCrit();
|
|
ASSERT (m_eState == CSYNC_LOADING);
|
|
m_eState = CSYNC_LOADED;
|
|
LeaveCrit();
|
|
}
|
|
|
|
HANDLE BeginUnload(void)
|
|
{
|
|
HANDLE h=NULL;
|
|
EnterCrit();
|
|
if (m_eState == CSYNC_LOADED)
|
|
{
|
|
m_eState = CSYNC_UNLOADING;
|
|
}
|
|
else
|
|
{
|
|
fRet = FALSE;
|
|
}
|
|
LeaveCrit();
|
|
|
|
return fRet;
|
|
}
|
|
|
|
void EndUnload(void);
|
|
|
|
HSESSION BeginSession(void)
|
|
{
|
|
HSESSION hRet = 1;
|
|
EnterCrit();
|
|
if (m_eState==SYNC_LOADED)
|
|
{
|
|
m_uRefCount++;
|
|
}
|
|
else
|
|
{
|
|
hRet = 0;
|
|
}
|
|
LeaveCrit();
|
|
|
|
return hRet;
|
|
}
|
|
|
|
void EndSession(HSESSION hSession)
|
|
{
|
|
SLINST *pEventList=NULL;
|
|
EnterCrit();
|
|
ASSERT(hSession==1 && m_uRefCount);
|
|
m_uRefCount--;
|
|
if (m_eState==SYNC_UNLOADING && m_pEventList)
|
|
{
|
|
pEventList = m_pEventList;
|
|
m_pEventList=NULL;
|
|
}
|
|
LeaveCrit();
|
|
|
|
mfn_SignalAndFree(m_pEventList);
|
|
}
|
|
|
|
BOOL AddContext(HSESSION hS)
|
|
{
|
|
return FALSE;
|
|
}
|
|
#endif // TODO
|
|
|
|
private:
|
|
|
|
CRITICAL_SECTION m_crit;
|
|
|
|
#if (TODO)
|
|
UINT m_uRefCount;
|
|
enum {CSYNC_UNLOADED, CSYNC_LOADING, CSYNC_UNLOADING, CSYNC_UNLOADED}
|
|
m_eState;
|
|
SLIST* pUnloadEventList;
|
|
#endif // TODO
|
|
|
|
};
|
|
|
|
|
|
#endif // _SYNC_H_
|