2025-04-27 07:49:33 -04:00

106 lines
2.6 KiB
C++

#ifndef _SYNCHRO_H_
#define _SYNCHRO_H_
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// SYNCHRO.H
//
// Header for DAV synchronization classes.
//
// Copyright 1986-1998 Microsoft Corporation, All Rights Reserved
//
#ifdef _EXDAV_
#error "synchro.h: CInitGate can throw() -- not safe for EXDAV"
#endif
// Include common EXDAV-safe synchronization items
#include <ex\stackbuf.h>
#include <ex\synchro.h>
#include <stdio.h> // for swprintf()
#include <except.h> // Exception throwing/handling
// ========================================================================
//
// CLASS CInitGate
//
// (The name of this class is purely historical)
//
// Encapsulates ONE-SHOT initialization of a globally NAMED object.
//
// Use to handle simultaneous on-demand initialization of named
// per-process global objects. For on-demand initialization of
// unnamed per-process global objects, use the templates in singlton.h.
//
class CInitGate
{
CEvent m_evt;
BOOL m_fInit;
// NOT IMPLEMENTED
//
CInitGate& operator=( const CInitGate& );
CInitGate( const CInitGate& );
public:
CInitGate( LPCWSTR lpwszBaseName,
LPCSTR lpszName ) :
m_fInit(FALSE)
{
//
// First, set up an empty security descriptor and attributes
// so that the event can be created with no security
// (i.e. accessible from any security context).
//
SECURITY_DESCRIPTOR sdAllAccess;
(void) InitializeSecurityDescriptor( &sdAllAccess, SECURITY_DESCRIPTOR_REVISION );
SetSecurityDescriptorDacl( &sdAllAccess, TRUE, NULL, FALSE );
SECURITY_ATTRIBUTES saAllAccess;
saAllAccess.nLength = sizeof(saAllAccess);
saAllAccess.lpSecurityDescriptor = &sdAllAccess;
saAllAccess.bInheritHandle = FALSE;
CStackBuffer<WCHAR,256> lpwszEventName;
if (NULL == lpwszEventName.resize(sizeof(WCHAR) *
(wcslen(lpwszBaseName) +
strlen(lpszName) +
sizeof('\0'))))
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
throw CLastErrorException();
}
swprintf(lpwszEventName.get(), L"%ls%hs", lpwszBaseName, lpszName);
if ( !m_evt.FCreate( lpszName,
&saAllAccess, // no security
TRUE, // manual reset
FALSE, // initially non-signalled
lpwszEventName.get()))
{
throw CLastErrorException();
}
if ( ERROR_ALREADY_EXISTS == GetLastError() )
m_evt.Wait();
else
m_fInit = TRUE;
}
~CInitGate()
{
if ( m_fInit )
m_evt.Set();
}
BOOL FInit() const { return m_fInit; }
};
#endif // !defined(_SYNCHRO_H_)