Skip to content

Commit

Permalink
rb_thread_call_without_gvl
Browse files Browse the repository at this point in the history
* 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]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36355 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
nobu committed Jul 10, 2012
1 parent 1a85339 commit c51a826
Show file tree
Hide file tree
Showing 21 changed files with 134 additions and 80 deletions.
9 changes: 9 additions & 0 deletions 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.
Expand Down
9 changes: 5 additions & 4 deletions bignum.c
Expand Up @@ -10,6 +10,7 @@
**********************************************************************/

#include "ruby/ruby.h"
#include "ruby/thread.h"
#include "ruby/util.h"
#include "internal.h"

Expand Down Expand Up @@ -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;
Expand All @@ -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) {
Expand Down Expand Up @@ -2633,7 +2634,7 @@ bigdivrem1(void *ptr)
}
zds[j] = q;
} while (--j >= ny);
return Qnil;
return 0;
}

static void
Expand Down Expand Up @@ -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);
Expand Down
13 changes: 8 additions & 5 deletions common.mk
Expand Up @@ -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
Expand Down Expand Up @@ -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 \
Expand All @@ -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
Expand Down Expand Up @@ -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) \
Expand Down
25 changes: 13 additions & 12 deletions ext/curses/curses.c
Expand Up @@ -18,6 +18,7 @@

#include "ruby.h"
#include "ruby/io.h"
#include "ruby/thread.h"

#if defined(HAVE_NCURSES_H)
# include <ncurses.h>
Expand Down Expand Up @@ -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;
}

/*
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -678,7 +679,7 @@ getstr_func(void *arg)
#else
getstr(rtn);
#endif
return Qnil;
return 0;
}

/*
Expand All @@ -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);
}

Expand Down Expand Up @@ -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;
}

/*
Expand All @@ -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)) {
Expand All @@ -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;
Expand All @@ -2005,7 +2006,7 @@ wgetstr_func(void *_arg)
#else
wgetstr(arg->win, arg->rtn);
#endif
return Qnil;
return 0;
}

/*
Expand All @@ -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);
}

Expand Down
2 changes: 1 addition & 1 deletion 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
1 change: 1 addition & 0 deletions ext/openssl/ossl.h
Expand Up @@ -30,6 +30,7 @@ extern "C" {
#endif
#include <ruby.h>
#include <ruby/io.h>
#include <ruby/thread.h>

/*
* Check the OpenSSL version
Expand Down
6 changes: 3 additions & 3 deletions ext/openssl/ossl_pkey_dh.c
Expand Up @@ -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

Expand Down Expand Up @@ -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) {
Expand Down
6 changes: 3 additions & 3 deletions ext/openssl/ossl_pkey_dsa.c
Expand Up @@ -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

Expand Down Expand Up @@ -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);
Expand Down
6 changes: 3 additions & 3 deletions ext/openssl/ossl_pkey_rsa.c
Expand Up @@ -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

Expand Down Expand Up @@ -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);
Expand Down
12 changes: 6 additions & 6 deletions ext/socket/ancdata.c
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion 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)
Expand Down

0 comments on commit c51a826

Please sign in to comment.