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