|
|
/*
* INTERNAL.H * * Internal header * * DRIVEARB.DLL - Shared Drive Aribiter for shared disks and libraries * - inter-machine sharing client * - inter-app sharing service * * Author: ErvinP * * (c) 2000 Microsoft Corporation * */
#define DRIVEARB_SIG 'AvrD'
enum driveStates { /*
* Note: this value designates that the driveContext block * within the file mapping is FREE */ DRIVESTATE_NONE = 0,
// local node owns drive and no app is using it
DRIVESTATE_AVAILABLE_LOCALLY,
// local node owns drive and some local app is using it
DRIVESTATE_INUSE_LOCALLY,
// local node does NOT own the drive
DRIVESTATE_UNAVAILABLE_LOCALLY,
};
enum clientStates { CLIENTSTATE_NONE = 0, CLIENTSTATE_INACTIVE, // client session not using nor waiting for drive
CLIENTSTATE_WAITING, // client session waiting for drive
CLIENTSTATE_ACTIVE, // client session owns the drive
};
/*
* This is our internal context for a drive */ typedef struct {
DWORD sig;
enum driveStates state;
DWORD numCurrentReaders; DWORD numCurrentWriters;
BOOL denyRead; BOOL denyWrite;
/*
* Drive mutex, mapped to by clients' sessionDriveMutex */ HANDLE mutex;
/*
* Drive event, mapped to by clients' sessionDriveEvent */ HANDLE event;
/*
* The number of open sessions on this drive */ DWORD sessionReferenceCount;
/*
* The number of sessions waiting on this drive */ DWORD numWaitingSessions;
/*
* The drives filemap has been reallocated. * We mark this flag in each driveContext so that * each session can see it. * Client needs to reopen a handle to its drive when * this is set. */ BOOL isReallocated;
char driveName[MAX_PATH+1];
// BUGBUG - pad the end of this struct for alignment
} driveContext;
/*
* This is our internal context for a single client session's * use of a particular drive. */ typedef struct {
DWORD sig;
enum clientStates state;
DWORD shareFlags;
/*
* This process' local handle for the * shared drives file mapping. */ HANDLE hDrivesFileMap;
/*
* This process' local pointer for its view * of its drive's portion of the shared drives file mapping. */ driveContext *driveViewPtr;
/*
* Index into the shared drives fileMap of this * session's drive context */ DWORD driveIndex;
/*
* Process-local handles to shared synchronization objects */ HANDLE sessionDriveMutex; HANDLE sessionDriveEvent;
/*
* Callback to forcibly invalidate the client's handle. * Used only in case of error. */ INVALIDATE_DRIVE_HANDLE_PROC invalidateHandleProc;
/*
* Process-local Distributed Lock Manager handles */ dlm_nodeid_t sessionDlmHandle; dlm_lockid_t sessionDlmLockHandle;
} clientSessionContext;
#define DRIVES_FILEMAP_NAME "DRIVEARB_DrivesFileMap"
#define GLOBAL_MUTEX_NAME "DRIVEARB_GlobalMutex"
#define DRIVE_MUTEX_NAME_PREFIX "DRIVEARB_DriveMutex_"
#define DRIVE_EVENT_NAME_PREFIX "DRIVEARB_DriveEvent_"
#define DRIVES_FILEMAP_INITIAL_SIZE 4
// BUGBUG REMOVE - debug only
#define DBGMSG(msg, arg) \
{ \ char _dbgMsg[100]; \ wsprintf(_dbgMsg, "%s: %xh=%d.", msg, (arg), (arg)); \ MessageBox(NULL, (LPSTR)_dbgMsg, "DriveArb debug message", MB_OK); \ }
#define ASSERT(fact) if (!(fact)){ MessageBox(NULL, (LPSTR)#fact, (LPSTR)"DriveArb assertion failed", MB_OK); }
BOOL InitDrivesFileMappingForProcess(); VOID DestroyDrivesFileMappingForProcess(); BOOL GrowDrivesFileMapping(DWORD newNumDrives);
driveContext *NewDriveContext(LPSTR driveName); VOID FreeDriveContext(driveContext *drive); DWORD GetDriveIndexByName(LPSTR driveName);
clientSessionContext *NewClientSession(LPSTR driveName); VOID FreeClientSession(clientSessionContext *session); BOOL LOCKDriveForSession(clientSessionContext *session); VOID UNLOCKDriveForSession(clientSessionContext *session);
BOOL InitializeClientArbitration(clientSessionContext *session); VOID ShutDownClientArbitration(clientSessionContext *session);
BOOL AcquireNodeLevelOwnership(clientSessionContext *session); VOID ReleaseNodeLevelOwnership(clientSessionContext *session);
DWORD MyStrNCpy(LPSTR destStr, LPSTR srcStr, DWORD maxChars); BOOL MyCompareStringsI(LPSTR s, LPSTR p);
extern HANDLE g_hSharedGlobalMutex; extern HANDLE g_allDrivesFileMap; extern driveContext *g_allDrivesViewPtr; extern DWORD g_numDrivesInFileMap;
|