17 MEMORY_BASIC_INFORMATION m;
18 memset(&m, 0,
sizeof(m));
19 if( !VirtualQuery(_errno, &m,
sizeof(m)) )
return NULL;
20 return m.AllocationBase;
28 if(
ptr == w32_coredll() )
return 0;
30 if( FreeLibrary((HMODULE)
ptr) )
return 0;
33#define dlclose(ptr) w32_dlclose(ptr)
37fiddle_handle_free(
void *
ptr)
41 dlclose(fiddle_handle->
ptr);
47fiddle_handle_memsize(
const void *
ptr)
54 {0, fiddle_handle_free, fiddle_handle_memsize,},
65rb_fiddle_handle_close(
VALUE self)
70 if(fiddle_handle->
open) {
71 int ret = dlclose(fiddle_handle->
ptr);
72 fiddle_handle->
open = 0;
76#if defined(HAVE_DLERROR)
90rb_fiddle_handle_s_allocate(
VALUE klass)
96 fiddle_handle->
ptr = 0;
97 fiddle_handle->
open = 0;
104predefined_fiddle_handle(
void *handle)
109 fiddle_handle->
ptr = handle;
110 fiddle_handle->
open = 1;
143 cflag = RTLD_LAZY | RTLD_GLOBAL;
147 cflag = RTLD_LAZY | RTLD_GLOBAL;
154 rb_bug(
"rb_fiddle_handle_new");
159 HANDLE rb_libruby_handle(
void);
160 ptr = rb_libruby_handle();
169 ptr = dlopen(
"coredll.dll", cflag);
177 ptr = dlopen(clib, cflag);
178#if defined(HAVE_DLERROR)
179 if( !
ptr && (
err = dlerror()) ){
190 dlclose(fiddle_handle->
ptr);
193 fiddle_handle->
open = 1;
209rb_fiddle_handle_enable_close(
VALUE self)
224rb_fiddle_handle_disable_close(
VALUE self)
241rb_fiddle_handle_close_enabled_p(
VALUE self)
257rb_fiddle_handle_to_i(
VALUE self)
265static VALUE fiddle_handle_sym(
void *handle,
VALUE symbol);
280 if( ! fiddle_handle->
open ){
284 return fiddle_handle_sym(fiddle_handle->
ptr,
sym);
288#define RTLD_NEXT NULL
291#define RTLD_DEFAULT NULL
311fiddle_handle_sym(
void *handle,
VALUE symbol)
313#if defined(HAVE_DLERROR)
315# define CHECK_DLERROR if ((err = dlerror()) != 0) { func = 0; }
317# define CHECK_DLERROR
325 func = (void (*)())(
VALUE)dlsym(handle,
name);
327#if defined(FUNC_STDCALL)
332#if defined(__CYGWIN__) || defined(_WIN32) || defined(__MINGW32__)
335 strcpy(name_a,
name);
338 name_a[
len+1] =
'\0';
339 func = dlsym(handle, name_a);
341 if( func )
goto found;
349 for( i = 0; i < 256; i += 4 ){
350 sprintf(name_n +
len,
"%d", i);
351 func = dlsym(handle, name_n);
355 if( func )
goto found;
358 for( i = 0; i < 256; i += 4 ){
359 sprintf(name_n +
len,
"%d", i);
360 func = dlsym(handle, name_n);
#define rb_define_method(klass, mid, func, arity)
Defines klass#mid.
#define rb_define_singleton_method(klass, mid, func, arity)
Defines klass.mid.
VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
Defines a class under the namespace of outer.
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
int rb_block_given_p(void)
Determines if the current method is given a block.
void rb_raise(VALUE exc, const char *fmt,...)
void rb_bug(const char *fmt,...)
VALUE rb_ensure(VALUE(*b_proc)(VALUE), VALUE data1, VALUE(*e_proc)(VALUE), VALUE data2)
An equivalent to ensure clause.
VALUE rb_cObject
Object class.
void Init_fiddle_handle(void)
void rb_define_alloc_func(VALUE, rb_alloc_func_t)
void rb_define_const(VALUE, const char *, VALUE)
typedef int(ZCALLBACK *close_file_func) OF((voidpf opaque
#define StringValueCStr(v)
#define TypedData_Get_Struct(obj, type, data_type, sval)
#define TypedData_Make_Struct(klass, type, data_type, sval)
size_t strlen(const char *)
int rb_w32_map_errno(DWORD)