[前][次][番号順一覧][スレッド一覧]

ruby-changes:24304

From: nobu <ko1@a...>
Date: Tue, 10 Jul 2012 22:57:29 +0900 (JST)
Subject: [ruby-changes:24304] nobu:r36355 (trunk): rb_thread_call_without_gvl

nobu	2012-07-10 22:57:11 +0900 (Tue, 10 Jul 2012)

  New Revision: 36355

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=36355

  Log:
    rb_thread_call_without_gvl
    
    * 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]

  Added files:
    trunk/include/ruby/thread.h
  Modified files:
    trunk/ChangeLog
    trunk/bignum.c
    trunk/common.mk
    trunk/ext/curses/curses.c
    trunk/ext/curses/depend
    trunk/ext/openssl/ossl.h
    trunk/ext/openssl/ossl_pkey_dh.c
    trunk/ext/openssl/ossl_pkey_dsa.c
    trunk/ext/openssl/ossl_pkey_rsa.c
    trunk/ext/socket/ancdata.c
    trunk/ext/socket/depend
    trunk/ext/socket/raddrinfo.c
    trunk/ext/socket/rubysocket.h
    trunk/ext/zlib/zlib.c
    trunk/gc.c
    trunk/include/ruby/intern.h
    trunk/internal.h
    trunk/io.c
    trunk/process.c
    trunk/thread.c

Index: include/ruby/intern.h
===================================================================
--- include/ruby/intern.h	(revision 36354)
+++ include/ruby/intern.h	(revision 36355)
@@ -826,6 +826,7 @@
 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);
Index: include/ruby/thread.h
===================================================================
--- include/ruby/thread.h	(revision 0)
+++ include/ruby/thread.h	(revision 36355)
@@ -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 */

Property changes on: include/ruby/thread.h
___________________________________________________________________
Added: svn:eol-style
   + LF

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 36354)
+++ ChangeLog	(revision 36355)
@@ -1,3 +1,12 @@
+Tue Jul 10 22:57:03 2012  Nobuyoshi Nakada  <nobu@r...>
+
+	* 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@r...>
 
 	* include/ruby/win32.h (NT, NtInitialize): removed unused old macros.
Index: io.c
===================================================================
--- io.c	(revision 36354)
+++ io.c	(revision 36355)
@@ -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 @@
     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 @@
     }
 }
 
-static VALUE
+static void *
 nogvl_copy_stream_func(void *arg)
 {
     struct copy_stream_struct *stp = (struct copy_stream_struct *)arg;
@@ -9752,7 +9753,7 @@
 #ifdef USE_SENDFILE
   finish:
 #endif
-    return Qnil;
+    return 0;
 }
 
 static VALUE
@@ -9938,7 +9939,8 @@
     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
