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;
}