mirror of https://github.com/swig/swig
72 lines
1.4 KiB
C++
72 lines
1.4 KiB
C++
|
|
# if defined(_WIN32) || defined(__WIN32__)
|
|
|
|
#include <windows.h>
|
|
|
|
namespace SwigExamples {
|
|
|
|
class CriticalSection {
|
|
public:
|
|
CriticalSection() {
|
|
InitializeCriticalSection(&mutex_);
|
|
}
|
|
~CriticalSection() {
|
|
DeleteCriticalSection(&mutex_);
|
|
}
|
|
CRITICAL_SECTION mutex_;
|
|
};
|
|
|
|
struct Lock {
|
|
Lock(CriticalSection &cs) : critical_section(cs) {
|
|
EnterCriticalSection(&critical_section.mutex_);
|
|
}
|
|
~Lock() {
|
|
LeaveCriticalSection(&critical_section.mutex_);
|
|
}
|
|
private:
|
|
CriticalSection &critical_section;
|
|
};
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
#include <pthread.h>
|
|
#ifndef PTHREAD_MUTEX_RECURSIVE_NP
|
|
// For Cygwin and possibly other OSs: _NP is "non-portable"
|
|
#define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
|
|
#endif
|
|
|
|
namespace SwigExamples {
|
|
|
|
class CriticalSection {
|
|
public:
|
|
CriticalSection() {
|
|
pthread_mutexattr_t mutexattr;
|
|
pthread_mutexattr_init(&mutexattr);
|
|
pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE_NP);
|
|
pthread_mutex_init(&mutex_, &mutexattr);
|
|
pthread_mutexattr_destroy(&mutexattr);
|
|
}
|
|
~CriticalSection() {
|
|
pthread_mutex_destroy (&mutex_);
|
|
}
|
|
pthread_mutex_t mutex_;
|
|
};
|
|
|
|
struct Lock {
|
|
Lock(CriticalSection &cs) : critical_section(cs) {
|
|
pthread_mutex_lock (&critical_section.mutex_);
|
|
}
|
|
~Lock() {
|
|
pthread_mutex_unlock (&critical_section.mutex_);
|
|
}
|
|
private:
|
|
CriticalSection &critical_section;
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|
|
|