From: Eric Wong <e@80x24.org>
To: unicorn-public@bogomips.org
Subject: [PATCH] favor IO#close_on_exec= over fcntl in 1.9+
Date: Thu, 5 Feb 2015 18:01:23 +0000 [thread overview]
Message-ID: <1423159284-31112-2-git-send-email-e@80x24.org> (raw)
IO#close_on_exec* methods are available since Ruby 1.9.1. It
allows us to use less bytecode as it requires fewer operands and
avoids constant lookups.
---
lib/unicorn.rb | 3 +--
lib/unicorn/http_server.rb | 9 +++------
lib/unicorn/util.rb | 1 +
3 files changed, 5 insertions(+), 8 deletions(-)
diff --git a/lib/unicorn.rb b/lib/unicorn.rb
index 638b846..cfa1656 100644
--- a/lib/unicorn.rb
+++ b/lib/unicorn.rb
@@ -1,5 +1,4 @@
# -*- encoding: binary -*-
-require 'fcntl'
require 'etc'
require 'stringio'
require 'rack'
@@ -100,7 +99,7 @@ module Unicorn
# remove this when we only support Ruby >= 2.0
def self.pipe # :nodoc:
- Kgio::Pipe.new.each { |io| io.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) }
+ Kgio::Pipe.new.each { |io| io.close_on_exec = true }
end
# :startdoc:
end
diff --git a/lib/unicorn/http_server.rb b/lib/unicorn/http_server.rb
index 8a295f0..95a8ffe 100644
--- a/lib/unicorn/http_server.rb
+++ b/lib/unicorn/http_server.rb
@@ -434,10 +434,7 @@ class Unicorn::HttpServer
self.reexec_pid = fork do
listener_fds = {}
LISTENERS.each do |sock|
- # IO#close_on_exec= will be available on any future version of
- # Ruby that sets FD_CLOEXEC by default on new file descriptors
- # ref: http://redmine.ruby-lang.org/issues/5041
- sock.close_on_exec = false if sock.respond_to?(:close_on_exec=)
+ sock.close_on_exec = false
listener_fds[sock.fileno] = sock
end
ENV['UNICORN_FD'] = listener_fds.keys.join(',')
@@ -451,7 +448,7 @@ class Unicorn::HttpServer
next if listener_fds.include?(io)
io = IO.for_fd(io) rescue next
io.autoclose = false
- io.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
+ io.close_on_exec = true
end
# exec(command, hash) works in at least 1.9.1+, but will only be
@@ -607,7 +604,7 @@ class Unicorn::HttpServer
WORKERS.clear
after_fork.call(self, worker) # can drop perms and create listeners
- LISTENERS.each { |sock| sock.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) }
+ LISTENERS.each { |sock| sock.close_on_exec = true }
worker.user(*user) if user.kind_of?(Array) && ! worker.switched
self.timeout /= 2.0 # halve it for select()
diff --git a/lib/unicorn/util.rb b/lib/unicorn/util.rb
index 94c4e37..c7784bd 100644
--- a/lib/unicorn/util.rb
+++ b/lib/unicorn/util.rb
@@ -1,5 +1,6 @@
# -*- encoding: binary -*-
+require 'fcntl'
module Unicorn::Util
# :stopdoc:
--
EW
reply other threads:[~2015-02-05 18:01 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://yhbt.net/unicorn/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1423159284-31112-2-git-send-email-e@80x24.org \
--to=e@80x24.org \
--cc=unicorn-public@bogomips.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://yhbt.net/unicorn.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).