forked from rubinius/rubinius
-
Notifications
You must be signed in to change notification settings - Fork 0
/
native_thread.hpp
83 lines (62 loc) · 1.34 KB
/
native_thread.hpp
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
#ifndef RBX_NATIVE_THREAD_HPP
#define RBX_NATIVE_THREAD_HPP
#include "global_lock.hpp"
#include "vm.hpp"
#include "builtin/array.hpp"
namespace rubinius {
class NativeThread : public thread::Thread {
VM* vm_;
public:
NativeThread(VM*, size_t stack_size = 0, pthread_t tid = 0);
void perform();
VM* vm() {
return vm_;
}
static void block_all_signals() {
sigset_t set;
sigfillset(&set);
pthread_sigmask(SIG_SETMASK, &set, NULL);
}
const static int cWakeupSignal = SIGVTALRM;
};
class Waiter {
bool used_;
public:
Waiter()
: used_(false)
{}
virtual ~Waiter() { }
virtual void wakeup() = 0;
void run() {
used_ = true;
wakeup();
}
bool used() {
return used_;
}
};
class WaitingOnCondition : public Waiter {
thread::Condition& cond_;
thread::Mutex& mutex_;
public:
WaitingOnCondition(thread::Condition& cond, thread::Mutex& mutex)
: cond_(cond)
, mutex_(mutex)
{}
void wakeup() {
thread::Mutex::LockGuard lg(mutex_);
cond_.signal();
}
};
class WaitingForSignal : public Waiter {
pthread_t target_;
public:
WaitingForSignal()
: target_(pthread_self())
{}
void wakeup() {
pthread_kill(target_, NativeThread::cWakeupSignal);
}
};
}
#endif