dumping ground for random patches and texts
 help / color / mirror / Atom feed
* delay exception checks
@ 2015-06-29 21:00 Eric Wong
  0 siblings, 0 replies; only message in thread
From: Eric Wong @ 2015-06-29 21:00 UTC (permalink / raw)
  To: spew

diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index 4496d46..143189e 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -1273,14 +1273,23 @@ read_would_block(int nonblock)
     }
 }
 
+static int
+no_exception_p(VALUE opts)
+{
+    if (RB_TYPE_P(opts, T_HASH) &&
+          rb_hash_lookup2(opts, sym_exception, Qundef) == Qfalse)
+	return 1;
+    return 0;
+}
+
 static VALUE
-ossl_start_ssl(VALUE self, int (*func)(), const char *funcname,
-		int nonblock, int no_exception)
+ossl_start_ssl(VALUE self, int (*func)(), const char *funcname, VALUE opts)
 {
     SSL *ssl;
     rb_io_t *fptr;
     int ret, ret2;
     VALUE cb_state;
+    int nonblock = opts != Qfalse;
 
     rb_ivar_set(self, ID_callback_state, Qnil);
 
@@ -1299,12 +1308,12 @@ ossl_start_ssl(VALUE self, int (*func)(), const char *funcname,
 
 	switch((ret2 = ssl_get_error(ssl, ret))){
 	case SSL_ERROR_WANT_WRITE:
-            if (no_exception) { return sym_wait_writable; }
+            if (no_exception_p(opts)) { return sym_wait_writable; }
             write_would_block(nonblock);
             rb_io_wait_writable(FPTR_TO_FD(fptr));
             continue;
 	case SSL_ERROR_WANT_READ:
-            if (no_exception) { return sym_wait_readable; }
+            if (no_exception_p(opts)) { return sym_wait_readable; }
             read_would_block(nonblock);
             rb_io_wait_readable(FPTR_TO_FD(fptr));
             continue;
@@ -1330,15 +1339,8 @@ static VALUE
 ossl_ssl_connect(VALUE self)
 {
     ossl_ssl_setup(self);
-    return ossl_start_ssl(self, SSL_connect, "SSL_connect", 0, 0);
-}
 
-static int
-get_no_exception(VALUE opts)
-{
-    if (!NIL_P(opts) && Qfalse == rb_hash_lookup2(opts, sym_exception, Qundef))
-	return 1;
-    return 0;
+    return ossl_start_ssl(self, SSL_connect, "SSL_connect", Qfalse);
 }
 
 /*
@@ -1366,14 +1368,12 @@ get_no_exception(VALUE opts)
 static VALUE
 ossl_ssl_connect_nonblock(int argc, VALUE *argv, VALUE self)
 {
-    int no_exception;
-    VALUE opts = Qnil;
-
+    VALUE opts;
     rb_scan_args(argc, argv, "0:", &opts);
-    no_exception = get_no_exception(opts);
 
     ossl_ssl_setup(self);
-    return ossl_start_ssl(self, SSL_connect, "SSL_connect", 1, no_exception);
+
+    return ossl_start_ssl(self, SSL_connect, "SSL_connect", opts);
 }
 
 /*
@@ -1387,7 +1387,8 @@ static VALUE
 ossl_ssl_accept(VALUE self)
 {
     ossl_ssl_setup(self);
-    return ossl_start_ssl(self, SSL_accept, "SSL_accept", 0, 0);
+
+    return ossl_start_ssl(self, SSL_accept, "SSL_accept", Qfalse);
 }
 
 /*
@@ -1415,14 +1416,12 @@ ossl_ssl_accept(VALUE self)
 static VALUE
 ossl_ssl_accept_nonblock(int argc, VALUE *argv, VALUE self)
 {
-    int no_exception;
-    VALUE opts = Qnil;
+    VALUE opts;
 
     rb_scan_args(argc, argv, "0:", &opts);
-    no_exception = get_no_exception(opts);
-
     ossl_ssl_setup(self);
-    return ossl_start_ssl(self, SSL_accept, "SSL_accept", 1, no_exception);
+
+    return ossl_start_ssl(self, SSL_accept, "SSL_accept", opts);
 }
 
 static VALUE
@@ -1430,14 +1429,12 @@ ossl_ssl_read_internal(int argc, VALUE *argv, VALUE self, int nonblock)
 {
     SSL *ssl;
     int ilen, nread = 0;
-    int no_exception = 0;
     VALUE len, str;
     rb_io_t *fptr;
     VALUE opts = Qnil;
 
     if (nonblock) {
 	rb_scan_args(argc, argv, "11:", &len, &str, &opts);
-	no_exception = get_no_exception(opts);
     } else {
 	rb_scan_args(argc, argv, "11", &len, &str);
     }
@@ -1462,21 +1459,21 @@ ossl_ssl_read_internal(int argc, VALUE *argv, VALUE self, int nonblock)
 	    case SSL_ERROR_NONE:
 		goto end;
 	    case SSL_ERROR_ZERO_RETURN:
-		if (no_exception) { return Qnil; }
+		if (no_exception_p(opts)) { return Qnil; }
 		rb_eof_error();
 	    case SSL_ERROR_WANT_WRITE:
-		if (no_exception) { return sym_wait_writable; }
+		if (no_exception_p(opts)) { return sym_wait_writable; }
                 write_would_block(nonblock);
                 rb_io_wait_writable(FPTR_TO_FD(fptr));
                 continue;
 	    case SSL_ERROR_WANT_READ:
-		if (no_exception) { return sym_wait_readable; }
+		if (no_exception_p(opts)) { return sym_wait_readable; }
                 read_would_block(nonblock);
                 rb_io_wait_readable(FPTR_TO_FD(fptr));
 		continue;
 	    case SSL_ERROR_SYSCALL:
 		if(ERR_peek_error() == 0 && nread == 0) {
-		    if (no_exception) { return Qnil; }
+		    if (no_exception_p(opts)) { return Qnil; }
 		    rb_eof_error();
 		}
 		rb_sys_fail(0);
@@ -1536,11 +1533,12 @@ ossl_ssl_read_nonblock(int argc, VALUE *argv, VALUE self)
 }
 
 static VALUE
-ossl_ssl_write_internal(VALUE self, VALUE str, int nonblock, int no_exception)
+ossl_ssl_write_internal(VALUE self, VALUE str, VALUE opts)
 {
     SSL *ssl;
     int nwrite = 0;
     rb_io_t *fptr;
+    int nonblock = opts != Qfalse;
 
     StringValue(str);
     GetSSL(self, ssl);
@@ -1553,12 +1551,12 @@ ossl_ssl_write_internal(VALUE self, VALUE str, int nonblock, int no_exception)
 	    case SSL_ERROR_NONE:
 		goto end;
 	    case SSL_ERROR_WANT_WRITE:
-		if (no_exception) { return sym_wait_writable; }
+		if (no_exception_p(opts)) { return sym_wait_writable; }
                 write_would_block(nonblock);
                 rb_io_wait_writable(FPTR_TO_FD(fptr));
                 continue;
 	    case SSL_ERROR_WANT_READ:
-		if (no_exception) { return sym_wait_readable; }
+		if (no_exception_p(opts)) { return sym_wait_readable; }
                 read_would_block(nonblock);
                 rb_io_wait_readable(FPTR_TO_FD(fptr));
                 continue;
@@ -1588,7 +1586,7 @@ ossl_ssl_write_internal(VALUE self, VALUE str, int nonblock, int no_exception)
 static VALUE
 ossl_ssl_write(VALUE self, VALUE str)
 {
-    return ossl_ssl_write_internal(self, str, 0, 0);
+    return ossl_ssl_write_internal(self, str, Qfalse);
 }
 
 /*
@@ -1601,14 +1599,11 @@ ossl_ssl_write(VALUE self, VALUE str)
 static VALUE
 ossl_ssl_write_nonblock(int argc, VALUE *argv, VALUE self)
 {
-    VALUE str;
-    VALUE opts = Qnil;
-    int no_exception;
+    VALUE str, opts;
 
     rb_scan_args(argc, argv, "1:", &str, &opts);
-    no_exception = get_no_exception(opts);
 
-    return ossl_ssl_write_internal(self, str, 1, no_exception);
+    return ossl_ssl_write_internal(self, str, opts);
 }
 
 /*
diff --git a/ext/stringio/stringio.c b/ext/stringio/stringio.c
index ed141dd..89cc392 100644
--- a/ext/stringio/stringio.c
+++ b/ext/stringio/stringio.c
@@ -1359,20 +1359,17 @@ static VALUE
 strio_read_nonblock(int argc, VALUE *argv, VALUE self)
 {
     VALUE opts = Qnil, val;
-    int no_exception = 0;
 
     rb_scan_args(argc, argv, "11:", NULL, NULL, &opts);
 
     if (!NIL_P(opts)) {
 	argc--;
-
-	if (Qfalse == rb_hash_aref(opts, sym_exception))
-	    no_exception = 1;
     }
 
     val = strio_read(argc, argv, self);
     if (NIL_P(val)) {
-	if (no_exception)
+	if (!NIL_P(opts) &&
+	      rb_hash_lookup2(opts, sym_exception, Qundef) == Qfalse)
 	    return Qnil;
 	else
 	    rb_eof_error();
diff --git a/io.c b/io.c
index dfdb422..da66553 100644
--- a/io.c
+++ b/io.c
@@ -2482,8 +2482,21 @@ read_internal_call(VALUE arg)
     return Qundef;
 }
 
+static int
+no_exception_p(VALUE opts)
+{
+    static ID ids[1];
+    VALUE except;
+
+    if (!ids[0])
+	ids[0] = id_exception;
+
+    rb_get_kwargs(opts, ids, 0, 1, &except);
+    return except == Qfalse;
+}
+
 static VALUE
-io_getpartial(int argc, VALUE *argv, VALUE io, int nonblock, int no_exception)
+io_getpartial(int argc, VALUE *argv, VALUE io, VALUE opts, int nonblock)
 {
     rb_io_t *fptr;
     VALUE length, str;
@@ -2523,7 +2536,7 @@ io_getpartial(int argc, VALUE *argv, VALUE io, int nonblock, int no_exception)
             if (!nonblock && rb_io_wait_readable(fptr->fd))
                 goto again;
             if (nonblock && (errno == EWOULDBLOCK || errno == EAGAIN)) {
-                if (no_exception)
+                if (no_exception_p(opts))
                     return sym_wait_readable;
                 else
 		    rb_readwrite_sys_fail(RB_IO_WAIT_READABLE, "read would block");
@@ -2603,25 +2616,12 @@ io_readpartial(int argc, VALUE *argv, VALUE io)
 {
     VALUE ret;
 
-    ret = io_getpartial(argc, argv, io, 0, 0);
+    ret = io_getpartial(argc, argv, io, Qnil, 0);
     if (NIL_P(ret))
         rb_eof_error();
     return ret;
 }
 
-static VALUE
-get_kwargs_exception(VALUE opts)
-{
-    static ID ids[1];
-    VALUE except;
-
-    if (!ids[0])
-	ids[0] = id_exception;
-
-    rb_get_kwargs(opts, ids, 0, 1, &except);
-    return except;
-}
-
 /*
  *  call-seq:
  *     ios.read_nonblock(maxlen)              -> string
@@ -2676,19 +2676,14 @@ get_kwargs_exception(VALUE opts)
 static VALUE
 io_read_nonblock(int argc, VALUE *argv, VALUE io)
 {
-    VALUE ret;
-    VALUE opts = Qnil;
-    int no_exception = 0;
+    VALUE ret, opts;
 
     rb_scan_args(argc, argv, "11:", NULL, NULL, &opts);
 
-    if (!NIL_P(opts) && Qfalse == get_kwargs_exception(opts))
-	no_exception = 1;
-
-    ret = io_getpartial(argc, argv, io, 1, no_exception);
+    ret = io_getpartial(argc, argv, io, opts, 1);
 
     if (NIL_P(ret)) {
-	if (no_exception)
+	if (no_exception_p(opts))
 	    return Qnil;
 	else
 	    rb_eof_error();
@@ -2697,7 +2692,7 @@ io_read_nonblock(int argc, VALUE *argv, VALUE io)
 }
 
 static VALUE
-io_write_nonblock(VALUE io, VALUE str, int no_exception)
+io_write_nonblock(VALUE io, VALUE str, VALUE opts)
 {
     rb_io_t *fptr;
     long n;
@@ -2717,7 +2712,7 @@ io_write_nonblock(VALUE io, VALUE str, int no_exception)
 
     if (n == -1) {
         if (errno == EWOULDBLOCK || errno == EAGAIN) {
-	    if (no_exception) {
+	    if (no_exception_p(opts)) {
 		return sym_wait_writable;
 	    }
 	    else {
@@ -2791,16 +2786,11 @@ io_write_nonblock(VALUE io, VALUE str, int no_exception)
 static VALUE
 rb_io_write_nonblock(int argc, VALUE *argv, VALUE io)
 {
-    VALUE str;
-    VALUE opts = Qnil;
-    int no_exceptions = 0;
+    VALUE str, opts;
 
     rb_scan_args(argc, argv, "10:", &str, &opts);
 
-    if (!NIL_P(opts) && Qfalse == get_kwargs_exception(opts))
-	no_exceptions = 1;
-
-    return io_write_nonblock(io, str, no_exceptions);
+    return io_write_nonblock(io, str, opts);
 }
 
 /*
@@ -11199,7 +11189,7 @@ argf_getpartial(int argc, VALUE *argv, VALUE argf, int nonblock)
 			 RUBY_METHOD_FUNC(0), Qnil, rb_eEOFError, (VALUE)0);
     }
     else {
-        tmp = io_getpartial(argc, argv, ARGF.current_file, nonblock, 0);
+        tmp = io_getpartial(argc, argv, ARGF.current_file, Qnil, nonblock);
     }
     if (NIL_P(tmp)) {
         if (ARGF.next_p == -1) {

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2015-06-29 21:00 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-06-29 21:00 delay exception checks Eric Wong

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).