summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--include/ruby/intern.h1
-rw-r--r--io.c9
-rw-r--r--thread.c9
4 files changed, 20 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index e41ed575b8..6d1dfbf3a0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Tue Sep 23 17:14:31 2008 Koichi Sasada <ko1@atdot.net>
+
+ * thread.c, include/ruby/intern.h (rb_thread_interrupted): added.
+
+ * io.c: use VALUE of thead instead of rb_tread_t to check interrupts.
+
Tue Sep 23 17:05:14 2008 Koichi Sasada <ko1@atdot.net>
* class.c, vm_core.h: move decl of rb_iseq_clone() to class.c.
diff --git a/include/ruby/intern.h b/include/ruby/intern.h
index 105ca62bde..5f6882d56a 100644
--- a/include/ruby/intern.h
+++ b/include/ruby/intern.h
@@ -659,6 +659,7 @@ VALUE rb_struct_define_without_accessor(const char *, VALUE, rb_alloc_func_t, ..
typedef void rb_unblock_function_t(void *);
typedef VALUE rb_blocking_function_t(void *);
void rb_thread_check_ints(void);
+int rb_thread_interrupted(VALUE thval);
VALUE rb_thread_blocking_region(rb_blocking_function_t *func, void *data1,
rb_unblock_function_t *ubf, void *data2);
#define RUBY_UBF_IO ((rb_unblock_function_t *)-1)
diff --git a/io.c b/io.c
index 2ea192cf4c..e457668788 100644
--- a/io.c
+++ b/io.c
@@ -13,7 +13,6 @@
#include "ruby/ruby.h"
#include "ruby/io.h"
-#include "vm_core.h"
#include <ctype.h>
#include <errno.h>
@@ -6979,7 +6978,7 @@ struct copy_stream_struct {
int error_no;
const char *notimp;
rb_fdset_t fds;
- rb_thread_t *th;
+ VALUE th;
};
static int
@@ -7107,7 +7106,7 @@ copy_stream_sendfile(struct copy_stream_struct *stp)
#endif
if (copy_stream_wait_write(stp) == -1)
return -1;
- if (RUBY_VM_INTERRUPTED(stp->th))
+ if (rb_thread_interrupted(stp->th))
return -1;
goto retry_sendfile;
}
@@ -7237,7 +7236,7 @@ copy_stream_read_write(struct copy_stream_struct *stp)
if (!use_eof)
copy_length -= ss;
- if (RUBY_VM_INTERRUPTED(stp->th))
+ if (rb_thread_interrupted(stp->th))
return;
}
}
@@ -7340,7 +7339,7 @@ copy_stream_body(VALUE arg)
rb_io_t *src_fptr = 0, *dst_fptr = 0;
int src_fd, dst_fd;
- stp->th = GET_THREAD();
+ stp->th = rb_thread_current();
stp->total = 0;
diff --git a/thread.c b/thread.c
index 9b0a91ee7b..7416fabb25 100644
--- a/thread.c
+++ b/thread.c
@@ -899,6 +899,15 @@ rb_thread_check_trap_pending(void)
return GET_THREAD()->exec_signal != 0;
}
+/* This function can be called in blocking region. */
+int
+rb_thread_interrupted(VALUE thval)
+{
+ rb_thread_t *th;
+ GetThreadPtr(thval, th);
+ return RUBY_VM_INTERRUPTED(th);
+}
+
struct timeval rb_time_timeval();
void