diff options
author | Christopher Faylor <me@cgf.cx> | 2005-10-23 23:47:45 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2005-10-23 23:47:45 +0000 |
commit | 82c925af80cb4493cc15861c18fea64c57c2ee60 (patch) | |
tree | 41f157a058cabbec22fcd979bb5c63730699c3ee /winsup/cygwin/times.cc | |
parent | c2c020d1fb082baff8dfd2f2ca93c66bf7151bd0 (diff) | |
download | cygnal-82c925af80cb4493cc15861c18fea64c57c2ee60.tar.gz cygnal-82c925af80cb4493cc15861c18fea64c57c2ee60.tar.bz2 cygnal-82c925af80cb4493cc15861c18fea64c57c2ee60.zip |
* cygheap.h (cygheap_fdenum::cygheap_fdenum): Record locked state or suffer
deadlocks.
(class locked_process): Move to another header.
* sync.h (lock_process): Define here.
* cygtls.cc (_cygtls::fixup_after_fork): Reset spinning state as well as
stacklock state.
* dcrt0.cc (lock_process::locker): Define.
(dtable::lock_cs): Delete.
* dtable.cc (dtable_init): Eliminate call to init_lock().
(dtable::fixup_after_fork): Ditto.
(dtable::init_lock): Delete definition.
* dtable.h (dtable::init_lock): Delete declaration.
(dtable::lock): Use process lock rather than dtable-specific lock.
(dtable::unlock): Ditto.
* sigproc.cc (sigproc_init): Minor change to debugging output.
* times.cc (utime_worker): Use build_fh_pc rather than reinterpreting the posix
path name again. Return any error from path_conv immediately.
Diffstat (limited to 'winsup/cygwin/times.cc')
-rw-r--r-- | winsup/cygwin/times.cc | 58 |
1 files changed, 32 insertions, 26 deletions
diff --git a/winsup/cygwin/times.cc b/winsup/cygwin/times.cc index 1c28c51e3..4ceb093ef 100644 --- a/winsup/cygwin/times.cc +++ b/winsup/cygwin/times.cc @@ -445,36 +445,42 @@ static int utimes_worker (const char *path, const struct timeval *tvp, int nofollow) { int res = -1; - path_conv win32 (path, nofollow ? PC_SYM_NOFOLLOW : PC_SYM_FOLLOW); - fhandler_base *fh = NULL; - bool fromfd = false; - - cygheap_fdenum cfd; - while (cfd.next () >= 0) - if (cfd->get_access () & (FILE_WRITE_ATTRIBUTES | GENERIC_WRITE) - && strcmp (cfd->get_win32_name (), win32) == 0) - { - fh = cfd; - fromfd = true; - break; - } - - if (!fh) - { - if (!(fh = build_fh_name (path, NULL, PC_SYM_FOLLOW))) - goto error; + path_conv win32 (path, PC_POSIX | (nofollow ? PC_SYM_NOFOLLOW : PC_SYM_FOLLOW)); - if (fh->error ()) + if (win32.error) + set_errno (win32.error); + else { - debug_printf ("got %d error from build_fh_name", fh->error ()); - set_errno (fh->error ()); - } - } + fhandler_base *fh = NULL; + bool fromfd = false; + + cygheap_fdenum cfd; + while (cfd.next () >= 0) + if (cfd->get_access () & (FILE_WRITE_ATTRIBUTES | GENERIC_WRITE) + && strcmp (cfd->get_win32_name (), win32) == 0) + { + fh = cfd; + fromfd = true; + break; + } - res = fh->utimes (tvp); + if (!fh) + { + if (!(fh = build_fh_pc (win32))) + goto error; + + if (fh->error ()) + { + debug_printf ("got %d error from build_fh_name", fh->error ()); + set_errno (fh->error ()); + } + } - if (!fromfd) - delete fh; + res = fh->utimes (tvp); + + if (!fromfd) + delete fh; + } error: syscall_printf ("%d = utimes (%s, %p)", res, path, tvp); |