diff -u old/ new/ --- old/Makefile.in 2008-09-18 14:43:55.000000000 -0700 +++ new/Makefile.in 2008-09-18 14:42:53.000000000 -0700 @@ -22,10 +22,10 @@ all: dbench tbench tbench_srv dbench: $(DB_OBJS) - $(CC) -o $@ $(DB_OBJS) $(LIBS) + $(CC) -lpthread -o $@ $(DB_OBJS) $(LIBS) tbench: $(TB_OBJS) - $(CC) -o $@ $(TB_OBJS) $(LIBS) + $(CC) -lpthread -o $@ $(TB_OBJS) $(LIBS) tbench_srv: $(SRV_OBJS) $(CC) -o $@ $(SRV_OBJS) $(LIBS) diff -u old/ new/ --- old/dbench.c 2008-09-18 14:43:49.000000000 -0700 +++ new/dbench.c 2008-09-18 14:42:46.000000000 -0700 @@ -130,6 +130,8 @@ int synccount; struct timeval tv; FILE *load; + int shmid; + sem_t *sema; load = open_loadfile(); if (load == NULL) { @@ -162,12 +164,24 @@ children[i].directory = directory; } + shmid = shmget(IPC_PRIVATE, sizeof(*sema), IPC_CREAT | 0666); + if (shmid < 0) { + perror("could not create shared memory segment"); + exit(1); + } + sema = shmat(shmid, NULL, 0); + + if (sem_init(sema, 1, 0) < 0) { + perror("semaphore initilization failed"); + exit(1); + } + for (i=0;i<nprocs;i++) { if (fork() == 0) { setlinebuf(stdout); nb_setup(&children[i]); children[i].status = getpid(); - pause(); + sem_wait(sema); fn(&children[i], loadfile); _exit(0); } @@ -185,12 +199,14 @@ if (synccount != nprocs) { printf("FAILED TO START %d CLIENTS (started %d)\n", nprocs, synccount); + shmdt(sema); return; } printf("%d clients started\n", nprocs); - kill(0, SIGCONT); + for (i=0;i<nprocs;i++) + sem_post(sema); tv_start = timeval_current(); @@ -202,6 +218,7 @@ if (WEXITSTATUS(status) != 0) { printf("Child failed with status %d\n", WEXITSTATUS(status)); + shmdt(sema); exit(1); } i++; @@ -210,6 +227,8 @@ alarm(0); sig_alarm(SIGALRM); + shmdt(sema); + printf("\n"); } diff -u old/ new/ --- old/dbench.h 2008-09-18 14:43:48.000000000 -0700 +++ new/dbench.h 2008-09-18 14:42:48.000000000 -0700 @@ -35,6 +35,7 @@ #include <sys/ipc.h> #include <sys/shm.h> #include <sys/mman.h> +#include <semaphore.h> #ifdef HAVE_SYS_VFS_H #include <sys/vfs.h>