mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-06 04:57:49 +00:00
support for the Genode OS framework (#5560)
This commit is contained in:
committed by
Andreas Rumpf
parent
57246cbcec
commit
7e351fc7fa
78
lib/genode_cpp/syslocks.h
Normal file
78
lib/genode_cpp/syslocks.h
Normal file
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
*
|
||||
* Nim's Runtime Library
|
||||
* (c) Copyright 2017 Emery Hemingway
|
||||
*
|
||||
* See the file "copying.txt", included in this
|
||||
* distribution, for details about the copyright.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _GENODE_CPP__SYSLOCKS_H_
|
||||
#define _GENODE_CPP__SYSLOCKS_H_
|
||||
|
||||
/* Genode includes */
|
||||
#include <base/semaphore.h>
|
||||
#include <base/lock.h>
|
||||
|
||||
namespace Nim {
|
||||
struct SysLock;
|
||||
struct SysCond;
|
||||
}
|
||||
|
||||
struct Nim::SysLock
|
||||
{
|
||||
Genode::Lock _lock_a, _lock_b;
|
||||
bool _locked;
|
||||
|
||||
void acquireSys()
|
||||
{
|
||||
_lock_a.lock();
|
||||
_locked = true;
|
||||
_lock_a.unlock();
|
||||
_lock_b.lock();
|
||||
}
|
||||
|
||||
bool tryAcquireSys()
|
||||
{
|
||||
if (_locked)
|
||||
return false;
|
||||
|
||||
_lock_a.lock();
|
||||
if (_locked) {
|
||||
_lock_a.unlock();
|
||||
return false;
|
||||
} else {
|
||||
_locked = true;
|
||||
_lock_b.lock();
|
||||
_lock_a.unlock();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
void releaseSys()
|
||||
{
|
||||
_locked = false;
|
||||
_lock_a.unlock();
|
||||
_lock_b.unlock();
|
||||
}
|
||||
};
|
||||
|
||||
struct Nim::SysCond
|
||||
{
|
||||
Genode::Semaphore _semaphore;
|
||||
|
||||
void waitSysCond(SysLock &syslock)
|
||||
{
|
||||
syslock.releaseSys();
|
||||
_semaphore.down();
|
||||
syslock.acquireSys();
|
||||
}
|
||||
|
||||
void signalSysCond()
|
||||
{
|
||||
_semaphore.up();
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
69
lib/genode_cpp/threads.h
Normal file
69
lib/genode_cpp/threads.h
Normal file
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
*
|
||||
* Nim's Runtime Library
|
||||
* (c) Copyright 2017 Emery Hemingway
|
||||
*
|
||||
* See the file "copying.txt", included in this
|
||||
* distribution, for details about the copyright.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _GENODE_CPP__THREAD_H_
|
||||
#define _GENODE_CPP__THREAD_H_
|
||||
|
||||
#include <base/thread.h>
|
||||
#include <util/avl_tree.h>
|
||||
#include <util/reconstructible.h>
|
||||
|
||||
namespace Nim { struct SysThread; }
|
||||
|
||||
struct Nim::SysThread
|
||||
{
|
||||
typedef void (Entry)(void*);
|
||||
|
||||
struct Thread : Genode::Thread
|
||||
{
|
||||
void *_tls;
|
||||
|
||||
Entry *_func;
|
||||
void *_arg;
|
||||
|
||||
void entry() override {
|
||||
(_func)(_arg); }
|
||||
|
||||
Thread(Genode::Env &env, Genode::size_t stack_size, Entry func, void *arg)
|
||||
: Genode::Thread(env, "nim-thread", stack_size), _func(func), _arg(arg)
|
||||
{
|
||||
Genode::Thread::start();
|
||||
}
|
||||
};
|
||||
|
||||
Genode::Constructible<Thread> _thread;
|
||||
|
||||
void initThread(Genode::Env *env, Genode::size_t stack_size, Entry func, void *arg) {
|
||||
_thread.construct(*env, stack_size, func, arg); }
|
||||
|
||||
void joinThread() {
|
||||
_thread->join(); }
|
||||
|
||||
static bool offMainThread() {
|
||||
return dynamic_cast<SysThread::Thread*>(Genode::Thread::myself()); }
|
||||
|
||||
static void *threadVarGetValue()
|
||||
{
|
||||
SysThread::Thread *thr =
|
||||
static_cast<SysThread::Thread*>(Genode::Thread::myself());
|
||||
return thr->_tls;
|
||||
}
|
||||
|
||||
static void threadVarSetValue(void *value)
|
||||
{
|
||||
SysThread::Thread *thr =
|
||||
static_cast<SysThread::Thread*>(Genode::Thread::myself());
|
||||
thr->_tls = value;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user