1
0
mirror of https://github.com/SoftEtherVPN/SoftEtherVPN.git synced 2024-11-23 01:49:53 +03:00
SoftEtherVPN/src/Mayaqua/Object.h

111 lines
1.9 KiB
C
Raw Normal View History

2017-10-19 05:48:23 +03:00
// SoftEther VPN Source Code - Developer Edition Master Branch
2014-01-04 17:00:08 +04:00
// Mayaqua Kernel
// Object.h
// Header of Object.c
#ifndef OBJECT_H
#define OBJECT_H
2021-04-05 05:48:25 +03:00
#include "MayaType.h"
2014-01-04 17:00:08 +04:00
// Constants
#define OBJECT_ALLOC_FAIL_SLEEP_TIME 150
#define OBJECT_ALLOC__MAX_RETRY 30
// Lock object
struct LOCK
{
void *pData;
bool Ready;
2014-01-04 17:00:08 +04:00
#ifdef OS_UNIX
UINT thread_id;
UINT locked_count;
#endif // OS_UNIX
#ifdef _DEBUG
char *FileName;
UINT Line;
UINT ThreadId;
#endif // _DEBUG
};
// Counter object
struct COUNTER
{
LOCK *lock;
UINT c;
bool Ready;
};
// Reference counter
struct REF
{
COUNTER *c;
};
// Event object
struct EVENT
{
REF *ref;
void *pData;
};
// Deadlock detection
struct DEADCHECK
{
LOCK *Lock;
UINT Timeout;
bool Unlocked;
};
// Lock function
#ifndef _DEBUG
#define Lock(lock) LockInner((lock))
#define Unlock(lock) UnlockInner((lock))
#else // _DEBUG
#define Lock(lock) \
{ \
LockInner(lock); \
if (lock != NULL) { lock->FileName = __FILE__; lock->Line = __LINE__; lock->ThreadId = ThreadId();} \
}
#define Unlock(lock) \
{ \
if (lock != NULL) { lock->FileName = NULL; lock->Line = 0; lock->ThreadId = 0;} \
UnlockInner(lock); \
}
#endif // _DEBUG
// Function prototype
LOCK *NewLock();
LOCK *NewLockMain();
void DeleteLock(LOCK *lock);
COUNTER *NewCounter();
void UnlockInner(LOCK *lock);
bool LockInner(LOCK *lock);
void DeleteCounter(COUNTER *c);
UINT Count(COUNTER *c);
UINT Inc(COUNTER *c);
UINT Dec(COUNTER *c);
UINT Release(REF *ref);
UINT AddRef(REF *ref);
REF *NewRef();
EVENT *NewEvent();
void ReleaseEvent(EVENT *e);
void CleanupEvent(EVENT *e);
void Set(EVENT *e);
bool Wait(EVENT *e, UINT timeout);
bool WaitEx(EVENT *e, UINT timeout, volatile bool *cancel);
void CheckDeadLock(LOCK *lock, UINT timeout, char *name);
void CheckDeadLockThread(THREAD *t, void *param);
#endif // OBJECT_H