Le 2/5/2005, "(Phil Tomson)" <ptkwt / aracnet.com> a ?crit: >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(); }