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

76 lines
1.6 KiB
C++

/*
* \brief Test for performing IPC from a pthread created outside of Genode
* \author Norman Feske
* \date 2011-12-20
*/
/*
* Copyright (C) 2011-2017 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
/* Genode includes */
#include <base/component.h>
#include <base/thread.h>
#include <base/log.h>
/* libc includes */
#pragma GCC diagnostic ignored "-Weffc++"
#include <pthread.h>
#pragma GCC diagnostic pop
#include <stdlib.h>
static Genode::Blockade *main_wait_lock()
{
static Genode::Blockade inst;
return &inst;
}
static void *pthread_entry(void *)
{
Genode::log("first message");
/*
* Without the lazy initialization of 'Thread' objects for threads
* created w/o Genode's Thread API, the printing of the first message will
* never return because the IPC reply could not be delivered.
*
* With the on-demand creation of 'Thread' objects, the second message
* will appear in the LOG output.
*/
Genode::log("second message");
main_wait_lock()->wakeup();
return 0;
}
static int exit_status;
static void exit_on_suspended() { exit(exit_status); }
/*
* Component implements classical main function in construct.
*/
void Component::construct(Genode::Env &env)
{
Genode::log("--- pthread IPC test ---");
/* create thread w/o Genode's thread API */
pthread_t pth;
pthread_create(&pth, 0, pthread_entry, 0);
/* wait until 'pthread_entry' finished */
main_wait_lock()->block();
Genode::log("--- finished pthread IPC test ---");
exit_status = 0;
env.ep().schedule_suspend(exit_on_suspended, nullptr);
}