8 #define SafeStringValuePtr(v) (rb_string_value(&v), rb_check_safe_obj(v), RSTRING_PTR(v))
17 MEMORY_BASIC_INFORMATION m;
18 memset(&m, 0,
sizeof(m));
19 if( !VirtualQuery(_errno, &m,
sizeof(m)) )
return NULL;
20 return m.AllocationBase;
25 w32_dlclose(
void *ptr)
28 if( ptr == w32_coredll() )
return 0;
30 if( FreeLibrary((HMODULE)ptr) )
return 0;
33 #define dlclose(ptr) w32_dlclose(ptr)
41 dlclose(dlhandle->
ptr);
49 return ptr ?
sizeof(
struct dl_handle) : 0;
70 int ret = dlclose(dlhandle->
ptr);
75 #if defined(HAVE_DLERROR)
108 dlhandle->
ptr = handle;
134 cflag = RTLD_LAZY | RTLD_GLOBAL;
138 cflag = RTLD_LAZY | RTLD_GLOBAL;
145 rb_bug(
"rb_dlhandle_new");
152 HANDLE rb_libruby_handle(
void);
153 ptr = rb_libruby_handle();
162 ptr = dlopen(
"coredll.dll", cflag);
169 ptr = dlopen(clib, cflag);
170 #if defined(HAVE_DLERROR)
171 if( !ptr && (err = dlerror()) ){
182 dlclose(dlhandle->
ptr);
275 if( ! dlhandle->
open ){
283 #define RTLD_NEXT NULL
286 #define RTLD_DEFAULT NULL
307 #if defined(HAVE_DLERROR)
309 # define CHECK_DLERROR if( err = dlerror() ){ func = 0; }
311 # define CHECK_DLERROR
319 func = (void (*)())(
VALUE)dlsym(handle, name);
321 #if defined(FUNC_STDCALL)
324 int len = (int)
strlen(name);
326 #if defined(__CYGWIN__) || defined(_WIN32) || defined(__MINGW32__)
328 char *name_a = (
char*)
xmalloc(len+2);
329 strcpy(name_a, name);
332 name_a[len+1] =
'\0';
333 func = dlsym(handle, name_a);
335 if(
func )
goto found;
339 name_n = (
char*)
xmalloc(len+6);
341 memcpy(name_n, name, len);
343 for( i = 0; i < 256; i += 4 ){
344 sprintf(name_n + len,
"%d", i);
345 func = dlsym(handle, name_n);
349 if(
func )
goto found;
352 for( i = 0; i < 256; i += 4 ){
353 sprintf(name_n + len,
"%d", i);
354 func = dlsym(handle, name_n);
static size_t dlhandle_memsize(const void *ptr)
static VALUE rb_dlhandle_close_enabled_p(VALUE self)
void rb_bug(const char *fmt,...)
size_t strlen(const char *)
void rb_define_singleton_method(VALUE obj, const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a singleton method for obj.
#define TypedData_Get_Struct(obj, type, data_type, sval)
VALUE rb_dlhandle_initialize(int argc, VALUE argv[], VALUE self)
static const rb_data_type_t dlhandle_data_type
VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
Defines a class under the namespace of outer.
void rb_raise(VALUE exc, const char *fmt,...)
VALUE rb_dlhandle_enable_close(VALUE self)
void rb_define_alloc_func(VALUE, rb_alloc_func_t)
VALUE rb_dlhandle_to_i(VALUE self)
int rb_w32_map_errno(DWORD)
int rb_block_given_p(void)
static VALUE dlhandle_sym(void *handle, const char *symbol)
RUBY_EXTERN VALUE rb_cObject
VALUE rb_dlhandle_s_allocate(VALUE klass)
void rb_define_const(VALUE, const char *, VALUE)
#define SafeStringValuePtr(v)
SSL_METHOD *(* func)(void)
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
VALUE rb_dlhandle_s_sym(VALUE self, VALUE sym)
VALUE rb_ensure(VALUE(*b_proc)(ANYARGS), VALUE data1, VALUE(*e_proc)(ANYARGS), VALUE data2)
#define StringValueCStr(v)
VALUE rb_dlhandle_close(VALUE self)
static VALUE predefined_dlhandle(void *handle)
VALUE rb_dlhandle_disable_close(VALUE self)
VALUE rb_dlhandle_sym(VALUE self, VALUE sym)
static void dlhandle_free(void *ptr)
#define TypedData_Make_Struct(klass, type, data_type, sval)
#define STRCASECMP(s1, s2)
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)