Tasks are spawned on a random thread. Currently they stay there, but we should add task migration and load balancing in the future. This should drammatically improve our task performance benchmarks.
62 lines
1.2 KiB
C++
62 lines
1.2 KiB
C++
// -*- c++ -*-
|
|
#ifndef SYNC_H
|
|
#define SYNC_H
|
|
|
|
class sync {
|
|
public:
|
|
static void yield();
|
|
static void sleep(size_t timeout_in_ms);
|
|
template <class T>
|
|
static bool compare_and_swap(T *address,
|
|
T oldValue, T newValue) {
|
|
return __sync_bool_compare_and_swap(address, oldValue, newValue);
|
|
}
|
|
|
|
template <class T>
|
|
static T increment(T *address) {
|
|
return __sync_add_and_fetch(address, 1);
|
|
}
|
|
|
|
template <class T>
|
|
static T decrement(T *address) {
|
|
return __sync_sub_and_fetch(address, 1);
|
|
}
|
|
|
|
template <class T>
|
|
static T increment(T &address) {
|
|
return __sync_add_and_fetch(&address, 1);
|
|
}
|
|
|
|
template <class T>
|
|
static T decrement(T &address) {
|
|
return __sync_sub_and_fetch(&address, 1);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Thread utility class. Derive and implement your own run() method.
|
|
*/
|
|
class rust_thread {
|
|
private:
|
|
volatile bool _is_running;
|
|
public:
|
|
#if defined(__WIN32__)
|
|
HANDLE thread;
|
|
#else
|
|
pthread_t thread;
|
|
#endif
|
|
rust_thread();
|
|
void start();
|
|
|
|
virtual void run() {
|
|
return;
|
|
}
|
|
|
|
void join();
|
|
|
|
bool is_running();
|
|
|
|
virtual ~rust_thread() {} // quiet the compiler
|
|
};
|
|
|
|
#endif /* SYNC_H */
|