181 lines
3.5 KiB
C
181 lines
3.5 KiB
C
|
#include "precomp.h"
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// SHM.C
|
|||
|
// Shared Memory Access, cpi32 and display driver sides both
|
|||
|
//
|
|||
|
// Copyright(c) Microsoft 1997-
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// SHM_StartAccess
|
|||
|
//
|
|||
|
LPVOID SHM_StartAccess(int block)
|
|||
|
{
|
|||
|
LPBUFFER_CONTROL pControl;
|
|||
|
LPVOID pMemBlock;
|
|||
|
|
|||
|
DebugEntry(SHM_StartAccess);
|
|||
|
|
|||
|
//
|
|||
|
// Test for shared memory present
|
|||
|
//
|
|||
|
ASSERT(g_asSharedMemory != NULL);
|
|||
|
|
|||
|
//
|
|||
|
// Determine which data block we are handling...
|
|||
|
//
|
|||
|
switch (block)
|
|||
|
{
|
|||
|
case SHM_OA_DATA:
|
|||
|
pControl = &g_asSharedMemory->displayToCore;
|
|||
|
break;
|
|||
|
|
|||
|
case SHM_OA_FAST:
|
|||
|
case SHM_BA_FAST:
|
|||
|
case SHM_CM_FAST:
|
|||
|
pControl = &g_asSharedMemory->fastPath;
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
ERROR_OUT(("Unknown type %d", block));
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Mark the double-buffer as busy.
|
|||
|
//
|
|||
|
pControl->busyFlag = 1;
|
|||
|
|
|||
|
//
|
|||
|
// Set up the current buffer pointer if this is the first access to the
|
|||
|
// shared memory.
|
|||
|
//
|
|||
|
pControl->indexCount++;
|
|||
|
if (pControl->indexCount == 1)
|
|||
|
{
|
|||
|
//
|
|||
|
// Set up the 'in use' buffer pointer
|
|||
|
//
|
|||
|
pControl->currentBuffer = pControl->newBuffer;
|
|||
|
|
|||
|
//
|
|||
|
// Mark the buffer as busy so that the Share Core knows where we
|
|||
|
// are.
|
|||
|
//
|
|||
|
pControl->bufferBusy[pControl->currentBuffer] = 1;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Get the pointer to the block to return
|
|||
|
//
|
|||
|
switch (block)
|
|||
|
{
|
|||
|
case SHM_OA_DATA:
|
|||
|
pMemBlock = g_poaData[pControl->currentBuffer];
|
|||
|
break;
|
|||
|
|
|||
|
case SHM_OA_FAST:
|
|||
|
pMemBlock = &(g_asSharedMemory->oaFast[pControl->currentBuffer]);
|
|||
|
break;
|
|||
|
|
|||
|
case SHM_BA_FAST:
|
|||
|
pMemBlock = &(g_asSharedMemory->baFast[pControl->currentBuffer]);
|
|||
|
break;
|
|||
|
|
|||
|
case SHM_CM_FAST:
|
|||
|
pMemBlock = &(g_asSharedMemory->cmFast[pControl->currentBuffer]);
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
ERROR_OUT(("Unknown type %d", block));
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
DebugExitPVOID(SHM_StartAccess, pMemBlock);
|
|||
|
return(pMemBlock);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// SHM_StopAccess
|
|||
|
//
|
|||
|
void SHM_StopAccess(int block)
|
|||
|
{
|
|||
|
LPBUFFER_CONTROL pControl;
|
|||
|
|
|||
|
DebugEntry(SHM_StopAccess);
|
|||
|
|
|||
|
ASSERT(g_asSharedMemory != NULL);
|
|||
|
|
|||
|
//
|
|||
|
// Determine which data block we are handling...
|
|||
|
//
|
|||
|
switch (block)
|
|||
|
{
|
|||
|
case SHM_OA_DATA:
|
|||
|
pControl = &g_asSharedMemory->displayToCore;
|
|||
|
break;
|
|||
|
|
|||
|
case SHM_OA_FAST:
|
|||
|
case SHM_BA_FAST:
|
|||
|
case SHM_CM_FAST:
|
|||
|
pControl = &g_asSharedMemory->fastPath;
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
ERROR_OUT(("Unknown type %d", block));
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Decrement usage count - if we have finally finished with the memory,
|
|||
|
// clear the busy flags so that the Share Core knows it won't tread on
|
|||
|
// the display driver's toes.
|
|||
|
//
|
|||
|
pControl->indexCount--;
|
|||
|
if (pControl->indexCount == 0)
|
|||
|
{
|
|||
|
pControl->bufferBusy[pControl->currentBuffer] = 0;
|
|||
|
|
|||
|
pControl->busyFlag = 0;
|
|||
|
}
|
|||
|
|
|||
|
DebugExitVOID(SHM_StopAccess);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#ifdef _DEBUG
|
|||
|
//
|
|||
|
// SHM_CheckPointer - see shm.h
|
|||
|
//
|
|||
|
void SHM_CheckPointer(LPVOID ptr)
|
|||
|
{
|
|||
|
DebugEntry(SHMCheckPointer);
|
|||
|
|
|||
|
if (ptr == NULL)
|
|||
|
{
|
|||
|
ERROR_OUT(("Null pointer"));
|
|||
|
DC_QUIT;
|
|||
|
}
|
|||
|
|
|||
|
ASSERT(g_asSharedMemory);
|
|||
|
|
|||
|
if (((LPBYTE)ptr - (LPBYTE)g_asSharedMemory < 0) ||
|
|||
|
((LPBYTE)ptr - (LPBYTE)g_asSharedMemory >= SHM_SIZE_USED))
|
|||
|
{
|
|||
|
ERROR_OUT(("Bad pointer"));
|
|||
|
}
|
|||
|
|
|||
|
DC_EXIT_POINT:
|
|||
|
DebugExitVOID(SHM_CheckPointer);
|
|||
|
}
|
|||
|
#endif // _DEBUG
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|