34#ifdef GECODE_HAS_UNISTD_H
40namespace Gecode {
namespace Support {
42#ifdef GECODE_THREADS_OSX_UNFAIR
44#pragma clang diagnostic push
45#pragma clang diagnostic ignored "-Wdeprecated-declarations"
51 if (&os_unfair_lock_lock != NULL)
52 u.unfair_lck = OS_UNFAIR_LOCK_INIT;
54 u.spin_lck = OS_SPINLOCK_INIT;
58 if (&os_unfair_lock_lock != NULL) {
59 os_unfair_lock_lock(&
u.unfair_lck);
61 OSSpinLockLock(&
u.spin_lck);
66 if (&os_unfair_lock_trylock != NULL)
67 return os_unfair_lock_trylock(&
u.unfair_lck);
69 return OSSpinLockTry(&
u.spin_lck);
73 if (&os_unfair_lock_unlock != NULL)
74 os_unfair_lock_unlock(&
u.unfair_lck);
76 OSSpinLockUnlock(&
u.spin_lck);
81#pragma clang diagnostic pop
90 if (pthread_mutex_init(&p_m,NULL) != 0)
91 throw OperatingSystemError(
"Mutex::Mutex[pthread_mutex_init]");
95 if (pthread_mutex_lock(&p_m) != 0)
96 throw OperatingSystemError(
"Mutex::acquire[pthread_mutex_lock]");
100 return pthread_mutex_trylock(&p_m) == 0;
104 if (pthread_mutex_unlock(&p_m) != 0)
105 throw OperatingSystemError(
"Mutex::release[pthread_mutex_unlock]");
109 if (pthread_mutex_destroy(&p_m) != 0) {
110 std::cerr <<
"Operating system error: "
111 <<
"Mutex::~Mutex[pthread_mutex_destroy]";
117#ifdef GECODE_THREADS_PTHREADS_SPINLOCK
123 FastMutex::FastMutex(
void) {
124 if (pthread_spin_init(&p_s,PTHREAD_PROCESS_PRIVATE) != 0)
125 throw OperatingSystemError(
"FastMutex::FastMutex[pthread_spin_init]");
129 if (pthread_spin_lock(&p_s) != 0)
130 throw OperatingSystemError(
"FastMutex::acquire[pthread_spin_lock]");
134 return pthread_spin_trylock(&p_s) == 0;
138 if (pthread_spin_unlock(&p_s) != 0)
139 throw OperatingSystemError(
"FastMutex::release[pthread_spin_unlock]");
142 FastMutex::~FastMutex(
void) {
143 if (pthread_spin_destroy(&p_s) != 0) {
144 std::cerr <<
"Operating system error: "
145 <<
"FastMutex::~FastMutex[pthread_spin_destroy]";
157 if (pthread_mutex_init(&p_m,NULL) != 0)
158 throw OperatingSystemError(
"Event::Event[pthread_mutex_init]");
159 if (pthread_cond_init(&p_c,NULL) != 0)
160 throw OperatingSystemError(
"Event::Event[pthread_cond_init]");
163 Event::signal(
void) {
164 if (pthread_mutex_lock(&p_m) != 0)
165 throw OperatingSystemError(
"Event::signal[pthread_mutex_lock]");
168 if (pthread_cond_signal(&p_c) != 0)
169 throw OperatingSystemError(
"Event::signal[pthread_cond_signal]");
171 if (pthread_mutex_unlock(&p_m) != 0)
172 throw OperatingSystemError(
"Event::signal[pthread_mutex_unlock]");
176 if (pthread_mutex_lock(&p_m) != 0)
177 throw OperatingSystemError(
"Event::wait[pthread_mutex_lock]");
179 if (pthread_cond_wait(&p_c,&p_m) != 0)
180 throw OperatingSystemError(
"Event::wait[pthread_cond_wait]");
182 if (pthread_mutex_unlock(&p_m) != 0)
183 throw OperatingSystemError(
"Event::wait[pthread_mutex_unlock]");
186 Event::~Event(
void) {
187 if (pthread_cond_destroy(&p_c) != 0) {
188 std::cerr <<
"Operating system error: "
189 <<
"Event::~Event[pthread_cond_destroy]";
192 if (pthread_mutex_destroy(&p_m) != 0) {
193 std::cerr <<
"Operating system error: "
194 <<
"Event::~Event[pthread_mutex_destroy]";
204 Thread::sleep(
unsigned int ms) {
205#ifdef GECODE_HAS_UNISTD_H
206 unsigned int s = ms / 1000;
217#ifdef GECODE_HAS_UNISTD_H
218 int n=
static_cast<int>(sysconf(_SC_NPROCESSORS_ONLN));
219 return (
n>1) ?
n : 1;
union Gecode::@603::NNF::@65 u
Union depending on nodetype t.
int n
Number of negative literals for node type.
Event(void)
Initialize event.
Mutex(void)
Initialize mutex.
~Mutex(void)
Delete mutex.
void release(void)
Release the mutex.
bool tryacquire(void)
Try to acquire the mutex, return true if succesful.
void acquire(void)
Acquire the mutex and possibly block.
Gecode toplevel namespace