Project

General

Profile

ActionsLike0

Bug #14009

closed

macOS High Sierra and “fork” compatibility

Added by ticky (Jessica Stokes) over 7 years ago. Updated over 6 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin17]
[ruby-core:83239]

Description

This was originally discussed on the issue tracker for Puma (https://github.com/puma/puma/issues/1421), however, it is possible that it would make more sense for inclusion in the Ruby implementation itself.

macOS High Sierra has changed the behaviour of the fork syscall such that initialising Objective-C APIs in forked processes are treated as errors. (see http://sealiesoftware.com/blog/archive/2017/6/5/Objective-C_and_fork_in_macOS_1013.html for more details)

This means that many applications which use forking to process concurrently will forcibly crash if the forked process calls out to any Objective-C library when Objective-C was not already initialised in the host process. This includes Puma, Unicorn, iodine and Passenger.

A workaround I proposed for Puma was to implicitly load the Objective-C runtime before performing any forks (https://github.com/puma/puma/issues/1421#issuecomment-332650703). This causes forked processes using other Objective-C APIs to not crash.

The workaround (specific to Puma’s DSL) was:

# Work around macOS 10.13 and later being very picky about
# `fork` usage and interactions with Objective-C code
# see: <https://github.com/puma/puma/issues/1421>
if /darwin/ =~ RUBY_PLATFORM
  before_fork do
    require 'fiddle'
    # Dynamically load Foundation.framework, ~implicitly~ initialising
    # the Objective-C runtime before any forking happens in Puma
    Fiddle.dlopen '/System/Library/Frameworks/Foundation.framework/Foundation'
  end
end

A similar fix has now been included in Passenger (https://github.com/phusion/passenger/blob/2a55a84e5de721d8bd806a8fea0bcedf27583c29/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb#L84-L105).

It was, however, proposed that it might make more sense for Ruby on macOS High Sierra and onward to implicitly initialise the Objective-C framework itself, so that forked processes work roughly as expected even if they intend to use Objective-C APIs.

I understand that this is a heavy-handed move, but it seems to me that this relatively common technique will remain broken in Ruby unless everyone deploys a workaround (iodine has already expressed disinterest in doing so) or Ruby adopts one at the higher level.

This issue is also applicable to all Ruby versions which support fork and run on macOS High Sierra.

Thank you for your time. :)


Related issues 1 (0 open1 closed)

Related to Ruby - Feature #5446: at_fork callback APIClosedkosaki (Motohiro KOSAKI)Actions

Added by nobu (Nobuyoshi Nakada) over 7 years ago

Revision 8b182a7f

configure.ac: link Foundation framework

  • configure.ac (XLDFLAGS): link against Foundation framework and
    let __NSPlaceholderDictionary initialize, to get rid of crash
    after fork on macOS High Sierra. [ruby-core:83239] [Bug #14009]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60182 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Added by nagachika (Tomoyuki Chikanaga) over 7 years ago

Revision 1a028670

merge revision(s) 60182: [Backport #14009]

    configure.ac: link Foundation framework

    * configure.ac (XLDFLAGS): link against Foundation framework and
      let __NSPlaceholderDictionary initialize, to get rid of crash
      after fork on macOS High Sierra.  [ruby-core:83239] [Bug #14009]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@61358 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Added by U.Nakamura about 7 years ago

Revision 766c3744

merge revision(s) 60182: [Backport #14009]

    configure.ac: link Foundation framework

    * configure.ac (XLDFLAGS): link against Foundation framework and
      let __NSPlaceholderDictionary initialize, to get rid of crash
      after fork on macOS High Sierra.  [ruby-core:83239] [Bug #14009]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_3@62144 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

ActionsLike0

Also available in: Atom PDF