Le 2/5/2005, "(Phil Tomson)" <ptkwt / aracnet.com> a ˝─rit:
>Instead of embedding Ruby into a C program with a main() function I want
>to embed Ruby in a C library.  The library is then linked with some other
>code which has a main() function.  Here's my C code:
>
>//begin C code
>#include <ruby.h>
>
>static VALUE
>protected_require()
>{   //TODO: for testing only, add protection later
>    return rb_require("foo.rb");
>}
>static int initialized = 0;
>
>static VALUE summer ;
>
>static  initialize_ruby()
>{
>  if (!initialized)  //only initialize once
>  {
>    int value;
>    ruby_init();
>    ruby_init_loadpath();
>    ruby_script("embedded");
>    rb_protect(protected_require, Qnil, &value);
>    if (value) {
>      VALUE err = rb_inspect(rb_gv_get("$!"));
>      fprintf(stderr, "ERR %s\n", StringValuePtr(err));
>    }
>    summer = rb_class_new_instance(0,0,
>rb_const_get(rb_cObject,rb_intern("Summer")));
>    initialized = 1;
>  }
>}

You may want to employ some sort of a file lock for concurrency
if this is to be a shared library. I am not sure how the interpreter
would behave there.

>int sum(int max)
>{
>  initialize_ruby();
>  int id_sum = rb_intern("sum");
>  VALUE result = rb_funcall(summer, id_sum,1,INT2NUM(max));
>  //ruby_finalize(); //seems to work OK without it
>  return NUM2INT(result);
>}
>
>int foo(int max)
>{
>  initialize_ruby();
>  int id_foo = rb_intern("foo");
>  VALUE result = rb_funcall(summer, id_foo,1,INT2NUM(max));
>  //ruby_finalize(); //seems to work OK without it
>  return NUM2INT(result);
>
>}
>
>//end C code
>
>So I keep track of whether or not ruby has been initialized.  Each of the
>functions in the library calls the initialize_ruby() function first
>thing.  initialize_ruby() only really initializes ruby the first time
>(in order to save some time - I don't want to have to startup ruby for
>every function call and then finalize ruby at the end of each function
>call).  Since I don't know what the last call to the function library
>might be, I don't call ruby_finalize() in any of the library functions.
>I used to do this, but eliminating the ruby_finalize() call seems to have
>no ill-effects.  What are the consequences of not calling ruby_finalize()?
>
>Phil

E

--
template<typename duck>
void quack(duck& d) { d.quack(); }