|
@@ -7,6 +7,7 @@
|
|
|
#include <LibCore/ArgsParser.h>
|
|
|
#include <errno.h>
|
|
|
#include <pthread.h>
|
|
|
+#include <signal_numbers.h>
|
|
|
#include <stdio.h>
|
|
|
#include <stdlib.h>
|
|
|
#include <string.h>
|
|
@@ -19,6 +20,7 @@ static int priority_test();
|
|
|
static int stack_size_test();
|
|
|
static int staying_alive_test();
|
|
|
static int set_stack_test();
|
|
|
+static int kill_test();
|
|
|
|
|
|
int main(int argc, char** argv)
|
|
|
{
|
|
@@ -28,7 +30,7 @@ int main(int argc, char** argv)
|
|
|
args_parser.set_general_help(
|
|
|
"Exercise error-handling and edge-case paths of the execution environment "
|
|
|
"(i.e., Kernel or UE) by doing unusual thread-related things.");
|
|
|
- args_parser.add_positional_argument(test_name, "Test to run (m = mutex, d = detached, p = priority, s = stack size, t = simple thread test, x = set stack, nothing = join race)", "test-name", Core::ArgsParser::Required::No);
|
|
|
+ args_parser.add_positional_argument(test_name, "Test to run (m = mutex, d = detached, p = priority, s = stack size, t = simple thread test, x = set stack, k = kill, nothing = join race)", "test-name", Core::ArgsParser::Required::No);
|
|
|
args_parser.parse(argc, argv);
|
|
|
|
|
|
if (*test_name == 'm')
|
|
@@ -43,6 +45,8 @@ int main(int argc, char** argv)
|
|
|
return staying_alive_test();
|
|
|
if (*test_name == 'x')
|
|
|
return set_stack_test();
|
|
|
+ if (*test_name == 'k')
|
|
|
+ return kill_test();
|
|
|
if (*test_name != 'n') {
|
|
|
args_parser.print_usage(stdout, argv[0]);
|
|
|
return 1;
|
|
@@ -372,3 +376,38 @@ int set_stack_test()
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+int kill_test()
|
|
|
+{
|
|
|
+ pthread_t thread_id;
|
|
|
+ int rc = pthread_create(
|
|
|
+ &thread_id, nullptr, [](void*) -> void* {
|
|
|
+ outln("I'm the secondary thread :^)");
|
|
|
+ sleep(100);
|
|
|
+ outln("Secondary thread is still alive :^(");
|
|
|
+ pthread_exit((void*)0xDEADBEEF);
|
|
|
+ return nullptr;
|
|
|
+ },
|
|
|
+ nullptr);
|
|
|
+ if (rc < 0) {
|
|
|
+ perror("pthread_create");
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ int result = 0;
|
|
|
+
|
|
|
+ sleep(1);
|
|
|
+ outln("I'm the main thread :^)");
|
|
|
+ if (pthread_kill(thread_id, 0) != 0) {
|
|
|
+ perror("pthread_kill");
|
|
|
+ result = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pthread_kill(thread_id, SIGKILL) != 0) {
|
|
|
+ perror("pthread_kill(SIGKILL)");
|
|
|
+ result = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ outln("Main thread exiting");
|
|
|
+ return result;
|
|
|
+}
|