mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-05-05 01:07:59 +00:00
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.
99 lines
1.9 KiB
C
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;
|
|
}
|