People who have upgraded to macOS High Sierra and who are using a preforking app server such as Puma or Unicorn (with the right settings), may have noticed this error:
objc: +[__NSPlaceholderDictionary 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.
This cryptic error is triggered under the following conditions:
- You are using Unicorn with
preload_app, or Puma in cluster mode, or iodine in prefork mode, or Passenger in smart spawning mode.
- And you are using MRI.
- And your application uses a gem that is either directly or indirectly linked to the macOS Foundation framework.
This error is caused by changes in how
fork() behaves in High Sierra. This article covers:
- What is this and why did Apple change it?
- How are the Puma, Unicorn and Passenger authors responding to this?
- What can you do about it, and do you need to do anything at all?
- What should the wider Ruby ecosystem do?