All pastes #564423 Raw Edit

SOE Lab7

public c v1 · immutable
·published 2007-06-13 16:14 UTC
rendered paste body
#include <pthread.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <signal.h>       unsigned int licznik = 0;unsigned int linia = 1;unsigned int liczba_watkow;pthread_rwlock_t licznik_lock = PTHREAD_RWLOCK_INITIALIZER;pthread_mutex_t cond_mutex = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t cond = PTHREAD_COND_INITIALIZER;pthread_mutex_t cond2_mutex = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t cond2 = PTHREAD_COND_INITIALIZER;typedef struct {     int fd;     unsigned int linia;} worker_arg; void *worker_t(void *arg){    worker_arg *wa = (worker_arg *)arg;    char buf[128];#ifdef DEBUG        printf("worker %d %d\n",wa->fd,wa->linia);    fflush(stdout);#endif            while (1) {        pthread_testcancel();#ifdef DEBUG            printf("worker %d lockwait\n",wa->linia);	fflush(stdout);#endif        	pthread_mutex_lock(&cond_mutex);#ifdef DEBUG            printf("worker %d lock\n",wa->linia);	fflush(stdout);#endif        		while (wa->linia!=linia) { 	    if (pthread_cond_wait(&cond,&cond_mutex)!=0) {		perror("pthread_cond_wait");		exit(-1);	    }#ifdef DEBUG    	    printf("worker %d cond\n",wa->linia);	    fflush(stdout);#endif        		};#ifdef DEBUG    		printf("in worker %d\n",wa->linia);	fflush(stdout);#endif        			if (fgets(buf,128,stdin) != 0) {	    write(wa->fd,buf,strlen(buf));	    pthread_rwlock_wrlock(&licznik_lock);	    licznik++;	    pthread_rwlock_unlock(&licznik_lock);	} else {		pthread_mutex_unlock(&cond_mutex);		pthread_cond_signal(&cond2);		return 0;	}	        if (linia == liczba_watkow)	    linia = 1;        else 	    linia++;		sleep(1);#ifdef DEBUG    	printf("worker %d switch\n",wa->linia);	fflush(stdout);#endif        			pthread_mutex_unlock(&cond_mutex);	pthread_cond_broadcast(&cond);    }};int main (int argc, char **argv) {    pthread_t *tidy;    int *fds;    int n;        if (argc<2) {	fprintf(stderr,"%s: plik1 (..) plikn\n",argv[0]);	return -1;    };        liczba_watkow = argc-1;        tidy = (pthread_t *)malloc(sizeof(pthread_t)*(liczba_watkow));    if (tidy==0) {	perror("malloc");	return -1;    };        fds = (int *)malloc(sizeof(int)*(liczba_watkow));    if (fds==0) {	perror("malloc");	return -1;    };        pthread_mutex_lock(&cond_mutex);    pthread_mutex_lock(&cond2_mutex);    for (n=0;n<liczba_watkow;n++) {	worker_arg *wa = (worker_arg *)malloc (sizeof (worker_arg));	if (wa==0){	    perror("malloc");	    return -1;	}	wa->linia=n+1;	wa->fd=open(argv[n+1],O_WRONLY|O_CREAT|O_TRUNC,S_IWUSR|S_IRUSR);	if (wa->fd==-1) {	    perror("open");	    return -1;	}	if (pthread_create(&(tidy[n]),0,worker_t,wa)!=0) {	    perror("pthread_create");	    return -1;	}    };    pthread_mutex_unlock(&cond_mutex);        pthread_cond_broadcast(&cond);    struct timespec tm;    tm.tv_sec = 10;    tm.tv_nsec = 0;        pthread_cond_reltimedwait_np(&cond2,&cond2_mutex,&tm);#ifdef DEBUG        printf("Timeout!\n");    fflush(stdout);#endif        pthread_mutex_unlock(&cond2_mutex);        for (n=0;n<liczba_watkow;n++) 	pthread_cancel(tidy[n]);#ifdef DEBUG        printf("Cancel!\n");    fflush(stdout);#endif            for (n=0;n<liczba_watkow;n++) 	close(fds[n]);        pthread_rwlock_rdlock(&licznik_lock);    printf("Liczba linii: %d\n",licznik);    pthread_rwlock_unlock(&licznik_lock);    return 0;}