mirror of
https://github.com/darlinghq/darling-libpthread.git
synced 2024-11-27 14:00:26 +00:00
43 lines
853 B
C
43 lines
853 B
C
|
#include <assert.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <pthread.h>
|
||
|
#include <unistd.h>
|
||
|
#include <dispatch/dispatch.h>
|
||
|
#include <sys/mman.h>
|
||
|
|
||
|
#include "darwintest_defaults.h"
|
||
|
|
||
|
static void*
|
||
|
thread_routine(void *loc)
|
||
|
{
|
||
|
uintptr_t i = (uintptr_t)loc;
|
||
|
|
||
|
switch (i % 3) {
|
||
|
case 0:
|
||
|
usleep(1000);
|
||
|
break;
|
||
|
case 1:
|
||
|
pthread_exit(pthread_self());
|
||
|
__builtin_unreachable();
|
||
|
case 2:
|
||
|
break;
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
T_DECL(pthread_detach, "Test creating and detaching threads in a loop",
|
||
|
T_META_CHECK_LEAKS(NO), T_META_ALL_VALID_ARCHS(YES))
|
||
|
{
|
||
|
const size_t count = 32;
|
||
|
pthread_t ths[count];
|
||
|
|
||
|
for (size_t i = 0; i < 100; i++) {
|
||
|
for (size_t j = 0; j < count; j++) {
|
||
|
T_ASSERT_POSIX_ZERO(pthread_create(&ths[j], NULL,
|
||
|
thread_routine, (void *)j), "thread creation");
|
||
|
T_ASSERT_POSIX_ZERO(pthread_detach(ths[j]), "thread detach");
|
||
|
}
|
||
|
usleep(50000);
|
||
|
}
|
||
|
}
|