aboutsummaryrefslogtreecommitdiff
path: root/test/test-stop-threads.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/test-stop-threads.c')
-rw-r--r--test/test-stop-threads.c15
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));