summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--bignum.c9
-rw-r--r--common.mk13
-rw-r--r--ext/curses/curses.c25
-rw-r--r--ext/curses/depend2
-rw-r--r--ext/openssl/ossl.h1
-rw-r--r--ext/openssl/ossl_pkey_dh.c6
-rw-r--r--ext/openssl/ossl_pkey_dsa.c6
-rw-r--r--ext/openssl/ossl_pkey_rsa.c6
-rw-r--r--ext/socket/ancdata.c12
-rw-r--r--ext/socket/depend2
-rw-r--r--ext/socket/raddrinfo.c20
-rw-r--r--ext/socket/rubysocket.h1
-rw-r--r--ext/zlib/zlib.c7
-rw-r--r--gc.c1
-rw-r--r--include/ruby/intern.h1
-rw-r--r--include/ruby/thread.h43
-rw-r--r--internal.h10
-rw-r--r--io.c14
-rw-r--r--process.c9
-rw-r--r--thread.c17
21 files changed, 134 insertions, 80 deletions
diff --git a/ChangeLog b/ChangeLog
index 0019976..763393e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Tue Jul 10 22:57:03 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/thread.h: new header file for thread stuff.
+
+ * thread.c (rb_thread_call_without_gvl): export. [Feature#4328]
+ returns void* instead of VALUE. [Feature #5543]
+
+ * thread.c (rb_thread_blocking_region): deprecate. [ruby-core:46295]
+
Tue Jul 10 10:48:59 2012 NAKAMURA Usaku <usa@ruby-lang.org>
* include/ruby/win32.h (NT, NtInitialize): removed unused old macros.
diff --git a/bignum.c b/bignum.c
index 3551f4f..d658ce8 100644
--- a/bignum.c
+++ b/bignum.c
@@ -10,6 +10,7 @@
**********************************************************************/
#include "ruby/ruby.h"
+#include "ruby/thread.h"
#include "ruby/util.h"
#include "internal.h"
@@ -2591,7 +2592,7 @@ struct big_div_struct {
VALUE stop;
};
-static VALUE
+static void *
bigdivrem1(void *ptr)
{
struct big_div_struct *bds = (struct big_div_struct*)ptr;
@@ -2605,7 +2606,7 @@ bigdivrem1(void *ptr)
j = nx==ny?nx+1:nx;
for (nyzero = 0; !yds[nyzero]; nyzero++);
do {
- if (bds->stop) return Qnil;
+ if (bds->stop) return 0;
if (zds[j] == yds[ny-1]) q = (BDIGIT)BIGRAD-1;
else q = (BDIGIT)((BIGUP(zds[j]) + zds[j-1])/yds[ny-1]);
if (q) {
@@ -2633,7 +2634,7 @@ bigdivrem1(void *ptr)
}
zds[j] = q;
} while (--j >= ny);
- return Qnil;
+ return 0;
}
static void
@@ -2725,7 +2726,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_blocking_region(bigdivrem1, &bds, rb_big_stop, &bds.stop);
+ rb_thread_call_without_gvl(bigdivrem1, &bds, rb_big_stop, &bds.stop);
}
else {
bigdivrem1(&bds);
diff --git a/common.mk b/common.mk
index 674aea7..15c9b3f 100644
--- a/common.mk
+++ b/common.mk
@@ -616,7 +616,7 @@ addr2line.$(OBJEXT): {$(VPATH)}addr2line.c {$(VPATH)}addr2line.h {$(VPATH)}confi
array.$(OBJEXT): {$(VPATH)}array.c $(RUBY_H_INCLUDES) {$(VPATH)}util.h \
$(ENCODING_H_INCLUDES) {$(VPATH)}internal.h
bignum.$(OBJEXT): {$(VPATH)}bignum.c $(RUBY_H_INCLUDES) {$(VPATH)}util.h \
- {$(VPATH)}internal.h
+ {$(VPATH)}thread.h {$(VPATH)}internal.h
class.$(OBJEXT): {$(VPATH)}class.c $(RUBY_H_INCLUDES) \
$(VM_CORE_H_INCLUDES) {$(VPATH)}debug.h {$(VPATH)}internal.h \
{$(VPATH)}constant.h
@@ -658,13 +658,15 @@ file.$(OBJEXT): {$(VPATH)}file.c $(RUBY_H_INCLUDES) {$(VPATH)}io.h \
gc.$(OBJEXT): {$(VPATH)}gc.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
{$(VPATH)}regex.h $(ENCODING_H_INCLUDES) $(VM_CORE_H_INCLUDES) \
{$(VPATH)}gc.h {$(VPATH)}io.h {$(VPATH)}eval_intern.h {$(VPATH)}util.h \
- {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h
+ {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h \
+ {$(VPATH)}thread.h
hash.$(OBJEXT): {$(VPATH)}hash.c $(RUBY_H_INCLUDES) {$(VPATH)}util.h \
$(ENCODING_H_INCLUDES)
inits.$(OBJEXT): {$(VPATH)}inits.c $(RUBY_H_INCLUDES) \
{$(VPATH)}internal.h
io.$(OBJEXT): {$(VPATH)}io.c $(RUBY_H_INCLUDES) {$(VPATH)}io.h \
- {$(VPATH)}util.h $(ENCODING_H_INCLUDES) {$(VPATH)}dln.h {$(VPATH)}internal.h
+ {$(VPATH)}util.h $(ENCODING_H_INCLUDES) {$(VPATH)}dln.h \
+ {$(VPATH)}internal.h {$(VPATH)}thread.h
main.$(OBJEXT): {$(VPATH)}main.c $(RUBY_H_INCLUDES) {$(VPATH)}debug.h \
{$(VPATH)}node.h
marshal.$(OBJEXT): {$(VPATH)}marshal.c $(RUBY_H_INCLUDES) {$(VPATH)}io.h \
@@ -690,7 +692,8 @@ proc.$(OBJEXT): {$(VPATH)}proc.c {$(VPATH)}eval_intern.h \
{$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}iseq.h
process.$(OBJEXT): {$(VPATH)}process.c $(RUBY_H_INCLUDES) \
{$(VPATH)}util.h {$(VPATH)}io.h $(ENCODING_H_INCLUDES) {$(VPATH)}dln.h \
- $(VM_CORE_H_INCLUDES) {$(VPATH)}debug.h {$(VPATH)}internal.h
+ $(VM_CORE_H_INCLUDES) {$(VPATH)}debug.h {$(VPATH)}internal.h \
+ {$(VPATH)}thread.h
random.$(OBJEXT): {$(VPATH)}random.c $(RUBY_H_INCLUDES)
range.$(OBJEXT): {$(VPATH)}range.c $(RUBY_H_INCLUDES) \
$(ENCODING_H_INCLUDES) {$(VPATH)}internal.h
@@ -730,7 +733,7 @@ struct.$(OBJEXT): {$(VPATH)}struct.c $(RUBY_H_INCLUDES) {$(VPATH)}internal.h
thread.$(OBJEXT): {$(VPATH)}thread.c {$(VPATH)}eval_intern.h \
$(RUBY_H_INCLUDES) {$(VPATH)}gc.h $(VM_CORE_H_INCLUDES) \
{$(VPATH)}debug.h {$(VPATH)}thread_$(THREAD_MODEL).c $(ENCODING_H_INCLUDES) \
- {$(VPATH)}internal.h {$(VPATH)}io.h
+ {$(VPATH)}internal.h {$(VPATH)}io.h {$(VPATH)}thread.h
transcode.$(OBJEXT): {$(VPATH)}transcode.c $(RUBY_H_INCLUDES) \
$(ENCODING_H_INCLUDES) {$(VPATH)}transcode_data.h {$(VPATH)}internal.h
cont.$(OBJEXT): {$(VPATH)}cont.c $(RUBY_H_INCLUDES) \
diff --git a/ext/curses/curses.c b/ext/curses/curses.c
index 6a12808..b99fb96 100644
--- a/ext/curses/curses.c
+++ b/ext/curses/curses.c
@@ -18,6 +18,7 @@
#include "ruby.h"
#include "ruby/io.h"
+#include "ruby/thread.h"
#if defined(HAVE_NCURSES_H)
# include <ncurses.h>
@@ -634,12 +635,12 @@ curses_addstr(VALUE obj, VALUE str)
return Qnil;
}
-static VALUE
+static void *
getch_func(void *arg)
{
int *ip = (int *)arg;
*ip = getch();
- return Qnil;
+ return 0;
}
/*
@@ -656,7 +657,7 @@ curses_getch(VALUE obj)
int c;
curses_stdscr();
- rb_thread_blocking_region(getch_func, (void *)&c, RUBY_UBF_IO, 0);
+ rb_thread_call_without_gvl(getch_func, &c, RUBY_UBF_IO, 0);
if (c == EOF) return Qnil;
if (rb_isprint(c)) {
char ch = (char)c;
@@ -669,7 +670,7 @@ curses_getch(VALUE obj)
/* This should be big enough.. I hope */
#define GETSTR_BUF_SIZE 1024
-static VALUE
+static void *
getstr_func(void *arg)
{
char *rtn = (char *)arg;
@@ -678,7 +679,7 @@ getstr_func(void *arg)
#else
getstr(rtn);
#endif
- return Qnil;
+ return 0;
}
/*
@@ -693,7 +694,7 @@ curses_getstr(VALUE obj)
char rtn[GETSTR_BUF_SIZE];
curses_stdscr();
- rb_thread_blocking_region(getstr_func, (void *)rtn, RUBY_UBF_IO, 0);
+ rb_thread_call_without_gvl(getstr_func, rtn, RUBY_UBF_IO, 0);
return rb_locale_str_new_cstr(rtn);
}
@@ -1955,12 +1956,12 @@ struct wgetch_arg {
int c;
};
-static VALUE
+static void *
wgetch_func(void *_arg)
{
struct wgetch_arg *arg = (struct wgetch_arg *)_arg;
arg->c = wgetch(arg->win);
- return Qnil;
+ return 0;
}
/*
@@ -1980,7 +1981,7 @@ window_getch(VALUE obj)
GetWINDOW(obj, winp);
arg.win = winp->window;
- rb_thread_blocking_region(wgetch_func, (void *)&arg, RUBY_UBF_IO, 0);
+ rb_thread_call_without_gvl(wgetch_func, (void *)&arg, RUBY_UBF_IO, 0);
c = arg.c;
if (c == EOF) return Qnil;
if (rb_isprint(c)) {
@@ -1996,7 +1997,7 @@ struct wgetstr_arg {
char rtn[GETSTR_BUF_SIZE];
};
-static VALUE
+static void *
wgetstr_func(void *_arg)
{
struct wgetstr_arg *arg = (struct wgetstr_arg *)_arg;
@@ -2005,7 +2006,7 @@ wgetstr_func(void *_arg)
#else
wgetstr(arg->win, arg->rtn);
#endif
- return Qnil;
+ return 0;
}
/*
@@ -2022,7 +2023,7 @@ window_getstr(VALUE obj)
GetWINDOW(obj, winp);
arg.win = winp->window;
- rb_thread_blocking_region(wgetstr_func, (void *)&arg, RUBY_UBF_IO, 0);
+ rb_thread_call_without_gvl(wgetstr_func, (void *)&arg, RUBY_UBF_IO, 0);
return rb_locale_str_new_cstr(arg.rtn);
}
diff --git a/ext/curses/depend b/ext/curses/depend
index ecb79e5..66742b7 100644
--- a/ext/curses/depend
+++ b/ext/curses/depend
@@ -1 +1 @@
-curses.o: curses.c $(hdrdir)/ruby.h $(topdir)/config.h $(hdrdir)/defines.h
+curses.o: curses.c $(hdrdir)/ruby.h $(topdir)/config.h $(hdrdir)/defines.h $(hdrdir)/thread.h
diff --git a/ext/openssl/ossl.h b/ext/openssl/ossl.h
index f8023bc..88e4506 100644
--- a/ext/openssl/ossl.h
+++ b/ext/openssl/ossl.h
@@ -30,6 +30,7 @@ extern "C" {
#endif
#include <ruby.h>
#include <ruby/io.h>
+#include <ruby/thread.h>
/*
* Check the OpenSSL version
diff --git a/ext/openssl/ossl_pkey_dh.c b/ext/openssl/ossl_pkey_dh.c
index 819fbce..c8fb40e 100644
--- a/ext/openssl/ossl_pkey_dh.c
+++ b/ext/openssl/ossl_pkey_dh.c
@@ -90,12 +90,12 @@ struct dh_blocking_gen_arg {
int result;
};
-static VALUE
+static void *
dh_blocking_gen(void *arg)
{
struct dh_blocking_gen_arg *gen = (struct dh_blocking_gen_arg *)arg;
gen->result = DH_generate_parameters_ex(gen->dh, gen->size, gen->gen, gen->cb);
- return Qnil;
+ return 0;
}
#endif
@@ -123,7 +123,7 @@ dh_generate(int size, int gen)
dh_blocking_gen(&gen_arg);
} else {
/* there's a chance to unblock */
- rb_thread_blocking_region(dh_blocking_gen, &gen_arg, ossl_generate_cb_stop, &cb_arg);
+ rb_thread_call_without_gvl(dh_blocking_gen, &gen_arg, ossl_generate_cb_stop, &cb_arg);
}
if (!gen_arg.result) {
diff --git a/ext/openssl/ossl_pkey_dsa.c b/ext/openssl/ossl_pkey_dsa.c
index d3e91f0..ba28ba0 100644
--- a/ext/openssl/ossl_pkey_dsa.c
+++ b/ext/openssl/ossl_pkey_dsa.c
@@ -87,12 +87,12 @@ struct dsa_blocking_gen_arg {
int result;
};
-static VALUE
+static void *
dsa_blocking_gen(void *arg)
{
struct dsa_blocking_gen_arg *gen = (struct dsa_blocking_gen_arg *)arg;
gen->result = DSA_generate_parameters_ex(gen->dsa, gen->size, gen->seed, gen->seed_len, gen->counter, gen->h, gen->cb);
- return Qnil;
+ return 0;
}
#endif
@@ -130,7 +130,7 @@ dsa_generate(int size)
dsa_blocking_gen(&gen_arg);
} else {
/* there's a chance to unblock */
- rb_thread_blocking_region(dsa_blocking_gen, &gen_arg, ossl_generate_cb_stop, &cb_arg);
+ rb_thread_call_without_gvl(dsa_blocking_gen, &gen_arg, ossl_generate_cb_stop, &cb_arg);
}
if (!gen_arg.result) {
DSA_free(dsa);
diff --git a/ext/openssl/ossl_pkey_rsa.c b/ext/openssl/ossl_pkey_rsa.c
index 3fbd87f..e395e71 100644
--- a/ext/openssl/ossl_pkey_rsa.c
+++ b/ext/openssl/ossl_pkey_rsa.c
@@ -85,12 +85,12 @@ struct rsa_blocking_gen_arg {
int result;
};
-static VALUE
+static void *
rsa_blocking_gen(void *arg)
{
struct rsa_blocking_gen_arg *gen = (struct rsa_blocking_gen_arg *)arg;
gen->result = RSA_generate_key_ex(gen->rsa, gen->size, gen->e, gen->cb);
- return Qnil;
+ return 0;
}
#endif
@@ -133,7 +133,7 @@ rsa_generate(int size, unsigned long exp)
rsa_blocking_gen(&gen_arg);
} else {
/* there's a chance to unblock */
- rb_thread_blocking_region(rsa_blocking_gen, &gen_arg, ossl_generate_cb_stop, &cb_arg);
+ rb_thread_call_without_gvl(rsa_blocking_gen, &gen_arg, ossl_generate_cb_stop, &cb_arg);
}
if (!gen_arg.result) {
BN_free(e);
diff --git a/ext/socket/ancdata.c b/ext/socket/ancdata.c
index 52f92a1..5af090c 100644
--- a/ext/socket/ancdata.c
+++ b/ext/socket/ancdata.c
@@ -1110,11 +1110,11 @@ struct sendmsg_args_struct {
int flags;
};
-static VALUE
+static void *
nogvl_sendmsg_func(void *ptr)
{
struct sendmsg_args_struct *args = ptr;
- return sendmsg(args->fd, args->msg, args->flags);
+ return (void *)sendmsg(args->fd, args->msg, args->flags);
}
static ssize_t
@@ -1124,7 +1124,7 @@ rb_sendmsg(int fd, const struct msghdr *msg, int flags)
args.fd = fd;
args.msg = msg;
args.flags = flags;
- return rb_thread_blocking_region(nogvl_sendmsg_func, &args, RUBY_UBF_IO, 0);
+ return (ssize_t)rb_thread_call_without_gvl(nogvl_sendmsg_func, &args, RUBY_UBF_IO, 0);
}
static VALUE
@@ -1368,12 +1368,12 @@ rsock_recvmsg(int socket, struct msghdr *message, int flags)
return recvmsg(socket, message, flags);
}
-static VALUE
+static void *
nogvl_recvmsg_func(void *ptr)
{
struct recvmsg_args_struct *args = ptr;
int flags = args->flags;
- return rsock_recvmsg(args->fd, args->msg, flags);
+ return (void *)rsock_recvmsg(args->fd, args->msg, flags);
}
static ssize_t
@@ -1383,7 +1383,7 @@ rb_recvmsg(int fd, struct msghdr *msg, int flags)
args.fd = fd;
args.msg = msg;
args.flags = flags;
- return rb_thread_blocking_region(nogvl_recvmsg_func, &args, RUBY_UBF_IO, 0);
+ return (ssize_t)rb_thread_call_without_gvl(nogvl_recvmsg_func, &args, RUBY_UBF_IO, 0);
}
#if defined(HAVE_ST_MSG_CONTROL)
diff --git a/ext/socket/depend b/ext/socket/depend
index ab0a5e8..1716f9c 100644
--- a/ext/socket/depend
+++ b/ext/socket/depend
@@ -1,5 +1,5 @@
SOCK_HEADERS = $(srcdir)/rubysocket.h $(hdrdir)/ruby/ruby.h $(arch_hdrdir)/ruby/config.h \
- $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/io.h \
+ $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/io.h $(hdrdir)/ruby/thread.h \
$(srcdir)/addrinfo.h $(srcdir)/sockport.h constdefs.h $(top_srcdir)/internal.h
init.o: init.c $(SOCK_HEADERS)
diff --git a/ext/socket/raddrinfo.c b/ext/socket/raddrinfo.c
index a7391c9..f37c87b 100644
--- a/ext/socket/raddrinfo.c
+++ b/ext/socket/raddrinfo.c
@@ -154,12 +154,12 @@ struct getaddrinfo_arg
struct addrinfo **res;
};
-static VALUE
+static void *
nogvl_getaddrinfo(void *arg)
{
struct getaddrinfo_arg *ptr = arg;
- return getaddrinfo(ptr->node, ptr->service,
- ptr->hints, ptr->res);
+ return (void *)getaddrinfo(ptr->node, ptr->service,
+ ptr->hints, ptr->res);
}
#endif
@@ -178,7 +178,7 @@ rb_getaddrinfo(const char *node, const char *service,
arg.service = service;
arg.hints = hints;
arg.res = res;
- ret = (int)BLOCKING_REGION(nogvl_getaddrinfo, &arg);
+ ret = (int)rb_thread_call_without_gvl(nogvl_getaddrinfo, &arg, RUBY_UBF_IO, 0);
return ret;
#endif
}
@@ -195,14 +195,14 @@ struct getnameinfo_arg
int flags;
};
-static VALUE
+static void *
nogvl_getnameinfo(void *arg)
{
struct getnameinfo_arg *ptr = arg;
- return getnameinfo(ptr->sa, ptr->salen,
- ptr->host, (socklen_t)ptr->hostlen,
- ptr->serv, (socklen_t)ptr->servlen,
- ptr->flags);
+ return (void *)getnameinfo(ptr->sa, ptr->salen,
+ ptr->host, (socklen_t)ptr->hostlen,
+ ptr->serv, (socklen_t)ptr->servlen,
+ ptr->flags);
}
#endif
@@ -223,7 +223,7 @@ rb_getnameinfo(const struct sockaddr *sa, socklen_t salen,
arg.serv = serv;
arg.servlen = servlen;
arg.flags = flags;
- ret = (int)BLOCKING_REGION(nogvl_getnameinfo, &arg);
+ ret = (int)rb_thread_call_without_gvl(nogvl_getnameinfo, &arg, RUBY_UBF_IO, 0);
return ret;
#endif
}
diff --git a/ext/socket/rubysocket.h b/ext/socket/rubysocket.h
index 3b6f51f..bbc8249 100644
--- a/ext/socket/rubysocket.h
+++ b/ext/socket/rubysocket.h
@@ -3,6 +3,7 @@
#include "ruby/ruby.h"
#include "ruby/io.h"
+#include "ruby/thread.h"
#include "ruby/util.h"
#include "internal.h"
#include <stdio.h>
diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c
index fc49e44..3fb1be9 100644
--- a/ext/zlib/zlib.c
+++ b/ext/zlib/zlib.c
@@ -10,6 +10,7 @@
#include <zlib.h>
#include <time.h>
#include <ruby/io.h>
+#include <ruby/thread.h>
#ifdef HAVE_VALGRIND_MEMCHECK_H
# include <valgrind/memcheck.h>
@@ -916,7 +917,7 @@ zstream_end(struct zstream *z)
return Qnil;
}
-static VALUE
+static void *
zstream_run_func(void *ptr)
{
struct zstream_run_args *args = (struct zstream_run_args *)ptr;
@@ -950,7 +951,7 @@ zstream_run_func(void *ptr)
}
}
- return (VALUE)err;
+ return (void *)err;
}
/*
@@ -994,7 +995,7 @@ zstream_run(struct zstream *z, Bytef *src, long len, int flush)
}
loop:
- err = (int)rb_thread_blocking_region(
+ err = (int)rb_thread_call_without_gvl(
zstream_run_func, (void *)&args,
zstream_unblock_func, (void *)&args);
diff --git a/gc.c b/gc.c
index 3c55fc6..d976a90 100644
--- a/gc.c
+++ b/gc.c
@@ -15,6 +15,7 @@
#include "ruby/st.h"
#include "ruby/re.h"
#include "ruby/io.h"
+#include "ruby/thread.h"
#include "ruby/util.h"
#include "eval_intern.h"
#include "vm_core.h"
diff --git a/include/ruby/intern.h b/include/ruby/intern.h
index 5328f2c..dae7ca3 100644
--- a/include/ruby/intern.h
+++ b/include/ruby/intern.h
@@ -826,6 +826,7 @@ 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);
+DEPRECATED(VALUE rb_thread_blocking_region());
#define RUBY_UBF_IO ((rb_unblock_function_t *)-1)
#define RUBY_UBF_PROCESS ((rb_unblock_function_t *)-1)
VALUE rb_mutex_new(void);
diff --git a/include/ruby/thread.h b/include/ruby/thread.h
new file mode 100644
index 0000000..9b9bcde
--- /dev/null
+++ b/include/ruby/thread.h
@@ -0,0 +1,43 @@
+/**********************************************************************
+
+ thread.h -
+
+ $Author: matz $
+ created at: Tue Jul 10 17:35:43 JST 2012
+
+ Copyright (C) 2007 Yukihiro Matsumoto
+
+**********************************************************************/
+
+#ifndef RUBY_THREAD_H
+#define RUBY_THREAD_H 1
+
+#if defined(__cplusplus)
+extern "C" {
+#if 0
+} /* satisfy cc-mode */
+#endif
+#endif
+
+#include "ruby/intern.h"
+
+#if defined __GNUC__ && __GNUC__ >= 4
+#pragma GCC visibility push(default)
+#endif
+
+void *rb_thread_call_with_gvl(void *(*func)(void *), void *data1);
+void *rb_thread_call_without_gvl(void *(*func)(void *), void *data1,
+ rb_unblock_function_t *ubf, void *data2);
+
+#if defined __GNUC__ && __GNUC__ >= 4
+#pragma GCC visibility pop
+#endif
+
+#if defined(__cplusplus)
+#if 0
+{ /* satisfy cc-mode */
+#endif
+} /* extern "C" { */
+#endif
+
+#endif /* RUBY_THREAD_H */
diff --git a/internal.h b/internal.h
index b6ecc77..cc4a263 100644
--- a/internal.h
+++ b/internal.h
@@ -294,16 +294,6 @@ const char *rb_objspace_data_type_name(VALUE obj);
/* Temporary. This API will be removed (renamed). */
VALUE rb_thread_io_blocking_region(rb_blocking_function_t *func, void *data1, int fd);
-/* experimental.
- * These APIs can be changed on Ruby 1.9.4 or later.
- * We will change these APIs (spac, name and so on) if there are something wrong.
- * If you use these APIs, catch up future changes.
- */
-void *rb_thread_call_with_gvl(void *(*func)(void *), void *data1);
-VALUE rb_thread_call_without_gvl(
- rb_blocking_function_t *func, void *data1,
- rb_unblock_function_t *ubf, void *data2);
-
/* io.c */
void rb_maygvl_fd_fix_cloexec(int fd);
diff --git a/io.c b/io.c
index 9f37e03..3bc452d 100644
--- a/io.c
+++ b/io.c
@@ -13,6 +13,7 @@
#include "ruby/ruby.h"
#include "ruby/io.h"
+#include "ruby/thread.h"
#include "dln.h"
#include "internal.h"
#include <ctype.h>
@@ -5009,19 +5010,19 @@ struct sysopen_struct {
mode_t perm;
};
-static VALUE
+static void *
sysopen_func(void *ptr)
{
const struct sysopen_struct *data = ptr;
const char *fname = RSTRING_PTR(data->fname);
- return (VALUE)rb_cloexec_open(fname, data->oflags, data->perm);
+ return (void *)rb_cloexec_open(fname, data->oflags, data->perm);
}
static inline int
rb_sysopen_internal(struct sysopen_struct *data)
{
int fd;
- fd = (int)rb_thread_blocking_region(sysopen_func, data, RUBY_UBF_IO, 0);
+ fd = (int)rb_thread_call_without_gvl(sysopen_func, data, RUBY_UBF_IO, 0);
if (0 <= fd)
rb_update_max_fd(fd);
return fd;
@@ -9733,7 +9734,7 @@ nogvl_copy_stream_read_write(struct copy_stream_struct *stp)
}
}
-static VALUE
+static void *
nogvl_copy_stream_func(void *arg)
{
struct copy_stream_struct *stp = (struct copy_stream_struct *)arg;
@@ -9752,7 +9753,7 @@ nogvl_copy_stream_func(void *arg)
#ifdef USE_SENDFILE
finish:
#endif
- return Qnil;
+ return 0;
}
static VALUE
@@ -9938,7 +9939,8 @@ copy_stream_body(VALUE arg)
rb_fd_set(src_fd, &stp->fds);
rb_fd_set(dst_fd, &stp->fds);
- return rb_thread_blocking_region(nogvl_copy_stream_func, (void*)stp, RUBY_UBF_IO, 0);
+ rb_thread_call_without_gvl(nogvl_copy_stream_func, (void*)stp, RUBY_UBF_IO, 0);
+ return Qnil;
}
static VALUE
diff --git a/process.c b/process.c
index f6badfa..ee89d40 100644
--- a/process.c
+++ b/process.c
@@ -13,6 +13,7 @@
#include "ruby/ruby.h"
#include "ruby/io.h"
+#include "ruby/thread.h"
#include "ruby/util.h"
#include "internal.h"
#include "vm_core.h"
@@ -628,7 +629,7 @@ struct waitpid_arg {
};
#endif
-static VALUE
+static void *
rb_waitpid_blocking(void *data)
{
rb_pid_t result;
@@ -644,7 +645,7 @@ rb_waitpid_blocking(void *data)
result = wait4(arg->pid, arg->st, arg->flags, NULL);
#endif
- return (VALUE)result;
+ return (void *)result;
}
rb_pid_t
@@ -658,8 +659,8 @@ rb_waitpid(rb_pid_t pid, int *st, int flags)
arg.pid = pid;
arg.st = st;
arg.flags = flags;
- result = (rb_pid_t)rb_thread_blocking_region(rb_waitpid_blocking, &arg,
- RUBY_UBF_PROCESS, 0);
+ result = (rb_pid_t)rb_thread_call_without_gvl(rb_waitpid_blocking, &arg,
+ RUBY_UBF_PROCESS, 0);
if (result < 0) {
if (errno == EINTR) {
RUBY_VM_CHECK_INTS();
diff --git a/thread.c b/thread.c
index 7de1dca..2a40069 100644
--- a/thread.c
+++ b/thread.c
@@ -48,6 +48,7 @@
#include "gc.h"
#include "internal.h"
#include "ruby/io.h"
+#include "ruby/thread.h"
#ifndef USE_NATIVE_THREAD_PRIORITY
#define USE_NATIVE_THREAD_PRIORITY 0
@@ -1114,12 +1115,11 @@ rb_thread_blocking_region_end(struct rb_blocking_region_buffer *region)
* they will work without GVL, and may acquire GVL
* when GC is needed.
*/
-VALUE
-rb_thread_blocking_region(
- rb_blocking_function_t *func, void *data1,
- rb_unblock_function_t *ubf, void *data2)
+void *
+rb_thread_call_without_gvl(void *(*func)(void *), void *data1,
+ rb_unblock_function_t *ubf, void *data2)
{
- VALUE val;
+ void *val;
rb_thread_t *th = GET_THREAD();
int saved_errno = 0;
@@ -1156,14 +1156,13 @@ rb_thread_io_blocking_region(rb_blocking_function_t *func, void *data1, int fd)
return val;
}
-/* alias of rb_thread_blocking_region() */
-
VALUE
-rb_thread_call_without_gvl(
+rb_thread_blocking_region(
rb_blocking_function_t *func, void *data1,
rb_unblock_function_t *ubf, void *data2)
{
- return rb_thread_blocking_region(func, data1, ubf, data2);
+ void *(*f)(void*) = (void *(*)(void*))func;
+ return (VALUE)rb_thread_call_without_gvl(f, data1, ubf, data2);
}
/*