66 lines
1.7 KiB
C
66 lines
1.7 KiB
C
/*
|
|
* \brief Linux-specific helper functions for the Lock implementation
|
|
* \author Norman Feske
|
|
* \date 2009-07-20
|
|
*
|
|
* This file serves as adapter between the generic lock implementation
|
|
* in 'lock.cc' and the underlying kernel.
|
|
*
|
|
* For documentation about the interface, please revisit the 'base-pistachio'
|
|
* implementation.
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2009-2013 Genode Labs GmbH
|
|
*
|
|
* This file is part of the Genode OS framework, which is distributed
|
|
* under the terms of the GNU General Public License version 2.
|
|
*/
|
|
|
|
/* Genode includes */
|
|
#include <base/native_types.h>
|
|
#include <base/thread.h>
|
|
|
|
/* Linux includes */
|
|
#include <linux_syscalls.h>
|
|
|
|
|
|
extern int main_thread_futex_counter;
|
|
|
|
|
|
static inline void thread_yield()
|
|
{
|
|
struct timespec ts = { 0, 1000 };
|
|
lx_nanosleep(&ts, 0);
|
|
}
|
|
|
|
|
|
static inline bool thread_check_stopped_and_restart(Genode::Thread_base *thread_base)
|
|
{
|
|
const int *futex_counter_ptr = thread_base ?
|
|
&thread_base->tid().futex_counter :
|
|
&main_thread_futex_counter;
|
|
return lx_futex(futex_counter_ptr, LX_FUTEX_WAKE, 1);
|
|
}
|
|
|
|
|
|
static inline void thread_switch_to(Genode::Thread_base *thread_base)
|
|
{
|
|
thread_yield();
|
|
}
|
|
|
|
|
|
static inline void thread_stop_myself()
|
|
{
|
|
/*
|
|
* Just go to sleep without modifying the counter value. The
|
|
* 'thread_check_stopped_and_restart()' function will get called
|
|
* repeatedly until this thread has actually executed the syscall.
|
|
*/
|
|
Genode::Thread_base *myself = Genode::Thread_base::myself();
|
|
const int *futex_counter_ptr = myself ?
|
|
&myself->tid().futex_counter :
|
|
&main_thread_futex_counter;
|
|
lx_futex(futex_counter_ptr, LX_FUTEX_WAIT, 0);
|
|
}
|