test506: verify aa6884845168
authorDaniel Stenberg <daniel@haxx.se>
Tue, 15 Jul 2014 22:09:58 +0000 (00:09 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 15 Jul 2014 22:09:58 +0000 (00:09 +0200)
After the fixed cookie lock deadlock, this test now passes and it
detects double-locking and double-unlocking of mutexes.

tests/data/test506
tests/libtest/lib506.c

index f9d2be4..f53a680 100644 (file)
@@ -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>
index 4d2864d..4a3ec5a 100644 (file)
@@ -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++;
 }