aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2014-07-16 00:09:58 +0200
committerDaniel Stenberg <daniel@haxx.se>2014-07-16 00:09:58 +0200
commit4cb2521595ac557d3b94c48ef21a184fbed80d3c (patch)
treeaaff0271664ad66dc627ef5e19ffdf2599bc9c8e
parentaa6884845168e3ddc43f0d7f2c8f40bb947d2506 (diff)
test506: verify aa6884845168
After the fixed cookie lock deadlock, this test now passes and it detects double-locking and double-unlocking of mutexes.
-rw-r--r--tests/data/test50630
-rw-r--r--tests/libtest/lib506.c28
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++;
}