📄 common.h
字号:
/******************************************************************************** * * $Id: common.h,v 2.0.4.2 2002/07/03 05:45:39 dvi175 Exp $ * * File: Common.h * * Copyright (c) 2000-2002 Davicom Inc. All rights reserved. * ********************************************************************************/#ifndef __COMMON_H__#define __COMMON_H__#include "dm_types.h"/******************************************************************************* * * Debug macros * *******************************************************************************/#if DBG#define HALT(x) if(x) PUTS(("FATAL ERROR\n"))#define BREAK __asm int 3#define PUTS(x) NKDbgPrintfW(TEXT x)#define MSG(x) NKDbgPrintfW x#define DEBUG_PRINT(msg) NKDbgPrintfW msg#else#define HALT(x)#define BREAK#define PUTS(x)#define MSG(x)#define DEBUG_PRINT(msg)#endif/**************************************************************************************** * * simple exception * ****************************************************************************************/#define MAX_EXCEPTIONS 256#define ERR_STRING(p) (PU8)(p)class C_Exception;typedef struct _EXCEPTION_DATA{ int nIndex; jmp_buf szJumps[MAX_EXCEPTIONS]; C_Exception *szpExceptions[MAX_EXCEPTIONS];} EXCEPTION_DATA, *PEXCEPTION_DATA;extern PEXCEPTION_DATA _gpExpData;class C_Exception{public: C_Exception::C_Exception(void) { Constructor((PU8)"N/A", NDIS_STATUS_FAILURE); } C_Exception::C_Exception(U32 uErr) { Constructor((PU8)"N/A", uErr); } C_Exception::C_Exception(PU8 ptrErr, U32 uErr=NDIS_STATUS_FAILURE) { Constructor(ptrErr, uErr); } C_Exception::~C_Exception(void) { NdisFreeString(m_ndisErrorMessage); }; void Constructor(PU8 ptrErr, U32 uError) { m_uErrorCode = uError; NdisInitializeString(&m_ndisErrorMessage,ptrErr); }; void PrintErrorMessage(void) { MSG(( TEXT("DM9 Exception Level(%d)"),_gpExpData->nIndex+1)); MSG((m_ndisErrorMessage.Buffer)); }; U32 GetErrorCode(void) { return m_uErrorCode; }; private: U32 m_uErrorCode; NDIS_STRING m_ndisErrorMessage; };#define INIT_EXCEPTION() (_gpExpData = (PEXCEPTION_DATA)malloc(sizeof(EXCEPTION_DATA)) \ , memset((void*)_gpExpData,0,sizeof(EXCEPTION_DATA)),_gpExpData->nIndex = -1)#define TERM_EXCEPTION() free(_gpExpData)#define TRY if(setjmp(_gpExpData->szJumps[++_gpExpData->nIndex]) == 0)#define FI --(_gpExpData->nIndex)#define CATCH(exp) \ else if(((exp) = _gpExpData->szpExceptions[_gpExpData->nIndex--]))#define THROW(x) \ ( _gpExpData->szpExceptions[_gpExpData->nIndex] = new C_Exception x, \ longjmp(_gpExpData->szJumps[_gpExpData->nIndex],-1))#define CLEAN(x) delete x/**************************************************************************************** * * Spinlock definition and implementation * ****************************************************************************************/class CSpinlock{public: CSpinlock::CSpinlock(void) { memset((void*)&m_SpinLock,0,sizeof(m_SpinLock)); NdisAllocateSpinLock(&m_SpinLock); }; CSpinlock::~CSpinlock(void) { NdisFreeSpinLock(&m_SpinLock); }; void Lock(void) { NdisAcquireSpinLock(&m_SpinLock); }; void Release(void) { NdisReleaseSpinLock(&m_SpinLock); };private: NDIS_SPIN_LOCK m_SpinLock;}; /**************************************************************************************** * * Mutex definition and implementation * ****************************************************************************************/#define WAIT_FOREVER ((U32)-1)#ifdef IMPL_NO_CRITICAL_SECTION#error no critical sectionvoid fn(void){ CRITICAL_SECTION cs; InitializeCriticalSection(&cs); TryEnterCriticalSection(&cs); LeaveCriticalSection(&cs);}class CMutex{public: CMutex::CMutex(void) { memset((void*)&m_SpinLock,0,sizeof(m_SpinLock)); NdisAllocateSpinLock(&m_SpinLock); m_Value = 0; }; CMutex::~CMutex(void) { NdisFreeSpinLock(&m_SpinLock); }; int TryLock(void) { int ret=1; NdisAcquireSpinLock(&m_SpinLock); if(m_Value) ret = 0; else m_Value++; NdisReleaseSpinLock(&m_SpinLock); return ret; }; int Lock(U32 uMicroSeconds=WAIT_FOREVER, U32 uMicroPeriod=1000) { U32 remains=uMicroSeconds; U32 waited; for(;!TryLock();remains-=waited) { if(!remains) return 0; NdisMSleep((waited=MINI(uMicroPeriod,remains))); } return 1; }; void Release(void) { NdisAcquireSpinLock(&m_SpinLock); m_Value = 0; NdisReleaseSpinLock(&m_SpinLock); };private: NDIS_SPIN_LOCK m_SpinLock; int m_Value;};#elseclass CMutex{public: CMutex::CMutex(void) { memset((void*)&m_Critical,0,sizeof(m_Critical)); InitializeCriticalSection(&m_Critical); }; CMutex::~CMutex(void) { DeleteCriticalSection(&m_Critical); }; int TryLock(void) { return TryEnterCriticalSection(&m_Critical); }; int Lock(U32 uMicroSeconds=WAIT_FOREVER, U32 uMicroPeriod=1000) { EnterCriticalSection(&m_Critical); return 1; }; void Release(void) { LeaveCriticalSection(&m_Critical); };private: CRITICAL_SECTION m_Critical;};#endif/**************************************************************************************** * * Queue definition and implementation * ****************************************************************************************/typedef struct _CQUEUE_GEN_HEADER{ struct _CQUEUE_GEN_HEADER *pNext; U32 uFlags; PVOID pPacket; U16 nReserved; U16 nLength;} CQUEUE_GEN_HEADER, *PCQUEUE_GEN_HEADER;#define CQueueGetUserPointer(ptr) \ ((PVOID)((U32)(ptr) + sizeof(CQUEUE_GEN_HEADER))) class CQueue{public: CQueue::CQueue(void) { m_pHead = m_pTail = NULL; }; void Enqueue(PCQUEUE_GEN_HEADER pObject) { HALT(!pObject); m_spinLock.Lock(); pObject->pNext = NULL; if(m_pTail == NULL) { m_pHead = m_pTail = pObject; } else { m_pTail->pNext = pObject; m_pTail = pObject; } m_spinLock.Release(); }; PCQUEUE_GEN_HEADER Dequeue(void) { PCQUEUE_GEN_HEADER pcurr = m_pHead; m_spinLock.Lock(); if(m_pHead != NULL) { if(m_pHead == m_pTail) m_pHead = m_pTail = NULL; else m_pHead = m_pHead->pNext; } m_spinLock.Release(); return pcurr; }; PCQUEUE_GEN_HEADER GetHead(void) { return m_pHead; }; int IsQueueEmpty(void) { return (m_pHead == NULL); }; int Size(void) { int size; PCQUEUE_GEN_HEADER pcurr; for(size=0,pcurr=m_pHead; pcurr; pcurr=pcurr->pNext,size++) ; return size; }; private: CSpinlock m_spinLock; CQUEUE_GEN_HEADER *m_pHead,*m_pTail;};#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -