Project

General

Profile

Actions

Feature #9785

closed

Feature Proposal: Dir.chdir Thread Safety

Added by schneems (Richard Schneeman) almost 10 years ago. Updated almost 10 years ago.

Status:
Rejected
Assignee:
-
Target version:
[ruby-core:62217]

Description

I am proposing that Dir.chdir with a block be local to the current thread and any threads that are created inside of that block. FileUtils.cd and FileUtils.chdir should also behave the same way.

Currently Dir.chdir will change the directory for the entire process. This makes writing a program that modifies different directories in threads very difficult. Here is some ruby code that demonstrates the problem:

# /tmp/code.rb

require 'fileutils'

FileUtils.mkdir_p("/tmp/foo")
FileUtils.mkdir_p("/tmp/bar")


threads = []
threads << Thread.new do
  Dir.chdir("/tmp/foo") do
    puts "Thread in Dir.chdir('/tmp/foo') pwd: #{`pwd`}"
  end
end


threads << Thread.new do
  puts "Thread without Dir.chdir        pwd: #{`pwd`}"
end

threads.map(&:join)

When you run it you get different results:

$ ruby /tmp/code.rb
Thread without Dir.chdir        pwd: /tmp
Thread in Dir.chdir('/tmp/foo') pwd: /private/tmp/foo

$ ruby /tmp/code.rb
Thread in Dir.chdir('/tmp/foo') pwd: /private/tmp/foo
Thread without Dir.chdir        pwd: /private/tmp/foo

This is because Dir.chdir is not limited to the scope of the block but rather changes the working directory globally for the entire process including different threads.

Threads in MRI are very good for reading and writing to the disk, however many times a programmer wishes to read or write to disk they will want to use Dir.chdir. The current behavior of Dir.chdir prevents a programmer from changing directory inside of threads and can be very confusing for anyone who does not know this behavior.

For a better programming experience either we can make Dir.chdir thread aware, or introduce a new way to change the directory inside of a new thread such as Dir.threadsafe_chdir, I believe the first option is the best.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0