#include <pthread.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#include <sys/socket.h>
#include "test.h"
#define ITERATIONS 100
#define BUSY_THREADS 10
static void *
deadlock_detector(void *arg)
{
sleep(60);
PANIC("deadlock detected");
}
static void *
busy_thread(void *arg)
{
int fd = *(int *)arg;
while(fcntl(fd, F_GETFD, NULL) != -1);
return ((caddr_t)NULL + errno);
}
int
main(int argc, char *argv[])
{
pthread_t busy_threads[BUSY_THREADS], deadlock_thread;
int fd, i, j;
void *value_ptr;
struct timespec rqtp;
rqtp.tv_sec = 0;
rqtp.tv_nsec = 1000000;
CHECKr(pthread_create(&deadlock_thread, NULL,
deadlock_detector, NULL));
for (i = 0; i < ITERATIONS; i++) {
CHECKe(fd = socket(AF_INET, SOCK_DGRAM, 0));
for (j = 0; j < BUSY_THREADS; j++)
CHECKr(pthread_create(&busy_threads[j], NULL,
busy_thread, (void *)&fd));
nanosleep(&rqtp, NULL);
CHECKr(close(fd));
for (j = 0; j < 5; j++) {
CHECKr(pthread_join(busy_threads[j], &value_ptr));
ASSERT(value_ptr == (void *)EBADF);
}
}
SUCCEED;
}