int main(int argc, char *argv[]) { char *src, *dst; FILE *fsrc, *fdst; int fill_sleep, drain_sleep; pthread_t thread_fill, thread_drain; _thread_arg fill_arg, drain_arg; if (argc != 5) { fprintf(stderr, "usage: ./transfer1 <input file> <output file> <fill sleep time> <drain sleep time>\n"); exit(EXIT_FAILURE); } src = argv[1]; dst = argv[2]; fill_sleep = atoi(argv[3]); drain_sleep = atoi(argv[4]); if ((fsrc = fopen(src, "r")) == NULL) HANDLE_ERROR("fopen source"); if ((fdst = fopen(dst, "w")) == NULL) HANDLE_ERROR("fopen destination"); if (sem_init(&sem, 0, 1) == -1) HANDLE_ERROR("sem_init"); if (sem_init(&spaces, 0, CBUF_CAPACITY) == -1) HANDLE_ERROR("sem_init spaces"); if (sem_init(&items, 0, 0) == -1) HANDLE_ERROR("sem_init items"); fill_arg.f = fsrc; fill_arg.time = fill_sleep; drain_arg.f = fdst; drain_arg.time = drain_sleep; printf("buffer size = %d\n", CBUF_CAPACITY); cbuf_init(); if (pthread_create(&thread_fill, NULL, fill_func, &fill_arg) != 0) HANDLE_ERROR("pthread_create fill"); if (pthread_create(&thread_drain, NULL, drain_func, &drain_arg) != 0) HANDLE_ERROR("pthread_create drain"); if (pthread_join(thread_fill, NULL) != 0) HANDLE_ERROR("pthread_join fill"); if (pthread_join(thread_drain, NULL) != 0) HANDLE_ERROR("pthread_join drain"); if (sem_destroy(&sem) == -1) HANDLE_ERROR("sem_destroy"); if (sem_destroy(&spaces) == -1) HANDLE_ERROR("sem_destroy spaces"); if (sem_destroy(&items) == -1) HANDLE_ERROR("sem_destroy items"); cbuf_terminate(); fclose(fsrc); fclose(fdst); return 0; }
/* pre: takes in int argc and char** argv command line arguments * post: runs the transfer1 program */ int main(int argc, char** argv) { struct s_threadArgs fillerArgs; struct s_threadArgs drainerArgs; pthread_t fillerThread; pthread_t drainerThread; char* inFile; char* outFile; int fillerWait; int drainerWait; if (argc != 5) { printf("%s\n", usage); exit(0); } inFile = argv[1]; outFile = argv[2]; fillerWait = atoi(argv[3]); drainerWait = atoi(argv[4]); /* setup thread args */ fillerArgs.waitTime = fillerWait; fillerArgs.fileName = inFile; drainerArgs.waitTime = drainerWait; drainerArgs.fileName = outFile; cbuf_init(); if (sem_init(&gl_sem, 0, 1) == -1) printError("unable to initialize semaphore"); printf("buffer size: %d\n", cbuf_space_available()); /* create 2 pthreads for filler and drainer */ if (pthread_create(&fillerThread, NULL, &start_filler, (void *) &fillerArgs)) printError("could not create filler thread"); if (pthread_create(&drainerThread, NULL, &start_drainer, (void *) &drainerArgs)) printError("could not create drainer thread"); #ifdef DEBUG printDebug("[main]\twaiting for threads..."); #endif /* wait for threads */ if (pthread_join(fillerThread, NULL)) printError("could not join filler thread"); if (pthread_join(drainerThread, NULL)) printError("could not join drainer thread"); #ifdef DEBUG printDebug("[main]\tfreeing memory and quitting..."); #endif cbuf_terminate(); if (sem_destroy(&gl_sem) == -1) printError("unable to destroy semaphore"); return 0; }
/* * Runs the transfer3 program. */ int main(int argc, char **argv) { pthread_t fill_thread, drain_thread; /* check if corrent number of command line args given */ if (argc < 5) { printf("\nERROR: Invalid arguments. Use: rw [input file name] [output file name]\n"); exit(-1); } /* get command line args */ env.in_name = argv[1]; env.out_name = argv[2]; env.fill_sleep = atol(argv[3]); env.drain_sleep = atol(argv[4]); printf("fill sleep: %lu\ndrain sleep: %lu\n", (long int)env.fill_sleep, (long int)env.drain_sleep); /* initialize shared buffer */ cbuf_init(); /* initialize mutex and condition vars */ if (pthread_mutex_init(&env.lock, NULL) != 0) { perror("sem_init lock"); exit(-1); } if (pthread_cond_init(&env.data_avail, NULL) != 0) { perror("sem_init data_avail"); exit(-1); } if (pthread_cond_init(&env.space_avail, NULL) != 0) { perror("sem_init space_avail"); exit(-1); } /* create threads */ pthread_create(&fill_thread, NULL, fill_buffer, NULL); pthread_create(&drain_thread, NULL, drain_buffer, NULL); /* join threads */ if (pthread_join(fill_thread, NULL) != 0) { perror("pthread_join fill_thread"); exit(-1); } if (pthread_join(drain_thread, NULL) != 0) { perror("pthread_join drain_thread"); exit(-1); } /* destroy mutex and condition vars once threads are finished */ if (pthread_mutex_destroy(&env.lock) != 0) { perror("sem_destroy lock"); exit(-1); } if (pthread_cond_destroy(&env.data_avail) != 0) { perror("sem_destroy data_avail"); exit(-1); } if (pthread_cond_destroy(&env.space_avail) != 0) { perror("sem_destroy space_avail"); exit(-1); } /* free cbuf */ cbuf_terminate(); return 0; }