[#64517] Fw: Re: Ruby and Rails to become Apache Incubator Project — Tetsuya Kitahata <kitahata@99.alumni.u-tokyo.ac.jp>

What do you think? >> Ruby developers

13 messages 2014/08/23

[#64615] [ruby-trunk - Feature #10181] [Open] New method File.openat() — oss-ruby-lang@...

Issue #10181 has been reported by Technorama Ltd..

10 messages 2014/08/28
[#64616] Re: [ruby-trunk - Feature #10181] [Open] New method File.openat() — Eric Wong <normalperson@...> 2014/08/28

I like this feature.

[#64671] Fwd: [ruby-changes:35240] normal:r47322 (trunk): symbol.c (rb_sym2id): do not return garbage object — SASADA Koichi <ko1@...>

Why this fix solve your problem?

9 messages 2014/08/30
[#64672] Re: Fwd: [ruby-changes:35240] normal:r47322 (trunk): symbol.c (rb_sym2id): do not return garbage object — SASADA Koichi <ko1@...> 2014/08/30

(2014/08/30 8:50), SASADA Koichi wrote:

[ruby-core:64634] Re: [ruby-trunk - Feature #10181] [Open] New method File.openat()

From: Eric Wong <normalperson@...>
Date: 2014-08-29 07:55:09 UTC
List: ruby-core #64634
Joel VanderWerf <joelvanderwerf@gmail.com> wrote:
> On 08/28/2014 02:53 PM, Eric Wong wrote:
> >I like this feature.
> >
> >If matz approves, I assume you also want to add other *at functions?
> >e.g. fstatat, renameat, unlinkat, mkdirat, etc.
> 
> Hm, that suggests...
> 
> Dir.at(...).open(...)
> Dir.at(...).fstat(...)

How would that be implemented?

I don't see it working...

The reason for *at functions is the file descriptor points to the
same file (directory) handle across multiple functions; in other words
it's a way to avoid race conditions by creating a private reference
to a container object (an FS directory)

The file descriptor points to the same directory regardless of whether
it's renamed (moved) or not.

One can think of FS operations as operations on Ruby hashes.
In your example, it might be like the following, assuming
"fs" is a giant hash protected by OS-wide locks:

    # Dir.at(dirname).open("foo")
    fs[dirname]["foo"]  # open("/dirname/foo", ...)
                               # another thread may replace/remove
                               # root[dirname] here
    # Dir.at(dirname).open("bar")
    fs[dirname]["bar"]  # open("/dirname/bar", ...)

We cannot guarantee Dir.at(dirname) / fs[dirname] returns
the same value twice when called in succession.

openat lets you work like this:

    dh = fs[dirname] # dh = opendir(dirname)
    dh["foo"] # openat(fileno(dh), "foo", ...)
    dh["bar"] # openat(fileno(dh), "bar", ...)
    ...

Other threads can remove/replace/rename fs[dirname] with another
directory, but the directory handle from the initial lookup
remains valid to the thread which opened it.

In This Thread