from Boehm-GC. */
/*
- This is a very simple semaphore implementation for darwin. It
+ This is a very simple semaphore implementation for Darwin. It
is implemented in terms of pthreads calls so it isn't async signal
safe. This isn't a problem because signals aren't used to
- suspend threads on darwin.
+ suspend threads on Darwin.
*/
static int sem_init(sem_t *sem, int pshared, int value)
if (pshared)
assert(0);
- sem->value = value;
-
sem->mutex = new Mutex();
-
- if (pthread_cond_init(&sem->cond, NULL) < 0)
- return -1;
+ sem->cond = new Condition();
+ sem->value = value;
return 0;
}
static int sem_post(sem_t *sem)
{
sem->mutex->lock();
-
sem->value++;
-
- if (pthread_cond_signal(&sem->cond) < 0) {
- sem->mutex->unlock();
- return -1;
- }
-
+ sem->cond->signal();
sem->mutex->unlock();
return 0;
sem->mutex->lock();
while (sem->value == 0) {
-#error We cannot call pthread_cond_wait on a Mutex-class pointer.
- pthread_cond_wait(&sem->cond, &sem->mutex);
+ sem->cond->wait(sem->mutex);
}
sem->value--;
-
sem->mutex->unlock();
return 0;
static int sem_destroy(sem_t *sem)
{
- if (pthread_cond_destroy(&sem->cond) < 0)
- return -1;
-
+ delete sem->cond;
delete sem->mutex;
return 0;
/* Interrupt blocking system call using a signal. */
- pthread_kill(t->tid, Signal_THREAD_INTERRUPT);
+ pthread_kill(t->tid, Signal_INTERRUPT_SYSTEM_CALL);
t->waitcond->signal();
}
-/* threads_sleep ***************************************************************
-
- Sleep the current thread for the specified amount of time.
-
-*******************************************************************************/
-
+/**
+ * Sleep the current thread for the specified amount of time.
+ *
+ * @param millis Milliseconds to sleep.
+ * @param nanos Nanoseconds to sleep.
+ */
void threads_sleep(int64_t millis, int32_t nanos)
{
threadobject *t;
return;
}
- threads_calc_absolute_time(&wakeupTime, millis, nanos);
+ // (Note taken from classpath/vm/reference/java/lang/VMThread.java (sleep))
+ // Note: JDK treats a zero length sleep is like Thread.yield(),
+ // without checking the interrupted status of the thread. It's
+ // unclear if this is a bug in the implementation or the spec.
+ // See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6213203 */
+ if (millis == 0 && nanos == 0) {
+ threads_yield();
+ }
+ else {
+ threads_calc_absolute_time(&wakeupTime, millis, nanos);
- threads_wait_with_timeout(t, &wakeupTime);
+ threads_wait_with_timeout(t, &wakeupTime);
- interrupted = thread_is_interrupted(t);
+ interrupted = thread_is_interrupted(t);
- if (interrupted) {
- thread_set_interrupted(t, false);
+ if (interrupted) {
+ thread_set_interrupted(t, false);
- /* An other exception could have been thrown
- (e.g. ThreadDeathException). */
-
- if (!exceptions_get_exception())
- exceptions_throw_interruptedexception();
+ // An other exception could have been thrown
+ // (e.g. ThreadDeathException).
+ if (!exceptions_get_exception())
+ exceptions_throw_interruptedexception();
+ }
}
}