Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//
//=============================================================================//
/*
* * Copyright (c) 1998-9 * Dr John Maddock * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Dr John Maddock makes no representations * about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. * */
/*
* FILE re_thrd.h * VERSION 2.12 * Thread synch helper functions, for regular * expression library. */
#ifndef RE_THRD_H
#define RE_THRD_H
#ifndef JM_CFG_H
#include <jm/jm_cfg.h>
#endif
#if defined(JM_PLATFORM_W32) && defined(JM_THREADS)
//#include <windows.h>
#endif
#if !defined(JM_PLATFORM_W32) && defined(JM_THREADS)
#include <pthread.h>
#endif
JM_NAMESPACE(__JM)
void RE_CALL re_init_threads(); void RE_CALL re_free_threads();
#ifdef JM_THREADS
#ifndef JM_PLATFORM_W32
typedef pthread_mutex_t CRITICAL_SECTION;
inline void RE_CALL InitializeCriticalSection(CRITICAL_SECTION* ps) { pthread_mutex_init(ps, NULL); }
inline void RE_CALL DeleteCriticalSection(CRITICAL_SECTION* ps) { pthread_mutex_destroy(ps); }
inline void RE_CALL EnterCriticalSection(CRITICAL_SECTION* ps) { pthread_mutex_lock(ps); }
inline void RE_CALL LeaveCriticalSection(CRITICAL_SECTION* ps) { pthread_mutex_unlock(ps); }
#endif
template <class Lock> class lock_guard { typedef Lock lock_type; public: lock_guard(lock_type& m, bool aq = true) : mut(m), owned(false){ acquire(aq); }
~lock_guard() { acquire(false); }
void RE_CALL acquire(bool aq = true, DWORD timeout = INFINITE) { if(aq && !owned) { mut.acquire(true, timeout); owned = true; } else if(!aq && owned) { mut.acquire(false); owned = false; } } private: lock_type& mut; bool owned; };
class critical_section { public: critical_section() { InitializeCriticalSection(&hmutex);}
critical_section(const critical_section&) { InitializeCriticalSection(&hmutex);}
const critical_section& RE_CALL operator=(const critical_section&) {return *this;}
~critical_section() {DeleteCriticalSection(&hmutex);}
private:
void RE_CALL acquire(bool aq, DWORD unused = INFINITE) { if(aq) EnterCriticalSection(&hmutex); else LeaveCriticalSection(&hmutex); }
CRITICAL_SECTION hmutex;
public: typedef lock_guard<critical_section> ro_guard; typedef lock_guard<critical_section> rw_guard;
friend lock_guard<critical_section>; };
inline bool RE_CALL operator==(const critical_section&, const critical_section&) { return false; }
inline bool RE_CALL operator<(const critical_section&, const critical_section&) { return true; }
typedef lock_guard<critical_section> cs_guard;
JM_IX_DECL extern critical_section* p_re_lock; JM_IX_DECL extern unsigned int re_lock_count;
#define JM_GUARD(inst) __JM::critical_section::rw_guard g(inst);
#else // JM_THREADS
#define JM_GUARD(inst)
#endif // JM_THREADS
JM_END_NAMESPACE
#endif // sentry
|