NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: PR/53998 CVS commit: src/sys/kern
Hello,
In attachement a quick and dirty program that shows sem_init() bugs. If
I remove fork() in child thread, sem_init() runs fine.
Best regards,
JB
semaphore: semaphore.o
gcc -g -o $@ $+ -lpthread
clean:
rm -f *.o semaphore
%.o: %.c
gcc -g -c $< -Wall -o $@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#include <semaphore.h>
#include <pthread.h>
#include <string.h>
#define NUMBER_OF_THREADS 8
typedef struct
{
pthread_t tid;
volatile bool active;
long long i;
sem_t s;
} thread_arg_t;
thread_arg_t targ[NUMBER_OF_THREADS];
void *
thread(void *arg)
{
char **arguments;
pid_t pid;
thread_arg_t *ta = arg;
if (sem_init(&(ta->s), 0, 0) != 0)
{
perror("sem_init()");
_exit(EXIT_FAILURE);
}
pid = fork();
if (pid < 0)
{
perror("fork()");
_exit(EXIT_FAILURE);
}
else if (pid == 0)
{
// Child
if ((arguments = malloc(3 * sizeof(char *))) == NULL)
{
perror("malloc()");
_exit(EXIT_FAILURE);
}
if ((arguments[0] = malloc(5 * sizeof(char *))) == NULL)
{
perror("malloc(0)");
_exit(EXIT_FAILURE);
}
if ((arguments[1] = malloc(40 * sizeof(char *))) == NULL)
{
perror("malloc(1)");
_exit(EXIT_FAILURE);
}
strcpy(arguments[0], "echo");
sprintf(arguments[1], "< %lld >", ta->i);
arguments[2] = NULL;
execvp(arguments[0], arguments);
perror("execvp()");
_exit(EXIT_FAILURE);
}
if (sem_destroy(&(ta->s)) != 0)
{
perror("sem_destroy()");
_exit(EXIT_FAILURE);
}
ta->active = false;
pthread_exit(NULL);
}
int
main()
{
int i;
long long nt;
for(nt = 0;;)
{
for(i = 0; i < NUMBER_OF_THREADS; i++)
{
if (targ[i].active == false)
{
break;
}
}
if (i < NUMBER_OF_THREADS)
{
printf("Free slot : %d (%lld threads)\n", i, ++nt);
targ[i].active = true;
targ[i].i = nt;
if (pthread_create(&(targ[i].tid), NULL, thread, &(targ[i])) != 0)
{
perror("pthread_create()");
exit(EXIT_FAILURE);
}
if (pthread_detach(targ[i].tid) != 0)
{
perror("pthread_detach()");
exit(EXIT_FAILURE);
}
}
else
{
usleep(1000);
}
}
exit(EXIT_SUCCESS);
}
Home |
Main Index |
Thread Index |
Old Index