module PThreads

For documentation - A C extension that leverages PThreads instead of ruby threads in order to maximize performance

Public Instance Methods

pthreads() click to toggle source
VALUE pthread_test(VALUE self) {

    clock_t begin, end;
    double time_spent;
    // starts clock timer
    begin = clock();

    // setup time information
    time_t rawtime;
    struct tm *timeinfo;

    time ( &rawtime );
    timeinfo = localtime ( &rawtime );
    printf ( "Current local time and date: %s", asctime (timeinfo) );

    // get number of available cores
    int num_threads = get_cpu_count();
    // set number of available cores
    pthread_t threads[num_threads];

    // place to store thread attributes
    pthread_attr_t attr;
    // set actual attributes to joinable
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

    // setup thread ids
    int rc;
    long t;
    void *status;

    // ruby VALUE that becomes our Ruby block
    VALUE p;

    if(rb_block_given_p())
    {
        p = rb_block_proc();
        printf("Block was provided.\n");
    }
    else
    {
        rb_raise(rb_eArgError, "a block is required");
        return Qnil;
    }
        // Acceptable to be outside if/else because we raise an error and return if there is no block given.
    rb_funcall(p, rb_intern("call"), 0);

    for(t = 0; t < num_threads; t++){
        printf("In main: creating thread %ld\n", t);

        // assemble thread arguments
        struct arg_struct thread_args;
        thread_args.threadid = t;

        // create threads and pass function pointer and pointer to arguments for the thread to execute
        rc = pthread_create(&threads[t], &attr, run_block, (void *)&thread_args);
        if (rc){
            printf("ERROR; return code from pthread_create() is %d\n", rc);
            exit(-1);
        }
    }

       // Free attribute and wait for the other threads to finish
       pthread_attr_destroy(&attr);
       for(t=0; t<num_threads; t++) {
          rc = pthread_join(threads[t], &status);
          if (rc) {
             printf("ERROR; return code from pthread_join() is %d\n", rc);
             exit(-1);
             } else {

              printf("Main: completed join with thread %ld having a status of %ld\n",t,(long)status);

          }
       }

    end = clock();
    time_spent = (double)(end - begin) / CLOCKS_PER_SEC;

    VALUE run_time = rb_float_new(time_spent);
    return run_time;
}