diff options
| author | dgp <dgp@users.sourceforge.net> | 2018-07-11 17:48:31 (GMT) |
|---|---|---|
| committer | dgp <dgp@users.sourceforge.net> | 2018-07-11 17:48:31 (GMT) |
| commit | 5a177e9aaf0872711b60433ffbb90b3befb7726f (patch) | |
| tree | 9af4e9bf7f8547a104966069efe7042878a2bdc2 | |
| parent | 9bd3b59e1deef204fd29cac25e705bfffd93177d (diff) | |
| parent | 87e508c590246b8559502d220a5e2c7d618ef338 (diff) | |
| download | tcl-5a177e9aaf0872711b60433ffbb90b3befb7726f.zip tcl-5a177e9aaf0872711b60433ffbb90b3befb7726f.tar.gz tcl-5a177e9aaf0872711b60433ffbb90b3befb7726f.tar.bz2 | |
merge 8.7
| -rw-r--r-- | generic/tclFCmd.c | 34 | ||||
| -rw-r--r-- | tests/package.test | 2 |
2 files changed, 21 insertions, 15 deletions
diff --git a/generic/tclFCmd.c b/generic/tclFCmd.c index ddfe3bf..ea2a1c5 100644 --- a/generic/tclFCmd.c +++ b/generic/tclFCmd.c @@ -240,9 +240,13 @@ TclFileMakeDirsCmd( break; } for (j = 0; j < pobjc; j++) { + int errCount = 2; + target = Tcl_FSJoinPath(split, j + 1); Tcl_IncrRefCount(target); + createDir: + /* * Call Tcl_FSStat() so that if target is a symlink that points to * a directory we will create subdirectories in that directory. @@ -269,23 +273,25 @@ TclFileMakeDirsCmd( * subdirectory. */ - if (errno != EEXIST) { - errfile = target; - goto done; - } else if ((Tcl_FSStat(target, &statBuf) == 0) - && S_ISDIR(statBuf.st_mode)) { - /* - * It is a directory that wasn't there before, so keep - * going without error. - */ - - Tcl_ResetResult(interp); - } else { - errfile = target; - goto done; + if (errno == EEXIST) { + /* Be aware other workers could delete it immediately after + * creation, so give this worker still one chance (repeat once), + * see [270f78ca95] for description of the race-condition. + * Don't repeat the create always (to avoid endless loop). */ + if (--errCount > 0) { + goto createDir; + } + /* Already tried, with delete in-between directly after + * creation, so just continue (assume created successful). */ + goto nextPart; } + + /* return with error */ + errfile = target; + goto done; } + nextPart: /* * Forget about this sub-path. */ diff --git a/tests/package.test b/tests/package.test index 2843701..69d9ddb 100644 --- a/tests/package.test +++ b/tests/package.test @@ -23,7 +23,7 @@ catch [list package require -exact Tcltest [info patchlevel]] # Do all this in a slave interp to avoid garbaging the package list set i [interp create] tcltest::loadIntoSlaveInterpreter $i {*}$argv -load {} Tcltest $i +catch [list load {} Tcltest $i] interp eval $i { namespace import -force ::tcltest::* #package forget {*}[package names] |
