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 */