sleepy_penguin RubyGem user+dev discussion/patches/pulls/bugs/help
 help / color / mirror / code / Atom feed
* [sleepy.penguin] [PATCH 0/3] minor cleanups and small change
@ 2013-04-13 19:54 Eric Wong
  2013-04-13 19:54 ` [sleepy.penguin] [PATCH 1/3] README: update description Eric Wong
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Eric Wong @ 2013-04-13 19:54 UTC (permalink / raw)
  To: sleepy.penguin

All pushed to master on git://bogomips.org/sleepy_penguin

Eric Wong (3):
      README: update description
      extconf: remove pthread checks
      set close-on-exec by default under Ruby 2.0


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [sleepy.penguin] [PATCH 1/3] README: update description
  2013-04-13 19:54 [sleepy.penguin] [PATCH 0/3] minor cleanups and small change Eric Wong
@ 2013-04-13 19:54 ` Eric Wong
  2013-04-13 19:54 ` [sleepy.penguin] [PATCH 2/3] extconf: remove pthread checks Eric Wong
  2013-04-13 19:54 ` [sleepy.penguin] [PATCH 3/3] set close-on-exec by default under Ruby 2.0 Eric Wong
  2 siblings, 0 replies; 4+ messages in thread
From: Eric Wong @ 2013-04-13 19:54 UTC (permalink / raw)
  To: sleepy.penguin

Ruby 2.0 is out and we're compatible.  Also, we've always
supported EPOLLONESHOT, promote it.
---
 README | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/README b/README
index 2685707..551ce8e 100644
--- a/README
+++ b/README
@@ -6,14 +6,15 @@ timerfd, inotify, and epoll interfaces are provided.
 
 == Features
 
-* Thread-safe blocking operations under both Ruby 1.8 and 1.9.
+* Thread-safe blocking operations for all versions of Ruby
 
 * IO-like objects are backwards-compatible with IO.select.
 
 * Epoll interface is fork-safe and GC-safe
 
-* Unlike portable event frameworks, the Linux-only Epoll interface
-  allows using edge-triggered I/O for possibly improved performance
+* Unlike portable event frameworks, the Linux-only epoll interfaces
+  allow using edge-triggered or one-shot notifications for possibly
+  improved performance
 
 * Fully-documented and user-friendly API
 
-- 
1.8.2.1.367.gc875ca7



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [sleepy.penguin] [PATCH 2/3] extconf: remove pthread checks
  2013-04-13 19:54 [sleepy.penguin] [PATCH 0/3] minor cleanups and small change Eric Wong
  2013-04-13 19:54 ` [sleepy.penguin] [PATCH 1/3] README: update description Eric Wong
@ 2013-04-13 19:54 ` Eric Wong
  2013-04-13 19:54 ` [sleepy.penguin] [PATCH 3/3] set close-on-exec by default under Ruby 2.0 Eric Wong
  2 siblings, 0 replies; 4+ messages in thread
From: Eric Wong @ 2013-04-13 19:54 UTC (permalink / raw)
  To: sleepy.penguin

We no longer need to use pthread_* functionality.
---
 ext/sleepy_penguin/extconf.rb | 2 --
 1 file changed, 2 deletions(-)

diff --git a/ext/sleepy_penguin/extconf.rb b/ext/sleepy_penguin/extconf.rb
index 5e2c223..46aeb00 100644
--- a/ext/sleepy_penguin/extconf.rb
+++ b/ext/sleepy_penguin/extconf.rb
@@ -1,6 +1,5 @@
 require 'mkmf'
 have_header('sys/epoll.h') or abort 'sys/epoll.h not found'
-have_header("pthread.h") or abort 'pthread.h not found'
 have_header('sys/eventfd.h')
 
 # it's impossible to use signalfd reliably with Ruby since Ruby currently
@@ -16,5 +15,4 @@
 have_func('rb_thread_io_blocking_region')
 have_func('rb_thread_fd_close')
 have_func('rb_update_max_fd')
-have_library('pthread')
 create_makefile('sleepy_penguin_ext')
-- 
1.8.2.1.367.gc875ca7



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [sleepy.penguin] [PATCH 3/3] set close-on-exec by default under Ruby 2.0
  2013-04-13 19:54 [sleepy.penguin] [PATCH 0/3] minor cleanups and small change Eric Wong
  2013-04-13 19:54 ` [sleepy.penguin] [PATCH 1/3] README: update description Eric Wong
  2013-04-13 19:54 ` [sleepy.penguin] [PATCH 2/3] extconf: remove pthread checks Eric Wong
@ 2013-04-13 19:54 ` Eric Wong
  2 siblings, 0 replies; 4+ messages in thread
