[#11890] Ruby and Solaris door library — "Hiro Asari" <asari.ruby@...>

Hi, there. This is my first patch against ruby. I think I followed

19 messages 2007/08/13
[#11892] Re: Ruby and Solaris door library — Daniel Berger <djberg96@...> 2007/08/14

Hiro Asari wrote:

[#11899] pack/unpack 64bit Integers — Hadmut Danisch <hadmut@...>

Hi,

13 messages 2007/08/14
[#11903] Re: pack/unpack 64bit Integers — Brian Candler <B.Candler@...> 2007/08/15

On Wed, Aug 15, 2007 at 06:50:01AM +0900, Hadmut Danisch wrote:

[#11948] Fibers in Ruby 1.9? — David Flanagan <david@...>

I just noticed that my ruby1.9 build of August 17th includes a Fiber

22 messages 2007/08/22
[#11949] Re: Fibers in Ruby 1.9? — Daniel Berger <djberg96@...> 2007/08/22

David Flanagan wrote:

[#11950] Re: Fibers in Ruby 1.9? — "Francis Cianfrocca" <garbagecat10@...> 2007/08/22

On 8/22/07, Daniel Berger <djberg96@gmail.com> wrote:

[#11952] Re: Fibers in Ruby 1.9? — MenTaLguY <mental@...> 2007/08/22

On Wed, 22 Aug 2007 20:50:12 +0900, "Francis Cianfrocca" <garbagecat10@gmail.com> wrote:

[#11988] String#length not working properly in Ruby 1.9 — "Vincent Isambart" <vincent.isambart@...>

I saw that Matz just merged his M17N implementation in the trunk.

17 messages 2007/08/25
[#11991] Re: String#length not working properly in Ruby 1.9 — "Michael Neumann" <mneumann@...> 2007/08/25

On Sat, 25 Aug 2007 10:54:20 +0200, Yukihiro Matsumoto

[#11992] Re: String#length not working properly in Ruby 1.9 — Yukihiro Matsumoto <matz@...> 2007/08/25

Hi,

[#12042] Encodings of string literals; explicit codepoint escapes? — David Flanagan <david@...>

This message contains queries that probably only Matz can answer:

16 messages 2007/08/31
[#12043] Re: Encodings of string literals; explicit codepoint escapes? — Yukihiro Matsumoto <matz@...> 2007/08/31

Hi,

[PATCH] ext/Win32API - Manual FreeLibrary support

From: "Abhisek Datta" <abhisek@...>
Date: 2007-08-07 08:24:41 UTC
List: ruby-core #11854
I think it will be great if Win32API allows manual free'ing of
dynamically loaded libraries instead of waiting for GC to free it.
Attached patch adds free/Free method in Win32API class for manual
FreeLibrary() call.

-abhisek

Attachments (1)

Index: ext/Win32API/Win32API.c
===================================================================
--- ext/Win32API/Win32API.c	(revision 12888)
+++ ext/Win32API/Win32API.c	(working copy)
@@ -27,7 +27,8 @@
 Win32API_FreeLibrary(hdll)
     HINSTANCE hdll;
 {
-    FreeLibrary(hdll);
+    if(hdll)
+        FreeLibrary(hdll);
 }
 
 static VALUE
@@ -154,6 +155,7 @@
     } param;
 #define params param.params
 
+    VALUE obj_dll = rb_iv_get(obj, "__dll__");
     VALUE obj_proc = rb_iv_get(obj, "__proc__");
     VALUE obj_import = rb_iv_get(obj, "__import__");
     VALUE obj_export = rb_iv_get(obj, "__export__");
@@ -161,6 +163,8 @@
     int items = rb_scan_args(argc, argv, "0*", &args);
     int nimport = RARRAY(obj_import)->len;
 
+    if(NIL_P(obj_dll))
+        rb_raise(rb_eRuntimeError, "stale/freed object");
 
     if (items != nimport)
 	rb_raise(rb_eRuntimeError, "wrong number of parameters: expected %d, got %d",
@@ -205,11 +209,34 @@
     }
 }
 
+static VALUE
+Win32API_Free(VALUE self)
+{
+    VALUE v;
+    HINSTANCE hdll;
+
+    v = rb_iv_get(self, "__hdll__");
+    if(NIL_P(v))
+	return Qfalse;
+    
+    Data_Get_Struct(v, HINSTANCE, (HINSTANCE*)hdll);
+    if(!FreeLibrary(hdll)) 
+	rb_raise(rb_eRuntimeError, "failed to free library (error code: %d)", GetLastError());
+	
+    DATA_PTR(v) = NULL;
+    rb_iv_set(self, "__hdll__", Qnil);
+    rb_iv_set(self, "__dll__", Qnil);
+
+    return Qtrue;
+}
+
 void
 Init_Win32API()
 {
     VALUE cWin32API = rb_define_class("Win32API", rb_cObject);
     rb_define_method(cWin32API, "initialize", Win32API_initialize, 4);
     rb_define_method(cWin32API, "call", Win32API_Call, -1);
+    rb_define_method(cWin32API, "free", Win32API_Free, 0);
     rb_define_alias(cWin32API,  "Call", "call");
+    rb_define_alias(cWin32API, "Free", "free");
 }

In This Thread

Prev Next