ext/kgio/kgio.h in kgio-2.8.1 vs ext/kgio/kgio.h in kgio-2.9.0
- old
+ new
@@ -5,10 +5,13 @@
#ifdef HAVE_RUBY_IO_H
# include <ruby/io.h>
#else
# include <rubyio.h>
#endif
+#ifdef HAVE_RUBY_THREAD_H
+# include <ruby/thread.h>
+#endif
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
@@ -18,20 +21,14 @@
#include <assert.h>
#include <netdb.h>
#include "ancient_ruby.h"
-struct io_args {
- VALUE io;
- VALUE buf;
- char *ptr;
- long len;
- int fd;
-};
-
void init_kgio_wait(void);
-void init_kgio_read_write(void);
+void init_kgio_read(void);
+void init_kgio_write(void);
+void init_kgio_writev(void);
void init_kgio_accept(void);
void init_kgio_connect(void);
void init_kgio_autopush(void);
void init_kgio_poll(void);
void init_kgio_tryopen(void);
@@ -40,11 +37,20 @@
void kgio_autopush_recv(VALUE);
void kgio_autopush_send(VALUE);
VALUE kgio_call_wait_writable(VALUE io);
VALUE kgio_call_wait_readable(VALUE io);
-#if defined(HAVE_RB_THREAD_BLOCKING_REGION) && defined(HAVE_POLL)
+#if defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)
+# define KGIO_HAVE_THREAD_CALL_WITHOUT_GVL 1
+typedef void *(*kgio_blocking_fn_t)(void*);
+# define rb_thread_blocking_region(fn,data1,ubf,data2) \
+ rb_thread_call_without_gvl((kgio_blocking_fn_t)(fn),(data1),(ubf),(data2))
+#elif defined(HAVE_RB_THREAD_BLOCKING_REGION)
+# define KGIO_HAVE_THREAD_CALL_WITHOUT_GVL 1
+#endif /* HAVE_RB_THREAD_CALL_WITHOUT_GVL || HAVE_RB_THREAD_BLOCKING_REGION */
+
+#if defined(KGIO_HAVE_THREAD_CALL_WITHOUT_GVL) && defined(HAVE_POLL)
# define USE_KGIO_POLL
#endif /* USE_KGIO_POLL */
#ifndef HAVE_RB_UPDATE_MAX_FD
# define rb_update_max_fd(fd) for (;0;)
@@ -69,7 +75,25 @@
#else /* rely entirely on standard system headers */
# define KGIO_TFO_MAYBE (0)
#endif
extern unsigned kgio_tfo;
+NORETURN(void kgio_raise_empty_bt(VALUE, const char *));
+NORETURN(void kgio_wr_sys_fail(const char *));
+NORETURN(void kgio_rd_sys_fail(const char *));
+/*
+ * we know MSG_DONTWAIT works properly on all stream sockets under Linux
+ * we can define this macro for other platforms as people care and
+ * notice.
+ */
+# if defined(__linux__)
+# define USE_MSG_DONTWAIT
+# endif
+
+#ifdef USE_MSG_DONTWAIT
+/* we don't need these variants, we call kgio_autopush_send/recv directly */
+static inline void kgio_autopush_write(VALUE io) { }
+#else
+static inline void kgio_autopush_write(VALUE io) { kgio_autopush_send(io); }
+#endif
#endif /* KGIO_H */