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 */
|
2015-12-23 15:22:33 +01:00
|
|
|
#include <base/component.h>
|
2012-10-24 18:24:17 +02:00
|
|
|
#include <base/thread.h>
|
base: avoid use of deprecated base/printf.h
Besides adapting the components to the use of base/log.h, the patch
cleans up a few base headers, i.e., it removes unused includes from
root/component.h, specifically base/heap.h and
ram_session/ram_session.h. Hence, components that relied on the implicit
inclusion of those headers have to manually include those headers now.
While adjusting the log messages, I repeatedly stumbled over the problem
that printing char * arguments is ambiguous. It is unclear whether to
print the argument as pointer or null-terminated string. To overcome
this problem, the patch introduces a new type 'Cstring' that allows the
caller to express that the argument should be handled as null-terminated
string. As a nice side effect, with this type in place, the optional len
argument of the 'String' class could be removed. Instead of supplying a
pair of (char const *, size_t), the constructor accepts a 'Cstring'.
This, in turn, clears the way let the 'String' constructor use the new
output mechanism to assemble a string from multiple arguments (and
thereby getting rid of snprintf within Genode in the near future).
To enforce the explicit resolution of the char * ambiguity, the 'char *'
overload of the 'print' function is marked as deleted.
Issue #1987
2016-07-13 19:07:09 +02:00
|
|
|
#include <base/log.h>
|
2012-10-24 18:24:17 +02:00
|
|
|
|
|
|
|
/* libc includes */
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <errno.h>
|
2015-12-23 15:22:33 +01:00
|
|
|
#include <stdlib.h>
|
2012-10-24 18:24:17 +02:00
|
|
|
|
|
|
|
enum { STACK_SIZE = 4096 };
|
|
|
|
|
2016-05-04 12:27:17 +02:00
|
|
|
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)
|
2016-05-04 12:27:17 +02:00
|
|
|
: Genode::Thread_deprecated<STACK_SIZE>("stat"), _barrier(barrier) { start(); }
|
2012-10-24 18:24:17 +02:00
|
|
|
|
2019-02-14 22:39:08 +01: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);
|
|
|
|
|
base: avoid use of deprecated base/printf.h
Besides adapting the components to the use of base/log.h, the patch
cleans up a few base headers, i.e., it removes unused includes from
root/component.h, specifically base/heap.h and
ram_session/ram_session.h. Hence, components that relied on the implicit
inclusion of those headers have to manually include those headers now.
While adjusting the log messages, I repeatedly stumbled over the problem
that printing char * arguments is ambiguous. It is unclear whether to
print the argument as pointer or null-terminated string. To overcome
this problem, the patch introduces a new type 'Cstring' that allows the
caller to express that the argument should be handled as null-terminated
string. As a nice side effect, with this type in place, the optional len
argument of the 'String' class could be removed. Instead of supplying a
pair of (char const *, size_t), the constructor accepts a 'Cstring'.
This, in turn, clears the way let the 'String' constructor use the new
output mechanism to assemble a string from multiple arguments (and
thereby getting rid of snprintf within Genode in the near future).
To enforce the explicit resolution of the char * ambiguity, the 'char *'
overload of the 'print' function is marked as deleted.
Issue #1987
2016-07-13 19:07:09 +02:00
|
|
|
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
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2015-12-23 15:22:33 +01:00
|
|
|
static int exit_status;
|
|
|
|
static void exit_on_suspended() { exit(exit_status); }
|
|
|
|
|
|
|
|
|
|
|
|
struct Unexpected_errno_change { };
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Component implements classical main function in construct.
|
|
|
|
*/
|
2016-04-27 22:11:38 +02:00
|
|
|
void Component::construct(Genode::Env &env)
|
2012-10-24 18:24:17 +02:00
|
|
|
{
|
base: avoid use of deprecated base/printf.h
Besides adapting the components to the use of base/log.h, the patch
cleans up a few base headers, i.e., it removes unused includes from
root/component.h, specifically base/heap.h and
ram_session/ram_session.h. Hence, components that relied on the implicit
inclusion of those headers have to manually include those headers now.
While adjusting the log messages, I repeatedly stumbled over the problem
that printing char * arguments is ambiguous. It is unclear whether to
print the argument as pointer or null-terminated string. To overcome
this problem, the patch introduces a new type 'Cstring' that allows the
caller to express that the argument should be handled as null-terminated
string. As a nice side effect, with this type in place, the optional len
argument of the 'String' class could be removed. Instead of supplying a
pair of (char const *, size_t), the constructor accepts a 'Cstring'.
This, in turn, clears the way let the 'String' constructor use the new
output mechanism to assemble a string from multiple arguments (and
thereby getting rid of snprintf within Genode in the near future).
To enforce the explicit resolution of the char * ambiguity, the 'char *'
overload of the 'print' function is marked as deleted.
Issue #1987
2016-07-13 19:07:09 +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;
|
|
|
|
|
base: avoid use of deprecated base/printf.h
Besides adapting the components to the use of base/log.h, the patch
cleans up a few base headers, i.e., it removes unused includes from
root/component.h, specifically base/heap.h and
ram_session/ram_session.h. Hence, components that relied on the implicit
inclusion of those headers have to manually include those headers now.
While adjusting the log messages, I repeatedly stumbled over the problem
that printing char * arguments is ambiguous. It is unclear whether to
print the argument as pointer or null-terminated string. To overcome
this problem, the patch introduces a new type 'Cstring' that allows the
caller to express that the argument should be handled as null-terminated
string. As a nice side effect, with this type in place, the optional len
argument of the 'String' class could be removed. Instead of supplying a
pair of (char const *, size_t), the constructor accepts a 'Cstring'.
This, in turn, clears the way let the 'String' constructor use the new
output mechanism to assemble a string from multiple arguments (and
thereby getting rid of snprintf within Genode in the near future).
To enforce the explicit resolution of the char * ambiguity, the 'char *'
overload of the 'print' function is marked as deleted.
Issue #1987
2016-07-13 19:07:09 +02:00
|
|
|
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
|
|
|
|
base: avoid use of deprecated base/printf.h
Besides adapting the components to the use of base/log.h, the patch
cleans up a few base headers, i.e., it removes unused includes from
root/component.h, specifically base/heap.h and
ram_session/ram_session.h. Hence, components that relied on the implicit
inclusion of those headers have to manually include those headers now.
While adjusting the log messages, I repeatedly stumbled over the problem
that printing char * arguments is ambiguous. It is unclear whether to
print the argument as pointer or null-terminated string. To overcome
this problem, the patch introduces a new type 'Cstring' that allows the
caller to express that the argument should be handled as null-terminated
string. As a nice side effect, with this type in place, the optional len
argument of the 'String' class could be removed. Instead of supplying a
pair of (char const *, size_t), the constructor accepts a 'Cstring'.
This, in turn, clears the way let the 'String' constructor use the new
output mechanism to assemble a string from multiple arguments (and
thereby getting rid of snprintf within Genode in the near future).
To enforce the explicit resolution of the char * ambiguity, the 'char *'
overload of the 'print' function is marked as deleted.
Issue #1987
2016-07-13 19:07:09 +02:00
|
|
|
Genode::log("main: after thread completed, errno=", errno);
|
2012-10-24 18:24:17 +02:00
|
|
|
|
|
|
|
if (orig_errno != errno) {
|
base: avoid use of deprecated base/printf.h
Besides adapting the components to the use of base/log.h, the patch
cleans up a few base headers, i.e., it removes unused includes from
root/component.h, specifically base/heap.h and
ram_session/ram_session.h. Hence, components that relied on the implicit
inclusion of those headers have to manually include those headers now.
While adjusting the log messages, I repeatedly stumbled over the problem
that printing char * arguments is ambiguous. It is unclear whether to
print the argument as pointer or null-terminated string. To overcome
this problem, the patch introduces a new type 'Cstring' that allows the
caller to express that the argument should be handled as null-terminated
string. As a nice side effect, with this type in place, the optional len
argument of the 'String' class could be removed. Instead of supplying a
pair of (char const *, size_t), the constructor accepts a 'Cstring'.
This, in turn, clears the way let the 'String' constructor use the new
output mechanism to assemble a string from multiple arguments (and
thereby getting rid of snprintf within Genode in the near future).
To enforce the explicit resolution of the char * ambiguity, the 'char *'
overload of the 'print' function is marked as deleted.
Issue #1987
2016-07-13 19:07:09 +02:00
|
|
|
Genode::error("unexpected change of main thread's errno value");
|
2015-12-23 15:22:33 +01:00
|
|
|
throw Unexpected_errno_change();
|
2012-10-24 18:24:17 +02:00
|
|
|
}
|
|
|
|
|
base: avoid use of deprecated base/printf.h
Besides adapting the components to the use of base/log.h, the patch
cleans up a few base headers, i.e., it removes unused includes from
root/component.h, specifically base/heap.h and
ram_session/ram_session.h. Hence, components that relied on the implicit
inclusion of those headers have to manually include those headers now.
While adjusting the log messages, I repeatedly stumbled over the problem
that printing char * arguments is ambiguous. It is unclear whether to
print the argument as pointer or null-terminated string. To overcome
this problem, the patch introduces a new type 'Cstring' that allows the
caller to express that the argument should be handled as null-terminated
string. As a nice side effect, with this type in place, the optional len
argument of the 'String' class could be removed. Instead of supplying a
pair of (char const *, size_t), the constructor accepts a 'Cstring'.
This, in turn, clears the way let the 'String' constructor use the new
output mechanism to assemble a string from multiple arguments (and
thereby getting rid of snprintf within Genode in the near future).
To enforce the explicit resolution of the char * ambiguity, the 'char *'
overload of the 'print' function is marked as deleted.
Issue #1987
2016-07-13 19:07:09 +02:00
|
|
|
Genode::log("--- finished thread-local errno test ---");
|
2015-12-23 15:22:33 +01:00
|
|
|
exit_status = 0;
|
|
|
|
env.ep().schedule_suspend(exit_on_suspended, nullptr);
|
2012-10-24 18:24:17 +02:00
|
|
|
}
|