diff options
author | Daniel Stenberg <daniel@haxx.se> | 2014-07-16 00:09:58 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2014-07-16 00:09:58 +0200 |
commit | 4cb2521595ac557d3b94c48ef21a184fbed80d3c (patch) | |
tree | aaff0271664ad66dc627ef5e19ffdf2599bc9c8e /tests | |
parent | aa6884845168e3ddc43f0d7f2c8f40bb947d2506 (diff) |
test506: verify aa6884845168
After the fixed cookie lock deadlock, this test now passes and it
detects double-locking and double-unlocking of mutexes.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/data/test506 | 30 | ||||
-rw-r--r-- | tests/libtest/lib506.c | 28 |
2 files changed, 41 insertions, 17 deletions
diff --git a/tests/data/test506 b/tests/data/test506 index f9d2be4b4..f53a68040 100644 --- a/tests/data/test506 +++ b/tests/data/test506 @@ -156,33 +156,31 @@ unlock: share [Pigs in space]: 53 CURLOPT_COOKIEJAR CURLOPT_COOKIELIST FLUSH lock: cookie [Pigs in space]: 54 -lock: cookie [Pigs in space]: 55 -unlock: cookie [Pigs in space]: 56 -unlock: cookie [Pigs in space]: 57 +unlock: cookie [Pigs in space]: 55 PERFORM -lock: dns [Pigs in space]: 58 -unlock: dns [Pigs in space]: 59 +lock: dns [Pigs in space]: 56 +unlock: dns [Pigs in space]: 57 +lock: cookie [Pigs in space]: 58 +unlock: cookie [Pigs in space]: 59 lock: cookie [Pigs in space]: 60 unlock: cookie [Pigs in space]: 61 lock: cookie [Pigs in space]: 62 unlock: cookie [Pigs in space]: 63 -lock: cookie [Pigs in space]: 64 -unlock: cookie [Pigs in space]: 65 run 3: overwrite cookie 1 and 4 -lock: dns [Pigs in space]: 66 -unlock: dns [Pigs in space]: 67 +lock: dns [Pigs in space]: 64 +unlock: dns [Pigs in space]: 65 try SHARE_CLEANUP... -lock: share [Pigs in space]: 68 -unlock: share [Pigs in space]: 69 +lock: share [Pigs in space]: 66 +unlock: share [Pigs in space]: 67 SHARE_CLEANUP failed, correct CLEANUP -lock: cookie [Pigs in space]: 70 -unlock: cookie [Pigs in space]: 71 +lock: cookie [Pigs in space]: 68 +unlock: cookie [Pigs in space]: 69 +lock: share [Pigs in space]: 70 +unlock: share [Pigs in space]: 71 +SHARE_CLEANUP lock: share [Pigs in space]: 72 unlock: share [Pigs in space]: 73 -SHARE_CLEANUP -lock: share [Pigs in space]: 74 -unlock: share [Pigs in space]: 75 GLOBAL_CLEANUP </stdout> <stderr> diff --git a/tests/libtest/lib506.c b/tests/libtest/lib506.c index 4d2864de9..4a3ec5aed 100644 --- a/tests/libtest/lib506.c +++ b/tests/libtest/lib506.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -40,12 +40,15 @@ struct userdata { int counter; }; +int lock[3]; + /* lock callback */ static void my_lock(CURL *handle, curl_lock_data data, curl_lock_access laccess, void *useptr ) { const char *what; struct userdata *user = (struct userdata *)useptr; + int locknum; (void)handle; (void)laccess; @@ -53,17 +56,28 @@ static void my_lock(CURL *handle, curl_lock_data data, curl_lock_access laccess, switch ( data ) { case CURL_LOCK_DATA_SHARE: what = "share"; + locknum = 0; break; case CURL_LOCK_DATA_DNS: what = "dns"; + locknum = 1; break; case CURL_LOCK_DATA_COOKIE: what = "cookie"; + locknum = 2; break; default: fprintf(stderr, "lock: no such data: %d\n", (int)data); return; } + + /* detect locking of locked locks */ + if(lock[locknum]) { + printf("lock: double locked %s\n", what); + return; + } + lock[locknum]++; + printf("lock: %-6s [%s]: %d\n", what, user->text, user->counter); user->counter++; } @@ -73,21 +87,33 @@ static void my_unlock(CURL *handle, curl_lock_data data, void *useptr ) { const char *what; struct userdata *user = (struct userdata *)useptr; + int locknum; (void)handle; switch ( data ) { case CURL_LOCK_DATA_SHARE: what = "share"; + locknum = 0; break; case CURL_LOCK_DATA_DNS: what = "dns"; + locknum = 1; break; case CURL_LOCK_DATA_COOKIE: what = "cookie"; + locknum = 2; break; default: fprintf(stderr, "unlock: no such data: %d\n", (int)data); return; } + + /* detect unlocking of unlocked locks */ + if(!lock[locknum]) { + printf("unlock: double unlocked %s\n", what); + return; + } + lock[locknum]--; + printf("unlock: %-6s [%s]: %d\n", what, user->text, user->counter); user->counter++; } |