⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sync_w32.h

📁 FastDb是高效的内存数据库系统
💻 H
字号:
//-< SYNC_W32.H >----------------------------------------------------*--------*// FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *// (Main Memory Database Management System)                          *   /\|  *//                                                                   *  /  \  *//                          Created:     20-Nov-98    K.A. Knizhnik  * / [] \ *//                          Last update: 20-Dec-98    K.A. Knizhnik  * GARRET *//-------------------------------------------------------------------*--------*// Intertask synchonization primitives//-------------------------------------------------------------------*--------*#ifndef __SYNC_W32_H__#define __SYNC_W32_H__BEGIN_FASTDB_NAMESPACE#ifdef SET_NULL_DACLclass FASTDB_DLL_ENTRY dbNullSecurityDesciptor {   public:    SECURITY_DESCRIPTOR sd;    SECURITY_ATTRIBUTES sa;     dbNullSecurityDesciptor() {         InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);        SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE);        sa.nLength = sizeof(sa);        sa.bInheritHandle = TRUE;         sa.lpSecurityDescriptor = &sd;    }        static dbNullSecurityDesciptor instance;};#define FASTDB_SECURITY_ATTRIBUTES &dbNullSecurityDesciptor::instance.sa#else    #define FASTDB_SECURITY_ATTRIBUTES NULL#endifclass FASTDB_DLL_ENTRY dbMutex {     CRITICAL_SECTION cs;    bool             initialized;  public:    dbMutex() {        InitializeCriticalSection(&cs);        initialized = true;    }    ~dbMutex() {        DeleteCriticalSection(&cs);        initialized = false;    }    bool isInitialized() {         return initialized;    }    void lock() {        if (initialized) {             EnterCriticalSection(&cs);        }    }    void unlock() {        if (initialized) {             LeaveCriticalSection(&cs);        }    }};#define thread_proc WINAPIclass FASTDB_DLL_ENTRY dbThread {     HANDLE h;  public:    typedef void (thread_proc* thread_proc_t)(void*);    static void sleep(time_t sec) {         Sleep(sec*1000);    }    void create(thread_proc_t f, void* arg) {         DWORD threadid;        h = CreateThread(FASTDB_SECURITY_ATTRIBUTES, 0, LPTHREAD_START_ROUTINE(f), arg,                         0, &threadid);    }    enum ThreadPriority {         THR_PRI_LOW,         THR_PRI_HIGH    };    void setPriority(ThreadPriority pri) {         SetThreadPriority(h, pri == THR_PRI_LOW ? THREAD_PRIORITY_IDLE : THREAD_PRIORITY_HIGHEST);    }            void join() {         WaitForSingleObject(h, INFINITE);        CloseHandle(h);        h = NULL;    }    void detach() {         if (h != NULL) {             CloseHandle(h);            h = NULL;        }    }       dbThread() {         h = NULL;     }    ~dbThread() {         if (h != NULL) {             CloseHandle(h);        }    }    static int numberOfProcessors() { #ifdef PHAR_LAP        return 1;#else        SYSTEM_INFO sysinfo;        GetSystemInfo(&sysinfo);        return sysinfo.dwNumberOfProcessors;#endif    }};    class FASTDB_DLL_ENTRY dbProcessId {     DWORD tid;  public:    bool operator != (dbProcessId const& other) const {         return tid != other.tid;    }    void clear() {         tid = 0;    }    static dbProcessId getCurrent() {        dbProcessId curr;        curr.tid = GetCurrentThreadId();        return curr;    }};class FASTDB_DLL_ENTRY dbInitializationMutex {     HANDLE m;  public:     enum initializationStatus {         InitializationError,         AlreadyInitialized,        NotYetInitialized    };    initializationStatus initialize(char const* name) {         initializationStatus status;        m = CreateMutex(FASTDB_SECURITY_ATTRIBUTES, true, W32_STRING(name));        if (GetLastError() == ERROR_ALREADY_EXISTS) {             status = WaitForSingleObject(m, INFINITE) == WAIT_OBJECT_0                    ? AlreadyInitialized : InitializationError;            ReleaseMutex(m);        } else if (m != NULL) {             status = NotYetInitialized;        } else {             status = InitializationError;        }        return status;    }    void done() {         ReleaseMutex(m);    }    bool close() {        CloseHandle(m);        return false;    }    void erase() {         close();    }    dbInitializationMutex() {         m = NULL;    }};const int dbMaxSemValue = 1000000;class FASTDB_DLL_ENTRY dbSemaphore {   protected:    HANDLE s;  public:    bool wait(unsigned msec = INFINITE) {         int rc = WaitForSingleObject(s, msec);        assert(rc == WAIT_OBJECT_0 || rc == WAIT_TIMEOUT);        return rc == WAIT_OBJECT_0;    }    void signal(unsigned inc = 1) {        if (inc != 0) {             ReleaseSemaphore(s, inc, NULL);        }    }    void reset() {         while (WaitForSingleObject(s, 0) == WAIT_OBJECT_0);    }        bool open(char const* name, unsigned initValue = 0) {        s = CreateSemaphore(FASTDB_SECURITY_ATTRIBUTES, initValue, dbMaxSemValue, W32_STRING(name));        return s != NULL;     }    void close() {        CloseHandle(s);    }    void erase() {         close();    }    dbSemaphore() {         s = NULL;    }};class FASTDB_DLL_ENTRY dbEvent {   protected:    HANDLE e;  public:    bool wait(unsigned msec = INFINITE) {         int rc = WaitForSingleObject(e, msec);        assert(rc == WAIT_OBJECT_0 || rc == WAIT_TIMEOUT);        return rc == WAIT_OBJECT_0;    }    void signal() {        SetEvent(e);    }    void reset() {        ResetEvent(e);    }    bool open(char const* name, bool signaled = false) {        e = CreateEvent(FASTDB_SECURITY_ATTRIBUTES, true, signaled, W32_STRING(name));        return e != NULL;     }    void close() {        CloseHandle(e);    }    void erase() {         close();    }    dbEvent() {         e = NULL;    }};class FASTDB_DLL_ENTRY dbLocalSemaphore : public dbSemaphore {   public:    bool wait(dbMutex& mutex, time_t timeoutMsec) {         mutex.unlock();        int rc = WaitForSingleObject(s, (DWORD)timeoutMsec);        assert(rc == WAIT_OBJECT_0 || rc == WAIT_TIMEOUT);        mutex.lock();        return rc == WAIT_OBJECT_0;    }    void wait(dbMutex& mutex) {         mutex.unlock();        int rc = WaitForSingleObject(s, INFINITE);        assert(rc == WAIT_OBJECT_0);        mutex.lock();    }    bool open(unsigned initValue = 0) {        return dbSemaphore::open(NULL, initValue);    }};class FASTDB_DLL_ENTRY dbLocalEvent : public dbEvent {   public:    bool wait(dbMutex& mutex, time_t timeoutMsec) {         mutex.unlock();        int rc = WaitForSingleObject(e, (DWORD)timeoutMsec);        assert(rc == WAIT_OBJECT_0 || rc == WAIT_TIMEOUT);        mutex.lock();        return rc == WAIT_OBJECT_0;    }    void wait(dbMutex& mutex) {         mutex.unlock();        int rc = WaitForSingleObject(e, INFINITE);        assert(rc == WAIT_OBJECT_0);        mutex.lock();    }    bool open(bool signaled = false) {         return dbEvent::open(NULL, signaled);     }};class FASTDB_DLL_ENTRY dbWatchDog {   public:    bool watch() {         return WaitForSingleObject(mutex, INFINITE) == ERROR_WAIT_NO_CHILDREN;    }    void close() {         CloseHandle(mutex);    }    bool create(char const* name) {        mutex = CreateMutex(FASTDB_SECURITY_ATTRIBUTES, true, W32_STRING(name));        return mutex != NULL;    }    bool open(char const* name) {#ifdef _WINCE	return create(name);#else        mutex = OpenMutex(MUTEX_ALL_ACCESS, false, name);        return mutex != NULL;#endif    }    HANDLE mutex;};template<class T>class dbThreadContext {     unsigned int index;  public:    T* get() {         return (T*)TlsGetValue(index);    }    void set(T* value) {         TlsSetValue(index, value);    }    dbThreadContext() {         index = TlsAlloc();        assert(index != TLS_OUT_OF_INDEXES);    }    ~dbThreadContext() {         TlsFree(index);    }};template<class T>class dbSharedObject {     T*     ptr;    HANDLE h;  public:    bool open(char* name) { #ifdef NO_MMAP        ptr = new T();#else        h = CreateFileMapping(INVALID_HANDLE_VALUE,                              FASTDB_SECURITY_ATTRIBUTES, PAGE_READWRITE, 0,                               sizeof(T), W32_STRING(name));        if (h == NULL) {             return false;        }        ptr = (T*)MapViewOfFile(h, FILE_MAP_ALL_ACCESS, 0, 0, 0);        if (ptr == NULL) {             CloseHandle(h);            return false;        }#endif        return true;    }    T* get() { return ptr; }    void close() { #ifdef NO_MMAP        delete[] ptr;#else        UnmapViewOfFile(ptr);        CloseHandle(h);#endif    }    void erase() {         close();    }    dbSharedObject() {         ptr = NULL;        h = NULL;    }};typedef long sharedsem_t;#ifdef RECOVERABLE_CRITICAL_SECTIONclass FASTDB_DLL_ENTRY dbGlobalCriticalSection {     HANDLE mutex;  public:    void enter() {         int rc = WaitForSingleObject(mutex, INFINITE);        assert (rc == WAIT_OBJECT_0 || rc == WAIT_ABANDONED);    }    void leave() {        ReleaseMutex(mutex);    }    bool create(char const* name, long* count) {         mutex = CreateMutex(FASTDB_SECURITY_ATTRIBUTES, false, W32_STRING(name));        return mutex != NULL;    }    bool open(char const* name, long* count) {         mutex = OpenMutex(MUTEX_ALL_ACCESS, true, W32_STRING(name));        return mutex != NULL;    }    void close() {         CloseHandle(mutex);    }    void erase() {         close();    }    dbGlobalCriticalSection() {        mutex = NULL;    }        };#elseclass FASTDB_DLL_ENTRY dbGlobalCriticalSection {     HANDLE       event;    sharedsem_t* count;  public:    void enter() {         if (InterlockedDecrement(count) != 0) {             // another process is in critical section            int rc = WaitForSingleObject(event, INFINITE);            assert (rc == WAIT_OBJECT_0);        }    }    void leave() {         if (InterlockedIncrement(count) <= 0) {             // some other processes try to enter critical section            SetEvent(event);        }    }    bool open(char const* name, long* count) {         this->count = count;        event = OpenEvent(EVENT_ALL_ACCESS, FALSE, W32_STRING(name));        return event != NULL;    }    bool create(char const* name, long* count) {         this->count = count;        *count = 1;        event = CreateEvent(FASTDB_SECURITY_ATTRIBUTES, false, false, W32_STRING(name));        return event != NULL;    }    void close() {         CloseHandle(event);    }    void erase() {         close();    }    dbGlobalCriticalSection() {        event = NULL;    }        };#endifEND_FASTDB_NAMESPACE#endif //__SYNC_W32_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -