genode/repos/base-linux/src/test/lx_hybrid_errno/main.cc

81 lines
1.7 KiB
C++
Raw Normal View History

2012-10-24 18:24:17 +02:00
/*
* \brief Test for thread-local errno handling of hybrid Linux/Genode programs
* \author Norman Feske
* \date 2011-12-05
*/
/* Genode includes */
#include <base/component.h>
2012-10-24 18:24:17 +02:00
#include <base/thread.h>
#include <base/log.h>
2012-10-24 18:24:17 +02:00
/* libc includes */
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
2012-10-24 18:24:17 +02:00
enum { STACK_SIZE = 4096 };
struct Thread : Genode::Thread_deprecated<STACK_SIZE>
2012-10-24 18:24:17 +02:00
{
2020-02-18 15:29:47 +01:00
Genode::Blockade &_barrier;
2012-10-24 18:24:17 +02:00
2020-02-18 15:29:47 +01:00
Thread(Genode::Blockade &barrier)
: Genode::Thread_deprecated<STACK_SIZE>("stat"), _barrier(barrier) { start(); }
2012-10-24 18:24:17 +02:00
void entry() override
2012-10-24 18:24:17 +02:00
{
/*
* Stat syscall should return with errno ENOENT
*/
struct stat buf;
int ret = stat("", &buf);
Genode::log("thread: stat returned ", ret, ", errno=", errno);
2012-10-24 18:24:17 +02:00
/*
* Let main thread procees
*/
2020-02-18 15:29:47 +01:00
_barrier.wakeup();
2012-10-24 18:24:17 +02:00
}
};
static int exit_status;
static void exit_on_suspended() { exit(exit_status); }
struct Unexpected_errno_change { };
/*
* Component implements classical main function in construct.
*/
void Component::construct(Genode::Env &env)
2012-10-24 18:24:17 +02:00
{
Genode::log("--- thread-local errno test ---");
2012-10-24 18:24:17 +02:00
2020-02-18 15:29:47 +01:00
static Genode::Blockade barrier;
2012-10-24 18:24:17 +02:00
int const orig_errno = errno;
Genode::log("main: before thread creation, errno=", orig_errno);
2012-10-24 18:24:17 +02:00
/* create thread, which modifies its thread-local errno value */
static Thread thread(barrier);
/* block until the thread performed a 'stat' syscall */
2020-02-18 15:29:47 +01:00
barrier.block();
2012-10-24 18:24:17 +02:00
Genode::log("main: after thread completed, errno=", errno);
2012-10-24 18:24:17 +02:00
if (orig_errno != errno) {
Genode::error("unexpected change of main thread's errno value");
throw Unexpected_errno_change();
2012-10-24 18:24:17 +02:00
}
Genode::log("--- finished thread-local errno test ---");
exit_status = 0;
env.ep().schedule_suspend(exit_on_suspended, nullptr);
2012-10-24 18:24:17 +02:00
}