You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@apr.apache.org by Erik Huelsmann <eh...@gmail.com> on 2007/09/11 23:25:20 UTC
EISDIR / EPERM not categorised in APR_STATUS_IS_* macros
While working on changing some of the working copy library in
Subversion, I'm trying to eliminate stat() calls (apr_stat()) in order
to speed up overall operation.
Very often, Subversion libsvn_wc uses this pattern:
svn_io_check_path() -> retrieves a path kind using apr_stat()
if (kind == directory)
do_dir_thing();
else
do_file_thing();
Where dir and file thing could be just removal.
The common case in the routines I'm looking at happens to be file
removal. So, to reduce the number of stats, I want to replace the
stat()+unlink() with a single unlink(), checking the result for
certain types of failure.
Reading the man 2 unlink page, EPERM is returned for POSIXy unices
when deleting a directory, whereas EISDIR is returned on Linux. (MSDN
isn't quite clear about Win32 behaviour...)
Neither EPERM nor EISDIR have been categorised in any of the
APR_STATUS_IS_* macros. I searched the mailing list archives at MARC,
but found only an old mail by Branko which suggests this part of the
error codes is unfinished business. Now, before I start working up any
patches: Is that true, or is this missing with intent?
Thanks!
bye,
Erik.
Re: EISDIR / EPERM not categorised in APR_STATUS_IS_* macros
Posted by Erik Huelsmann <eh...@gmail.com>.
On 9/13/07, Joe Orton <jo...@redhat.com> wrote:
> On Tue, Sep 11, 2007 at 11:25:20PM +0200, Erik Huelsmann wrote:
> > While working on changing some of the working copy library in
> > Subversion, I'm trying to eliminate stat() calls (apr_stat()) in order
> > to speed up overall operation.
> >
> > Very often, Subversion libsvn_wc uses this pattern:
> >
> > svn_io_check_path() -> retrieves a path kind using apr_stat()
> > if (kind == directory)
> > do_dir_thing();
> > else
> > do_file_thing();
> >
> > Where dir and file thing could be just removal.
> >
> > The common case in the routines I'm looking at happens to be file
> > removal. So, to reduce the number of stats, I want to replace the
> > stat()+unlink() with a single unlink(), checking the result for
> > certain types of failure.
>
> Is this when dealing with files discovered by use apr_dir_*()? (i.e.
> why isn't the filetype hint used)
Not in all cases: in most cases it loops over the list of versioned
items ith the current directory (which are stored in a file). That
list holds the type of the entry that *should* be on disk, but,
ofcourse, that's not a guarantee we'll actually find a file on disk if
the versioned item is a file.
> > Reading the man 2 unlink page, EPERM is returned for POSIXy unices
> > when deleting a directory, whereas EISDIR is returned on Linux. (MSDN
> > isn't quite clear about Win32 behaviour...)
> >
> > Neither EPERM nor EISDIR have been categorised in any of the
> > APR_STATUS_IS_* macros. I searched the mailing list archives at MARC,
> > but found only an old mail by Branko which suggests this part of the
> > error codes is unfinished business. Now, before I start working up any
> > patches: Is that true, or is this missing with intent?
>
> Hmm, what exactly are you looking for here? An APR_STATUS_* code which
> means exactly "this apr_status_t value if returned by apr_file_remove()
> means the file is a directory"? Or just an APR_STATUS_IS_ESDIR()
> wrapper which is 0 #ifndef EISDIR?
The former (ie the APR_STATUS_* code/macro to check the return value
of apr_file_remove()).
bye,
Erik.
Re: EISDIR / EPERM not categorised in APR_STATUS_IS_* macros
Posted by Joe Orton <jo...@redhat.com>.
On Tue, Sep 11, 2007 at 11:25:20PM +0200, Erik Huelsmann wrote:
> While working on changing some of the working copy library in
> Subversion, I'm trying to eliminate stat() calls (apr_stat()) in order
> to speed up overall operation.
>
> Very often, Subversion libsvn_wc uses this pattern:
>
> svn_io_check_path() -> retrieves a path kind using apr_stat()
> if (kind == directory)
> do_dir_thing();
> else
> do_file_thing();
>
> Where dir and file thing could be just removal.
>
> The common case in the routines I'm looking at happens to be file
> removal. So, to reduce the number of stats, I want to replace the
> stat()+unlink() with a single unlink(), checking the result for
> certain types of failure.
Is this when dealing with files discovered by use apr_dir_*()? (i.e.
why isn't the filetype hint used)
> Reading the man 2 unlink page, EPERM is returned for POSIXy unices
> when deleting a directory, whereas EISDIR is returned on Linux. (MSDN
> isn't quite clear about Win32 behaviour...)
>
> Neither EPERM nor EISDIR have been categorised in any of the
> APR_STATUS_IS_* macros. I searched the mailing list archives at MARC,
> but found only an old mail by Branko which suggests this part of the
> error codes is unfinished business. Now, before I start working up any
> patches: Is that true, or is this missing with intent?
Hmm, what exactly are you looking for here? An APR_STATUS_* code which
means exactly "this apr_status_t value if returned by apr_file_remove()
means the file is a directory"? Or just an APR_STATUS_IS_ESDIR()
wrapper which is 0 #ifndef EISDIR?
Regards,
joe