From: quaeler@... Date: 2018-07-30T16:36:01+00:00 Subject: [ruby-core:88210] [Ruby trunk Bug#14009] macOS High Sierra and “fork” compatibility Issue #14009 has been updated by quaeler (loki der quaeler). nagachika (Tomoyuki Chikanaga) wrote: > ruby_2_4 r61358 merged revision(s) 60182. With 2.4.4 (ruby 2.4.4p296 (2018-03-28 revision 63013) [x86_64-darwin17]), I am still seeing 09:27:49 processor.1 | objc[44872]: +[__NSCFConstantString initialize] may have been in progress in another thread when fork() was called. 09:27:49 processor.1 | objc[44872]: +[__NSCFConstantString initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug. Shouldn't this be fixed since the backport happened? ---------------------------------------- Bug #14009: macOS High Sierra and ���fork��� compatibility https://bugs.ruby-lang.org/issues/14009#change-73230 * Author: ticky (Jessica Stokes) * Status: Closed * Priority: Normal * Assignee: * Target version: * ruby -v: ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin17] * Backport: 2.3: DONE, 2.4: DONE ---------------------------------------- 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: ~~~ ruby # Work around macOS 10.13 and later being very picky about # `fork` usage and interactions with Objective-C code # see: 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. :) -- https://bugs.ruby-lang.org/ Unsubscribe: