Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
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;
}