about summary refs log tree commit homepage
path: root/ext/kgio
diff options
context:
space:
mode:
Diffstat (limited to 'ext/kgio')
-rw-r--r--ext/kgio/autopush.c21
-rw-r--r--ext/kgio/extconf.rb8
2 files changed, 27 insertions, 2 deletions
diff --git a/ext/kgio/autopush.c b/ext/kgio/autopush.c
index fa24055..cc83fdb 100644
--- a/ext/kgio/autopush.c
+++ b/ext/kgio/autopush.c
@@ -38,6 +38,26 @@ enum autopush_state {
         AUTOPUSH_STATE_ACCEPTOR = 3
 };
 
+#if defined(R_CAST) && \
+    defined(HAVE_TYPE_STRUCT_RFILE) && \
+    defined(HAVE_TYPE_STRUCT_ROBJECT) && \
+    ((SIZEOF_STRUCT_RFILE + SIZEOF_INT) <= (SIZEOF_STRUCT_ROBJECT))
+
+struct AutopushSocket {
+        struct RFile rfile;
+        enum autopush_state autopush_state;
+};
+
+static enum autopush_state state_get(VALUE io)
+{
+        return ((struct AutopushSocket *)(io))->autopush_state;
+}
+
+static void state_set(VALUE io, enum autopush_state state)
+{
+        ((struct AutopushSocket *)(io))->autopush_state = state;
+}
+#else
 static enum autopush_state state_get(VALUE io)
 {
         VALUE val;
@@ -53,6 +73,7 @@ static void state_set(VALUE io, enum autopush_state state)
 {
         rb_ivar_set(io, id_autopush_state, INT2NUM(state));
 }
+#endif /* IVAR fallback */
 
 static enum autopush_state detect_acceptor_state(VALUE io);
 static void push_pending_data(VALUE io);
diff --git a/ext/kgio/extconf.rb b/ext/kgio/extconf.rb
index dcc1418..e7220a4 100644
--- a/ext/kgio/extconf.rb
+++ b/ext/kgio/extconf.rb
@@ -3,8 +3,9 @@ $CPPFLAGS << ' -D_GNU_SOURCE'
 
 have_func('accept4', %w(sys/socket.h))
 if have_header('ruby/io.h')
-  have_struct_member("rb_io_t", "fd", "ruby/io.h")
-  have_struct_member("rb_io_t", "mode", "ruby/io.h")
+  rubyio = %w(ruby.h ruby/io.h)
+  have_struct_member("rb_io_t", "fd", rubyio)
+  have_struct_member("rb_io_t", "mode", rubyio)
 else
   rubyio = %w(ruby.h rubyio.h)
   rb_io_t = have_type("OpenFile", rubyio) ? "OpenFile" : "rb_io_t"
@@ -13,6 +14,9 @@ else
   have_struct_member(rb_io_t, "mode", rubyio)
   have_func('rb_fdopen')
 end
+have_type("struct RFile", rubyio) and check_sizeof("struct RFile", rubyio)
+have_type("struct RObject") and check_sizeof("struct RObject")
+check_sizeof("int")
 have_func('rb_io_ascii8bit_binmode')
 have_func('rb_thread_blocking_region')
 have_func('rb_str_set_len')