123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- #ifndef _CRITSEC_H
- #define _CRITSEC_H
- #ifdef _WIN32
- #include <windows.h>
- #elif defined(__APPLE__)
- #include <CoreServices/CoreServices.h>
- #endif
- #include <bfc/common.h>
- #include <bfc/bfc_assert.h>
- /**
- CriticalSection is a portable object that implements a critical section,
- which is to say, it ensures that no two threads can be in that same
- section of code at the same time. Usually you make them a global object
- or allocate them with new and pass them to both threads.
- @short Critical section class.
- @author Nullsoft
- @ver 1.0
- @see Thread
- @see InCriticalSection
- */
- class CriticalSection {
- public:
- CriticalSection();
- virtual ~CriticalSection();
- /**
- Enters the critical section. If another thread is already in the critical
- section, the calling thread will be blocked until the other thread calls
- leave().
- @see leave()
- */
- void enter();
- /**
- Leaves the critical section. If another thread is currently blocked on
- this critical section, it will be unblocked. If multiple threads are blocking
- only one will be unblocked.
- @see enter()
- */
- void leave();
- /**
- Calls enter() and leave() in quick succession. Useful to make sure that no
- other thread is in the critical section (although another thread could
- immediately re-enter)
- @see enter()
- @see leave()
- */
- void inout();
- private:
- #ifdef ASSERTS_ENABLED
- int within;
- #endif
- #ifdef _WIN32
- CRITICAL_SECTION cs;
- #elif defined(__APPLE__)
- MPCriticalRegionID cr;
- #endif
-
- };
- /**
- This is a little helper class to ease the use of class CriticalSection.
- When it is instantiated, it enters a given critical section. When it is
- destroyed, it leaves the given critical section.
- CriticalSection a_cs;
- void blah() {
- InCriticalSection cs(a_cs); // critical section protection begins
- if (test) {
- return 0; // critical section protection ends
- }
- // critical section protection still active!
- doSomething();
- return 1; // critical section protection ends
- }
-
- @author Nullsoft
- @see CriticalSection
- */
- class InCriticalSection {
- public:
- InCriticalSection(CriticalSection *cs) : m_cs(cs) { m_cs->enter(); }
- InCriticalSection(CriticalSection &cs) : m_cs(&cs) { m_cs->enter(); }
- ~InCriticalSection() { m_cs->leave(); }
- private:
- CriticalSection *m_cs;
- };
- #define _INCRITICALSECTION(id, x) InCriticalSection __I_C_S__##id(x)
- #define INCRITICALSECTION(x) _INCRITICALSECTION(__LINE__, x)
- #endif
|