Index: thread.c
===================================================================
--- thread.c	(revision 36354)
+++ thread.c	(revision 36355)
@@ -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 @@
  *         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 @@
     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);
 }
 
 /*
Index: common.mk
===================================================================
--- common.mk	(revision 36354)
+++ common.mk	(revision 36355)
@@ -616,7 +616,7 @@
 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 @@
 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 @@
   {$(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 @@
 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) \
Index: gc.c
===================================================================
--- gc.c	(revision 36354)
+++ gc.c	(revision 36355)
@@ -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"
Index: process.c
===================================================================
--- process.c	(revision 36354)
+++ process.c	(revision 36355)
@@ -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 @@
 };
 #endif
 
-static VALUE
+static void *
 rb_waitpid_blocking(void *data)
 {
     rb_pid_t result;
@@ -644,7 +645,7 @@
     result = wait4(arg->pid, arg->st, arg->flags, NULL);
 #endif
 
-    return (VALUE)result;
+    return (void *)result;
 }
 
 rb_pid_t
@@ -658,8 +659,8 @@
     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();
Index: ext/zlib/zlib.c
===================================================================
--- ext/zlib/zlib.c	(revision 36354)
+++ ext/zlib/zlib.c	(revision 36355)
@@ -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 @@
     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 @@
 	}
     }
 
-    return (VALUE)err;
+    return (void *)err;
 }
 
 /*
@@ -994,7 +995,7 @@
     }
 
 loop:
-    err = (int)rb_thread_blocking_region(
+    err = (int)rb_thread_call_without_gvl(
 	    zstream_run_func, (void *)&args,
 	    zstream_unblock_func, (void *)&args);
 
Index: ext/curses/depend
===================================================================
--- ext/curses/depend	(revision 36354)
+++ ext/curses/depend	(revision 36355)
@@ -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
Index: ext/curses/curses.c
===================================================================
--- ext/curses/curses.c	(revision 36354)
+++ ext/curses/curses.c	(revision 36355)
@@ -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 @@
     return Qnil;
 }
 
-static VALUE
+static void *
 getch_func(void *arg)
 {
     int *ip = (int *)arg;
     *ip = getch();
-    return Qnil;
+    return 0;
 }
 
 /*
@@ -656,7 +657,7 @@
     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 @@
 /* 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 @@
 #else
     getstr(rtn);
 #endif
-    return Qnil;
+    return 0;
 }
 
 /*
@@ -693,7 +694,7 @@
     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 @@
     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 @@
 
     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 @@
     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 @@
 #else
     wgetstr(arg->win, arg->rtn);
 #endif
-    return Qnil;
+    return 0;
 }
 
 /*
@@ -2022,7 +2023,7 @@
 
     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);
 }
 
Index: ext/openssl/ossl_pkey_dsa.c
===================================================================
--- ext/openssl/ossl_pkey_dsa.c	(revision 36354)
+++ ext/openssl/ossl_pkey_dsa.c	(revision 36355)
@@ -87,12 +87,12 @@
     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_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);
Index: ext/openssl/ossl_pkey_rsa.c
===================================================================
--- ext/openssl/ossl_pkey_rsa.c	(revision 36354)
+++ ext/openssl/ossl_pkey_rsa.c	(revision 36355)
@@ -85,12 +85,12 @@
     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_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);
Index: ext/openssl/ossl.h
===================================================================
--- ext/openssl/ossl.h	(revision 36354)
+++ ext/openssl/ossl.h	(revision 36355)
@@ -30,6 +30,7 @@
 #endif
 #include <ruby.h>
 #include <ruby/io.h>
+#include <ruby/thread.h>
 
 /*
  * Check the OpenSSL version
Index: ext/openssl/ossl_pkey_dh.c
===================================================================
--- ext/openssl/ossl_pkey_dh.c	(revision 36354)
+++ ext/openssl/ossl_pkey_dh.c	(revision 36355)
@@ -90,12 +90,12 @@
     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_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) {
Index: ext/socket/rubysocket.h
===================================================================
--- ext/socket/rubysocket.h	(revision 36354)
+++ ext/socket/rubysocket.h	(revision 36355)
@@ -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>
Index: ext/socket/raddrinfo.c
===================================================================
--- ext/socket/raddrinfo.c	(revision 36354)
+++ ext/socket/raddrinfo.c	(revision 36355)
@@ -154,12 +154,12 @@
     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 @@
     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 @@
     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 @@
     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
 }
Index: ext/socket/depend
===================================================================
--- ext/socket/depend	(revision 36354)
+++ ext/socket/depend	(revision 36355)
@@ -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)
Index: ext/socket/ancdata.c
===================================================================
--- ext/socket/ancdata.c	(revision 36354)
+++ ext/socket/ancdata.c	(revision 36355)
@@ -1110,11 +1110,11 @@
     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 @@
     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 @@
     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 @@
     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)
Index: internal.h
===================================================================
--- internal.h	(revision 36354)
+++ internal.h	(revision 36355)
@@ -294,16 +294,6 @@
 /* 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 (... truncated)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]