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.