[#30995] [Bug #3523] win32 exception c0000029 on exit using fibers — B Kelly <redmine@...>

Bug #3523: win32 exception c0000029 on exit using fibers

19 messages 2010/07/02

[#31100] [rubysoc] Queue C-extension patch to come — Ricardo Panaggio <panaggio.ricardo@...>

Hello,

26 messages 2010/07/07
[#31148] Re: [rubysoc] Queue C-extension patch to come — Roger Pack <rogerdpack2@...> 2010/07/09

> As this it my first patch to Ruby, I don't know where to begin with.

[#31320] Re: [rubysoc] Queue C-extension patch to come — Ricardo Panaggio <panaggio.ricardo@...> 2010/07/16

Sorry for leaving this thread for so long. I've tried to finish the

[#31322] Re: [rubysoc] Queue C-extension patch to come — Aaron Patterson <aaron@...> 2010/07/16

On Sat, Jul 17, 2010 at 06:55:35AM +0900, Ricardo Panaggio wrote:

[#31324] Re: [rubysoc] Queue C-extension patch to come — Caleb Clausen <vikkous@...> 2010/07/17

NB: I am Ricardo's mentor for this project.

[#31331] Re: [rubysoc] Queue C-extension patch to come — Benoit Daloze <eregontp@...> 2010/07/17

On 17 July 2010 06:00, Caleb Clausen <vikkous@gmail.com> wrote:

[#31332] Re: [rubysoc] Queue C-extension patch to come — Caleb Clausen <vikkous@...> 2010/07/17

On 7/17/10, Benoit Daloze <eregontp@gmail.com> wrote:

[#31138] Why is there no standard way of creating a String from a char *? — Nikolai Weibull <now@...>

Hi!

14 messages 2010/07/08
[#31146] Re: Why is there no standard way of creating a String from a char *? — Urabe Shyouhei <shyouhei@...> 2010/07/09

(2010/07/09 7:04), Nikolai Weibull wrote:

[#31149] Re: Why is there no standard way of creating a String from a char *? — Nikolai Weibull <now@...> 2010/07/09

On Fri, Jul 9, 2010 at 06:20, Urabe Shyouhei <shyouhei@ruby-lang.org> wrote:

[#31150] Re: Why is there no standard way of creating a String from a char *? — Urabe Shyouhei <shyouhei@...> 2010/07/09

(2010/07/09 18:28), Nikolai Weibull wrote:

[#31217] [Bug #3562] regression in respond_to? — Aaron Patterson <redmine@...>

Bug #3562: regression in respond_to?

14 messages 2010/07/12

[#31269] [Bug #3566] memory leak when spawning+joining Threads in a loop — Eric Wong <redmine@...>

Bug #3566: memory leak when spawning+joining Threads in a loop

14 messages 2010/07/13

[#31399] [Backport #3595] Theres no encoding to differentiate a stream of Binary data from an 8-Bit ASCII string — Dreamcat Four <redmine@...>

Backport #3595: Theres no encoding to differentiate a stream of Binary data from an 8-Bit ASCII string

17 messages 2010/07/21

[#31459] [Bug #3607] [trunk/r28731] Gem.path has disappeared? — Ollivier Robert <redmine@...>

Bug #3607: [trunk/r28731] Gem.path has disappeared?

22 messages 2010/07/23

[#31519] [Bug #3622] Net::HTTP does not wait to send request body with Expect: 100-continue — Eric Hodel <redmine@...>

Bug #3622: Net::HTTP does not wait to send request body with Expect: 100-continue

9 messages 2010/07/28

[ruby-core:31307] Re: [Bug #3523][Assigned] win32 exception c0000029 on exit using fibers

From: "U.Nakamura" <usa@...>
Date: 2010-07-16 03:57:36 UTC
List: ruby-core #31307
Hello,

> http://redmine.ruby-lang.org/issues/show/3523

Interim report:

There is a patch for ruby_1_9_2, to save and restore SEH frame.
After this patch is applied, Bill's 0xC0000029 error vanishes!

... But another error 0xC0000374 occurs.
This error means heap corruption.
I cannot confirm yet whether this error is due to ruby or EventMachine.

Index: cont.c
===================================================================
--- cont.c	(revision 28653)
+++ cont.c	(working copy)
@@ -39,6 +39,9 @@ typedef struct rb_context_struct {
     VALUE *machine_register_stack_src;
     int machine_register_stack_size;
 #endif
+#if _WIN32 && (defined(_M_IX86) || defined(__i386__))
+    VALUE win32_exception_list;
+#endif
     rb_thread_t saved_thread;
     rb_jmpbuf_t jmpbuf;
     size_t machine_stack_size;
@@ -224,6 +227,44 @@ fiber_memsize(const void *ptr)
     return 0;
 }
 
+#if _WIN32 && (defined(_M_IX86) || defined(__i386__))
+static inline VALUE
+win32_get_exception_list(void)
+{
+    VALUE p;
+# if defined _MSC_VER
+#   ifdef _M_IX86
+#   if _MSC_VER >= 1310
+      /* warning: unsafe assignment to fs:0 ... this is ok */
+#     pragma warning(disable: 4733)
+#   endif
+    __asm mov eax, fs:[0];
+    __asm mov p, eax;
+#   endif
+# elif defined __GNUC__
+#   ifdef __i386__
+    __asm__("movl %%fs:0,%0" : "=r"(p));
+#   endif
+# endif
+    return p;
+}
+
+static inline void
+win32_set_exception_list(VALUE p)
+{
+# if defined _MSC_VER
+#   ifdef _M_IX86
+    __asm mov eax, p;
+    __asm mov fs:[0], eax;
+#   endif
+# elif defined __GNUC__
+#   ifdef __i386__
+    __asm__("movl %0,%%fs:0" :: "r"(p));
+#   endif
+# endif
+}
+#endif
+
 static void
 cont_save_machine_stack(rb_thread_t *th, rb_context_t *cont)
 {
@@ -267,6 +308,9 @@ cont_save_machine_stack(rb_thread_t *th,
 
     MEMCPY(cont->machine_register_stack, cont->machine_register_stack_src, VALUE, size);
 #endif
+#if _WIN32 && (defined(_M_IX86) || defined(__i386__))
+    cont->win32_exception_list = win32_get_exception_list();
+#endif
 
     sth->machine_stack_start = sth->machine_stack_end = 0;
 #ifdef __ia64
@@ -403,6 +447,9 @@ cont_restore_1(rb_context_t *cont)
     }
 #endif
     if (cont->machine_stack_src) {
+#if _WIN32 && (defined(_M_IX86) || defined(__i386__))
+	win32_set_exception_list(cont->win32_exception_list);
+#endif
 	FLUSH_REGISTER_WINDOWS;
 	MEMCPY(cont->machine_stack_src, cont->machine_stack,
 	       VALUE, cont->machine_stack_size);

Regards,
-- 
U.Nakamura <usa@garbagecollect.jp>


In This Thread