2008-05-11 20:25:35 +04:00
|
|
|
/*
|
|
|
|
* Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de.
|
|
|
|
* Distributed under the terms of the MIT License.
|
|
|
|
*/
|
|
|
|
#ifndef _LIBROOT_USER_THREAD_H
|
|
|
|
#define _LIBROOT_USER_THREAD_H
|
|
|
|
|
|
|
|
#include <OS.h>
|
|
|
|
#include <TLS.h>
|
|
|
|
|
2008-05-14 07:55:16 +04:00
|
|
|
#include <tls.h>
|
|
|
|
#include <user_thread_defs.h>
|
2008-05-11 20:25:35 +04:00
|
|
|
|
|
|
|
|
2016-12-17 22:00:47 +03:00
|
|
|
static inline struct user_thread*
|
2008-05-11 20:25:35 +04:00
|
|
|
get_user_thread()
|
|
|
|
{
|
2016-12-17 22:00:47 +03:00
|
|
|
return (struct user_thread*)tls_get(TLS_USER_THREAD_SLOT);
|
2008-05-11 20:25:35 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void inline
|
|
|
|
defer_signals()
|
|
|
|
{
|
|
|
|
get_user_thread()->defer_signals++;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void inline
|
|
|
|
undefer_signals()
|
|
|
|
{
|
2016-12-17 22:00:47 +03:00
|
|
|
struct user_thread* thread = get_user_thread();
|
2008-05-11 20:25:35 +04:00
|
|
|
if (--thread->defer_signals == 0 && thread->pending_signals != 0) {
|
|
|
|
// signals shall no longer be deferred -- call a dummy syscall to handle
|
|
|
|
// the pending ones
|
|
|
|
is_computer_on();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endif /* _LIBROOT_USER_THREAD_H */
|