[go: up one dir, main page]

Menu

[r403]: / trunk / tools / oogtk / oomutex.h  Maximize  Restore  History

Download this file

110 lines (99 with data), 2.4 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
#ifndef OOCRIT_H__
#define OOCRIT_H__
/**
* GG
* Small package around gtk Mutex
*/
#include <glib.h>
namespace gtk {
class Mutex
{
#if GLIB_MINOR_VERSION < 32
private:
GStaticMutex mutex;
public:
Mutex() {
g_static_mutex_init(&mutex);
}
~Mutex() {
g_static_mutex_free(&mutex);
}
void Lock() {
g_static_mutex_lock(&mutex);
}
void Unlock() {
g_static_mutex_unlock(&mutex);
}
#else
private:
GMutex mutex;
public:
Mutex() {
g_mutex_init(&mutex);
}
~Mutex() {
g_mutex_clear(&mutex);
}
void Lock() {
g_mutex_lock(&mutex);
}
void Unlock() {
g_mutex_unlock(&mutex);
}
#endif
// old CriticalSection api emulation
void Enter() { Lock(); }
void Leave() { Unlock(); }
};
class AutoMutex
{
public:
AutoMutex(Mutex & cs) : cs_(cs) { cs_.Lock(); };
~AutoMutex() { cs_.Unlock(); };
private:
Mutex & cs_;
};
class Sync
{
#if GLIB_MINOR_VERSION < 32
private:
GCond *cv;
GMutex *mutex;
public:
Sync() { mutex = g_mutex_new(); cv = g_cond_new(); }
~Sync() { g_cond_free(cv); g_mutex_free(mutex); }
void Wait(void) { g_cond_wait(cv, mutex); };
void Lock(void) { g_mutex_lock(mutex); };
void Unlock(void) { g_mutex_unlock(mutex); };
int Wait(long msecs) {
GTimeVal now;
g_get_current_time(&now);
g_time_val_add(&now, msecs * 1000L);
return g_cond_timed_wait(cv, mutex, &now);
}
void Signal(void) { g_cond_signal(cv); };
void SignalAll(void) { g_cond_broadcast(cv); };
#else
private:
GCond cv;
GMutex mutex;
public:
Sync() { g_mutex_init(&mutex); g_cond_init(&cv); }
~Sync() { g_cond_clear(&cv); g_mutex_clear(&mutex); }
void Wait(void) { g_cond_wait(&cv, &mutex); };
void Lock(void) { g_mutex_lock(&mutex); };
void Unlock(void) { g_mutex_unlock(&mutex); };
int Wait(long msecs) {
gint64 end_time = g_get_monotonic_time() + msecs * G_TIME_SPAN_MILLISECOND;
return g_cond_wait_until(&cv, &mutex, end_time);
}
void Signal(void) { g_cond_signal(&cv); };
void SignalAll(void) { g_cond_broadcast(&cv); };
#endif
};
}
#ifndef NO_CRITSECTION_EMUL
typedef gtk::Mutex CritSection;
typedef gtk::AutoMutex AutoCS;
#endif
#endif