Suraj N. Kurapati wrote: > when I tried loading RubyGems inside hello.rb, Ruby gives > an error: > > hello.rb:2:in `require': no such file to load -- rubygems (LoadError) > from hello.rb:2:in `<main>' > > $ cat hello.rb > puts "Hello World!" > require 'rubygems' > puts "rubygems OK!" > > What must I do to initialize rubygems inside the C program? The solution was to use ruby_options() to load the hello.rb file instead of rb_load_file(), as shown below. $ cat main.c #include <stdio.h> #include <pthread.h> #include <ruby.h> pthread_t gRubyThread; pthread_mutex_t gMainLock; // aRubyProgram:: program node for the interpreter to run void* gRubyThread_body(void* aRubyProgram) { printf("Ruby thread is starting interpreter\n"); ruby_run_node(aRubyProgram); printf("Ruby thread is done, waking up C program...\n"); pthread_mutex_unlock(&gMainLock); return NULL; } RUBY_GLOBAL_SETUP int main(int argc, char** argv) { const char* const file = "hello.rb"; // the file to run int fake_argc = 2; char* fake_argv[fake_argc]; fake_argv[0] = "main"; fake_argv[1] = file; // printf("C program is calling ruby_sysinit()\n"); // ruby_sysinit(&fake_argc, &fake_argv); printf("C program is calling RUBY_INIT_STACK()\n"); RUBY_INIT_STACK; printf("C program is calling ruby_init()\n"); ruby_init(); printf("C program is calling ruby_init_loadpath()\n"); ruby_init_loadpath(); printf("Ruby interpreter is loading file: %s\n", file); void* rubyProgram = ruby_options(fake_argc, fake_argv); printf("C program is putting Ruby thread in control...\n"); pthread_mutex_init(&gMainLock, NULL); pthread_mutex_lock(&gMainLock); pthread_create(&gRubyThread, NULL, gRubyThread_body, rubyProgram); pthread_mutex_lock(&gMainLock); // C program blocks here printf("C program is back in control, exiting...\n"); return 0; } However, notice that the call to ruby_sysinit() is commented-out this time. If I uncomment the call to ruby_sysinit(), the program crashes with a segfault. (Maybe because fake_argc is now 2 instead of 0?) Could you please explain: 1. Why does ruby_sysinit() cause a segfault in this program? 2. Why does the program run OK even without ruby_sysinit()? It seems ruby_sysinit() is not 3. Is it safe to "compile" the hello.rb file into a NODE in the main thread and then execute it inside a child thread? Will there be any cross-thread violations by doing this? Thanks for your consideration.