summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--bignum.c8
2 files changed, 11 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index f2125783ab..48d5e9cbf7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Mon Nov 26 15:33:02 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * bignum.c (big_div_struct): added volatile to 'stop' member.
+ Otherwise, "if (bds->stop)" check in bigdivrem1 don't read
+ memory and ignore interrupt.
+ * bignum.c (bigdivrem, rb_big_stop): ditto.
+
Mon Nov 26 12:11:09 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* win32/Makefile.sub (DLNOBJ): missing in r37821.
diff --git a/bignum.c b/bignum.c
index 97be53faf1..8939282ebf 100644
--- a/bignum.c
+++ b/bignum.c
@@ -2657,7 +2657,7 @@ rb_big_mul(VALUE x, VALUE y)
struct big_div_struct {
long nx, ny;
BDIGIT *yds, *zds;
- VALUE stop;
+ volatile VALUE stop;
};
static void *
@@ -2708,8 +2708,8 @@ bigdivrem1(void *ptr)
static void
rb_big_stop(void *ptr)
{
- VALUE *stop = (VALUE*)ptr;
- *stop = Qtrue;
+ struct big_div_struct *bds = ptr;
+ bds->stop = Qtrue;
}
static VALUE
@@ -2794,7 +2794,7 @@ bigdivrem(VALUE x, VALUE y, volatile VALUE *divp, volatile VALUE *modp)
bds.yds = yds;
bds.stop = Qfalse;
if (nx > 10000 || ny > 10000) {
- rb_thread_call_without_gvl(bigdivrem1, &bds, rb_big_stop, &bds.stop);
+ rb_thread_call_without_gvl(bigdivrem1, &bds, rb_big_stop, &bds);
}
else {
bigdivrem1(&bds);