diff options
Diffstat (limited to 'tests/unit/test-list.c')
-rw-r--r-- | tests/unit/test-list.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/tests/unit/test-list.c b/tests/unit/test-list.c new file mode 100644 index 0000000..9e6ac38 --- /dev/null +++ b/tests/unit/test-list.c @@ -0,0 +1,98 @@ +#include <pthread.h> +#include <stdio.h> +#include <stdlib.h> +#define USE_THREAD +#include <haproxy/list.h> + +/* Stress test the mt_lists. + * Compile from the haproxy directory with : + * cc -I../../include test-list.c -pthread -O2 -o test-list + * The only argument it takes is the number of threads to be used. + * ./test-list 4 + */ + +struct mt_list pouet_list = MT_LIST_HEAD_INIT(pouet_list); +#define MAX_ACTION 5000000 + +__thread unsigned int tid; +struct pouet_lol { + struct mt_list list_elt; +}; + +void *thread(void *pouet) +{ + struct pouet_lol *lol; + struct mt_list *elt1, elt2; + tid = (uintptr_t)pouet; + int i = 0; + + for (int i = 0; i < MAX_ACTION; i++) { + struct pouet_lol *lol; + struct mt_list *elt1, elt2; + switch (random() % 4) { + case 0: + lol = malloc(sizeof(*lol)); + MT_LIST_INIT(&lol->list_elt); + MT_LIST_TRY_INSERT(&pouet_list, &lol->list_elt); + break; + case 1: + lol = malloc(sizeof(*lol)); + MT_LIST_INIT(&lol->list_elt); + MT_LIST_TRY_APPEND(&pouet_list, &lol->list_elt); + break; + + case 2: + lol = MT_LIST_POP(&pouet_list, struct pouet_lol *, list_elt); + if (lol) + free(lol); + break; + case 3: + + mt_list_for_each_entry_safe(lol, &pouet_list, list_elt, elt1, elt2) + +{ + if (random() % 2) { + MT_LIST_DELETE_SAFE(elt1); + free(lol); + } + if (random() % 2) { + break; + } + } + break; + default: + break; + } + } +} + +int main(int argc, char *argv[]) +{ + int nb; + pthread_t *pth; + + srandom(time(NULL)); + if (argc != 2) { + printf("Usage: %s <nb_threads>\n", argv[0]); + exit(1); + } + nb = atoi(argv[1]); +#if 0 + if (nb < 2) { + printf("Need at least 2 threads.\n"); + exit(1); + } +#endif + pth = malloc(nb * sizeof(*pth)); + if (pth == NULL) { + printf("Shot failed to connect.\n"); + exit(1); + } + for (int i = 0; i < nb; i++) { + pthread_create(&pth[i], NULL, thread, (void *)(uintptr_t)i); + + } + for (int i = 0; i < nb; i++) + pthread_join(pth[i], NULL); + return 0; +} |