diff options
Diffstat (limited to 'test/test-stop-threads.c')
-rw-r--r-- | test/test-stop-threads.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/test/test-stop-threads.c b/test/test-stop-threads.c index 829e73e..d53d8cd 100644 --- a/test/test-stop-threads.c +++ b/test/test-stop-threads.c @@ -4,15 +4,22 @@ #include <unistd.h> #include <pthread.h> #include <assert.h> +/* printf without taking any locks - because they might be taken at stop time */ +#define ulprintf(...) do { \ + char buf[256]; \ + int len = sprintf(buf, __VA_ARGS__); \ + write(1, buf, len); \ +} while(0) + static void *some_thread(void *ip) { long i = (long) ip; while (1) { - printf("Hello from %ld\n", i); + ulprintf("Hello from %ld\n", i); sleep(1); } } static void replacement() { - printf("Bye\n"); + ulprintf("Bye\n"); pthread_exit(NULL); } static uintptr_t patch_callback(void *ctx, UNUSED uintptr_t pc) { @@ -26,9 +33,13 @@ int main() { pthread_create(&pts[i], NULL, some_thread, (void *) i); sleep(1); void *stop_token; + ulprintf("stopping\n"); assert(!stop_other_threads(&stop_token)); + ulprintf("stopped\n"); assert(!apply_pc_patch_callback(stop_token, patch_callback, NULL)); + ulprintf("resuming\n"); assert(!resume_other_threads(stop_token)); + ulprintf("resumed\n"); void *out; for (long i = 0; i < 10; i++) assert(!pthread_join(pts[i], &out)); |