From: Eric Wong @ 2013-04-13 19:54 UTC (permalink / raw)
  To: sleepy.penguin

Ruby 2.0 creates file descriptors with the close-on-exec flag
specified by default.  Unless a user specifies flags explicitly,
assume the default is to set the close-on-exec.

This does not change behavior of Ruby 1.9 and earlier.
---
 ext/sleepy_penguin/epoll.c          | 3 ++-
 ext/sleepy_penguin/eventfd.c        | 2 +-
 ext/sleepy_penguin/extconf.rb       | 1 +
 ext/sleepy_penguin/inotify.c        | 2 +-
 ext/sleepy_penguin/signalfd.c       | 5 +++--
 ext/sleepy_penguin/sleepy_penguin.h | 7 ++++++-
 ext/sleepy_penguin/timerfd.c        | 6 +++---
 ext/sleepy_penguin/util.c           | 4 ++--
 test/test_epoll.rb                  | 6 +++++-
 test/test_eventfd.rb                | 5 +++++
 test/test_inotify.rb                | 5 +++++
 test/test_timerfd.rb                | 5 +++++
 12 files changed, 39 insertions(+), 12 deletions(-)

diff --git a/ext/sleepy_penguin/epoll.c b/ext/sleepy_penguin/epoll.c
index 46183ca..ca19786 100644
--- a/ext/sleepy_penguin/epoll.c
+++ b/ext/sleepy_penguin/epoll.c
@@ -96,7 +96,8 @@ out:
  */
 static VALUE s_new(VALUE klass, VALUE _flags)
 {
-	int flags = rb_sp_get_flags(klass, _flags);
+	int default_flags = RB_SP_CLOEXEC(EPOLL_CLOEXEC);
+	int flags = rb_sp_get_flags(klass, _flags, default_flags);
 	int fd = epoll_create1(flags);
 	VALUE rv;
 
diff --git a/ext/sleepy_penguin/eventfd.c b/ext/sleepy_penguin/eventfd.c
index 3ba8397..1713fdd 100644
--- a/ext/sleepy_penguin/eventfd.c
+++ b/ext/sleepy_penguin/eventfd.c
@@ -27,7 +27,7 @@ static VALUE s_new(int argc, VALUE *argv, VALUE klass)
 
 	rb_scan_args(argc, argv, "11", &_initval, &_flags);
 	initval = NUM2UINT(_initval);
-	flags = rb_sp_get_flags(klass, _flags);
+	flags = rb_sp_get_flags(klass, _flags, RB_SP_CLOEXEC(EFD_CLOEXEC));
 
 	fd = eventfd(initval, flags);
 	if (fd == -1) {
diff --git a/ext/sleepy_penguin/extconf.rb b/ext/sleepy_penguin/extconf.rb
index 46aeb00..bd12570 100644
--- a/ext/sleepy_penguin/extconf.rb
+++ b/ext/sleepy_penguin/extconf.rb
@@ -15,4 +15,5 @@
 have_func('rb_thread_io_blocking_region')
 have_func('rb_thread_fd_close')
 have_func('rb_update_max_fd')
+have_func('rb_fd_fix_cloexec')
 create_makefile('sleepy_penguin_ext')
diff --git a/ext/sleepy_penguin/inotify.c b/ext/sleepy_penguin/inotify.c
index 01862ae..6155507 100644
--- a/ext/sleepy_penguin/inotify.c
+++ b/ext/sleepy_penguin/inotify.c
@@ -27,7 +27,7 @@ static VALUE s_new(int argc, VALUE *argv, VALUE klass)
 	int fd;
 
 	rb_scan_args(argc, argv, "01", &_flags);
-	flags = rb_sp_get_flags(klass, _flags);
+	flags = rb_sp_get_flags(klass, _flags, RB_SP_CLOEXEC(IN_CLOEXEC));
 
 	fd = inotify_init1(flags);
 	if (fd == -1) {
diff --git a/ext/sleepy_penguin/signalfd.c b/ext/sleepy_penguin/signalfd.c
index c2c9419..ac5db68 100644
--- a/ext/sleepy_penguin/signalfd.c
+++ b/ext/sleepy_penguin/signalfd.c
@@ -92,7 +92,8 @@ static VALUE update_bang(int argc, VALUE *argv, VALUE self)
 	int rc;
 
 	rb_scan_args(argc, argv, "02", &vmask, &vflags);
-	flags = NIL_P(vflags) ? cur_flags(fd) : rb_sp_get_flags(self, vflags);
+	flags = NIL_P(vflags) ? cur_flags(fd)
+				: rb_sp_get_flags(self, vflags, 0);
 	value2sigset(&mask, vmask);
 
 	rc = signalfd(fd, &mask, flags);
@@ -128,7 +129,7 @@ static VALUE s_new(int argc, VALUE *argv, VALUE klass)
 	int fd;
 
 	rb_scan_args(argc, argv, "02", &vmask, &vflags);
-	flags = rb_sp_get_flags(klass, vflags);
+	flags = rb_sp_get_flags(klass, vflags, RB_SP_CLOEXEC(SFD_CLOEXEC));
 	value2sigset(&mask, vmask);
 
 	fd = signalfd(-1, &mask, flags);
diff --git a/ext/sleepy_penguin/sleepy_penguin.h b/ext/sleepy_penguin/sleepy_penguin.h
index 86c6e5f..a839e83 100644
--- a/ext/sleepy_penguin/sleepy_penguin.h
+++ b/ext/sleepy_penguin/sleepy_penguin.h
@@ -14,7 +14,7 @@
 
 extern size_t rb_sp_l1_cache_line_size;
 unsigned rb_sp_get_uflags(VALUE klass, VALUE flags);
-int rb_sp_get_flags(VALUE klass, VALUE flags);
+int rb_sp_get_flags(VALUE klass, VALUE flags, int default_flags);
 int rb_sp_io_closed(VALUE io);
 int rb_sp_fileno(VALUE io);
 void rb_sp_set_nonblock(int fd);
@@ -69,6 +69,11 @@ static inline VALUE fake_blocking_region(VALUE (*fn)(void *), void *data)
 #define NODOC_CONST(klass,name,value) \
   rb_define_const((klass),(name),(value))
 
+#ifdef HAVE_RB_FD_FIX_CLOEXEC
+#  define RB_SP_CLOEXEC(flag) (flag)
+#else
+#  define RB_SP_CLOEXEC(flag) (0)
+#endif
 
 typedef int rb_sp_waitfn(int fd);
 int rb_sp_wait(rb_sp_waitfn waiter, VALUE obj, int *fd);
diff --git a/ext/sleepy_penguin/timerfd.c b/ext/sleepy_penguin/timerfd.c
index b9e3999..33ef8a7 100644
--- a/ext/sleepy_penguin/timerfd.c
+++ b/ext/sleepy_penguin/timerfd.c
@@ -26,8 +26,8 @@ static VALUE s_new(int argc, VALUE *argv, VALUE klass)
 	int fd;
 
 	rb_scan_args(argc, argv, "02", &cid, &fl);
-	clockid = NIL_P(cid) ? CLOCK_MONOTONIC : rb_sp_get_flags(klass, cid);
-	flags = rb_sp_get_flags(klass, fl);
+	clockid = NIL_P(cid) ? CLOCK_MONOTONIC : rb_sp_get_flags(klass, cid, 0);
+	flags = rb_sp_get_flags(klass, fl, RB_SP_CLOEXEC(TFD_CLOEXEC));
 
 	fd = timerfd_create(clockid, flags);
 	if (fd == -1) {
@@ -66,7 +66,7 @@ static VALUE itimerspec2ary(struct itimerspec *its)
 static VALUE settime(VALUE self, VALUE fl, VALUE interval, VALUE value)
 {
 	int fd = rb_sp_fileno(self);
-	int flags = rb_sp_get_flags(self, fl);
+	int flags = rb_sp_get_flags(self, fl, 0);
 	struct itimerspec old, new;
 
 	value2timespec(&new.it_interval, interval);
diff --git a/ext/sleepy_penguin/util.c b/ext/sleepy_penguin/util.c
index 4ae702d..2423af6 100644
--- a/ext/sleepy_penguin/util.c
+++ b/ext/sleepy_penguin/util.c
@@ -5,10 +5,10 @@ static VALUE klass_for(VALUE klass)
 	return (TYPE(klass) == T_CLASS) ? klass : CLASS_OF(klass);
 }
 
-int rb_sp_get_flags(VALUE klass, VALUE flags)
+int rb_sp_get_flags(VALUE klass, VALUE flags, int default_flags)
 {
 	switch (TYPE(flags)) {
-	case T_NIL: return 0;
+	case T_NIL: return default_flags;
 	case T_FIXNUM: return FIX2INT(flags);
 	case T_BIGNUM: return NUM2INT(flags);
 	case T_SYMBOL:
diff --git a/test/test_epoll.rb b/test/test_epoll.rb
index 1a99dfd..a55a4c3 100644
--- a/test/test_epoll.rb
+++ b/test/test_epoll.rb
@@ -358,7 +358,11 @@ def test_new_cloexec
   def test_new
     @ep.close
     io = Epoll.new.to_io
-    assert_equal 0, io.fcntl(Fcntl::F_GETFD)
+    if RUBY_VERSION.to_f >= 2.0
+      assert_equal 1, io.fcntl(Fcntl::F_GETFD)
+    else
+      assert_equal 0, io.fcntl(Fcntl::F_GETFD)
+    end
   end
 
   def test_delete
diff --git a/test/test_eventfd.rb b/test/test_eventfd.rb
index 84ee307..f04def3 100644
--- a/test/test_eventfd.rb
+++ b/test/test_eventfd.rb
@@ -20,6 +20,11 @@ def test_constants
   def test_new
     efd = EventFD.new 0
     assert_kind_of(IO, efd)
+    if RUBY_VERSION.to_f >= 2.0
+      assert_equal 1, efd.fcntl(Fcntl::F_GETFD)
+    else
+      assert_equal 0, efd.fcntl(Fcntl::F_GETFD)
+    end
   end
 
   def test_new_nonblock
diff --git a/test/test_inotify.rb b/test/test_inotify.rb
index b50a83b..ae6b8ba 100644
--- a/test/test_inotify.rb
+++ b/test/test_inotify.rb
@@ -17,6 +17,11 @@ def teardown
   def test_new
     @ino = Inotify.new
     assert_kind_of(IO, ino)
+    if RUBY_VERSION.to_f >= 2.0
+      assert_equal 1, ino.fcntl(Fcntl::F_GETFD)
+    else
+      assert_equal 0, ino.fcntl(Fcntl::F_GETFD)
+    end
   end
 
   def test_constants
diff --git a/test/test_timerfd.rb b/test/test_timerfd.rb
index 7e102c4..e8dc321 100644
--- a/test/test_timerfd.rb
+++ b/test/test_timerfd.rb
@@ -15,6 +15,11 @@ def test_constants
   def test_create
     tfd = TimerFD.new
     assert_kind_of(IO, tfd)
+    if RUBY_VERSION.to_f >= 2.0
+      assert_equal 1, tfd.fcntl(Fcntl::F_GETFD)
+    else
+      assert_equal 0, tfd.fcntl(Fcntl::F_GETFD)
+    end
   end
 
   def test_create_nonblock
-- 
1.8.2.1.367.gc875ca7



^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2013-04-13 19:54 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-04-13 19:54 [sleepy.penguin] [PATCH 0/3] minor cleanups and small change Eric Wong
2013-04-13 19:54 ` [sleepy.penguin] [PATCH 1/3] README: update description Eric Wong
2013-04-13 19:54 ` [sleepy.penguin] [PATCH 2/3] extconf: remove pthread checks Eric Wong
2013-04-13 19:54 ` [sleepy.penguin] [PATCH 3/3] set close-on-exec by default under Ruby 2.0 Eric Wong

Code repositories for project(s) associated with this public inbox

	https://yhbt.net/sleepy_penguin.git/

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).