P
Phil Tomson
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;
}
}
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
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;
}
}
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