X-Git-Url: http://git.madism.org/?p=~madcoder%2Fpwqr.git;a=blobdiff_plain;f=test%2Ftest.c;h=242ba5073bed813c0e208d72a55aabf069c16eb4;hp=b4f2f67f08f677684f91476feb340d1c1b7535dd;hb=e8915e9a336e0e0cef3758e7e10dec23443de6dc;hpb=fff79367c87a42fdce8c024eee7d9e2870960a70 diff --git a/test/test.c b/test/test.c index b4f2f67..242ba50 100644 --- a/test/test.c +++ b/test/test.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -74,15 +75,34 @@ static int pwqr_ctl(int fd, int op, int val, void *uaddr) static int pwqr_fd_g = -1; static int pi_g; +static int state_g; -static void *thr_main(void *unused) +#define trace(fmt, ...) fprintf(stderr, fmt"\n", ##__VA_ARGS__) + +static void *thr_main(void *_who) { + int who = (long)_who; + if (pwqr_ctl(pwqr_fd_g, PWQR_CTL_REGISTER, 0, NULL) < 0) - err(-1, "pwqr_ctl(PWQR_CTL_REGISTER)"); + err(-1, "%d: pwqr_ctl(PWQR_CTL_REGISTER)", who); + + /* busy-loop */ + trace("%d: loop1", who); + do { + pthread_testcancel(); + } while (!state_g); + + trace("%d: tries to park", who); + if (pwqr_ctl(pwqr_fd_g, PWQR_CTL_PARK, 0, NULL) < 0) + trace("pwqr_ctl(PWQR_CTL_PARK)"); + trace("%d: unparked", who); /* busy-loop */ - for (;;) + trace("%d: loop2", who); + do { pthread_testcancel(); + } while (state_g); + return NULL; } @@ -98,6 +118,8 @@ int main(void) struct timeval start, tv; int rc; + setlinebuf(stderr); + pwqr_fd_g = pwqr_create(PWQR_FL_NONBLOCK); if (pwqr_fd_g < 0) err(-1, "pwqr_create"); @@ -107,7 +129,7 @@ int main(void) err(-1, "pwqr_ctl(PWQR_CTL_GET_CONC)"); for (int i = 0; i < pi_g + 1; i++) { - pthread_create(&tids[i], NULL, thr_main, NULL); + pthread_create(&tids[i], NULL, thr_main, (void *)(long)i); } pfd.fd = pwqr_fd_g; @@ -126,10 +148,11 @@ int main(void) warn("read"); } else { gettimeofday(&tv, NULL); - warnx("[%06jd.%06jd] overcommit of %d", + trace("[%06jd.%06jd] overcommit of %d", tv_diff(&tv, &start) / 1000000, tv_diff(&tv, &start) % 1000000, rc); } + state_g = 1; } if (pfd.revents & POLLHUP) { errx(-1, "poll returned POLLHUP");