If you can reuse result of `opendir(dirname)` why you couldn't reuse result
of `Dir.at(dirname)` ?
29.08.2014 11:55 ݧ٧ӧѧ֧ݧ "Eric Wong" <normalperson / yhbt.net> ߧѧڧѧ:

> 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.
>