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++;  }  | 
