haproxy/tests/unit/test-list.c
Willy Tarreau 38ceb554fd TESTS: slightly reorganize the code in the tests/ directory
The code that is there to run some unit tests on some internal features
was moved to tests/unit. Ideally it should be buildable from the main
makefile though this is not yet the case.

The code that is kept for experimentation purposes (hashes, syscall
optimization etc) as well as some captures of the results was moved
to tests/exp.

A few totally obsolete files which couldn't build anymore and were
not relevant to current versions were removed.
2021-04-02 10:51:12 +02:00

99 lines
1.9 KiB
C

#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_ADD(&pouet_list, &lol->list_elt);
break;
case 1:
lol = malloc(sizeof(*lol));
MT_LIST_INIT(&lol->list_elt);
MT_LIST_TRY_ADDQ(&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_DEL_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;
}