diff --git a/src/tests/system/kernel/Jamfile b/src/tests/system/kernel/Jamfile index f631f2f9b3..86ab8f2397 100644 --- a/src/tests/system/kernel/Jamfile +++ b/src/tests/system/kernel/Jamfile @@ -4,7 +4,7 @@ UsePrivateHeaders kernel ; UseHeaders $(TARGET_PRIVATE_KERNEL_HEADERS) : true ; SimpleTest fibo_load_image : fibo_load_image.cpp ; -#SimpleTest fibo_fork : fibo_fork.cpp ; +SimpleTest fibo_fork : fibo_fork.cpp ; #SimpleTest fibo_exec : fibo_exec.cpp ; SimpleTest port_close_test_1 : port_close_test_1.cpp ; diff --git a/src/tests/system/kernel/fibo_fork.cpp b/src/tests/system/kernel/fibo_fork.cpp new file mode 100644 index 0000000000..29c1a3957a --- /dev/null +++ b/src/tests/system/kernel/fibo_fork.cpp @@ -0,0 +1,90 @@ +/* + * Copyright 2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Copyright 2002, Manuel J. Petit. All rights reserved. + * Distributed under the terms of the NewOS License. + */ + + +#include + +#include +#include +#include +#include +#include + + +int gForked = 0; + + +static void +usage(char const *app) +{ + printf("usage: %s ###\n", app); + exit(-1); +} + + +int +main(int argc, char *argv[]) +{ + int result = 0; + + if (argc != 2) + usage(argv[0]); + + int num = atoi(argv[1]); + + if (num < 2) { + result = num; + } else { + pid_t childA = fork(); + if (childA == 0) { + // we're the child + char buffer[64]; + char* args[]= { argv[0], buffer, NULL }; + int argCount = 2; + gForked++; + + snprintf(buffer, sizeof(buffer), "%d", num - 1); + return main(argCount, args); + } else if (childA < 0) { + fprintf(stderr, "fork() failed for child A: %s\n", strerror(errno)); + return -1; + } + + pid_t childB = fork(); + if (childB == 0) { + // we're the child + char buffer[64]; + char* args[]= { argv[0], buffer, NULL }; + int argCount = 2; + gForked++; + + snprintf(buffer, sizeof(buffer), "%d", num - 2); + return main(argCount, args); + } else if (childB < 0) { + fprintf(stderr, "fork() failed for child B: %s\n", strerror(errno)); + return -1; + } + + status_t status; + while (wait_for_thread(childA, &status) == B_INTERRUPTED) + ; + result = status; + + while (wait_for_thread(childB, &status) == B_INTERRUPTED) + ; + result += status; + } + + if (gForked) { + return result; + } else { + printf("%d\n", result); + return 0; + } +} + diff --git a/src/tests/system/kernel/fibo_load_image.cpp b/src/tests/system/kernel/fibo_load_image.cpp index ceb2d93d45..ef302ef30c 100644 --- a/src/tests/system/kernel/fibo_load_image.cpp +++ b/src/tests/system/kernel/fibo_load_image.cpp @@ -47,7 +47,7 @@ main(int argc, char *argv[]) } if (num < 2) { - result = 1; + result = num; } else { char buffer[64]; char* args[]= { argv[0], "-s", buffer, NULL };