summaryrefslogtreecommitdiff
path: root/bignum.c
diff options
context:
space:
mode:
authorkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-11-26 06:49:48 +0000
committerkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-11-26 06:49:48 +0000
commit6f3ad9bd3d1c0fd53539d55743b445d67360e911 (patch)
tree00e0844b8abbfc03ad25372852a12379e0c28e9d /bignum.c
parente4b54208d0e98677db83b92a458be6847258e54c (diff)
* 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37849 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'bignum.c')
-rw-r--r--bignum.c8
1 files changed, 4 insertions, 4 deletions
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);