Tcl Source Code

View Ticket
Login
Ticket UUID: 710642
Title: Thread-unsafe handling of cwdPathPtr
Type: Bug Version: obsolete: 8.5a0
Submitter: vasiljevic Created on: 2003-03-27 10:27:22
Subsystem: 36. Pathname Management Assigned To: hobbs
Priority: 8 Severity:
Status: Closed Last Modified: 2003-05-14 06:00:25
Resolution: Fixed Closed By: hobbs
    Closed on: 2003-05-13 23:00:25
Description:
The new pluggable filesystem code located in
generic/tclIOUtils.c naively plays with global
Tcl_Obj*, passing them between threads
per-reference and neglecting the proper locks
for all except write operations. 
The spot in question is the global Tcl_Obj *cwdPathPtr.

The net-effect is that paths passed to the OS-calls 
gets garbled, memory is being trashed leading to
process exitus and whole bunch of other ugly things
is happening.

I think this has to be entirely revised, as one can not
simply share Tcl_Objs between threads. One has to 
always make a deep-copy (w/o internal references) 
of the object before passing it to some other thread.

I have some ideas on how to solve this, but it is 
really not that straight-forward, since few of design
issues have to be modified.

This bug is really a show-stopper for MT-apps
therefore the highest priority.
User Comments: hobbs added on 2003-05-14 06:00:25:
Logged In: YES 
user_id=72656

Applied to head with offsets.

vincentdarley added on 2003-05-13 21:24:48:
Logged In: YES 
user_id=32170

Zoran says this should also apply to cvs head.

hobbs added on 2003-05-11 08:23:25:

File Added - 50090: tclIOUtil.c.patch.710642

Logged In: YES 
user_id=72656

I've attached Zoran's latest version (with one minor change to 
init char *str) and commited that to core-8-4-branch.  We 
need a version for the HEAD.  It would also be nice to have 
some sort of tests that exercise this (if possible).

vincentdarley added on 2003-04-11 23:35:49:
Logged In: YES 
user_id=32170

I'll be looking into this soon, now I've resolved the 
various other bugs I was working on.  Your code looks 
like a good template, but I'd like to remove the need 
for 'inner' functions.

vasiljevic added on 2003-04-02 16:11:44:

File Added - 46565: tclIOUtil.c.diff

vasiljevic added on 2003-04-02 16:10:51:
Logged In: YES 
user_id=95086

Sure. It is attached. I did the diff against the 8.4.2 version.
Note that I've used some pretty conservative locks in 
Tcl_FSGetCwd and Tcl_FSChdir. This may be relaxed
eventually.

vincentdarley added on 2003-04-01 00:35:41:
Logged In: YES 
user_id=32170

Can you provide a unified diff (diff -u) for easier 
analysis, please?

vasiljevic added on 2003-03-28 23:28:02:

File Added - 46156: tclIOUtil.c

Logged In: YES 
user_id=95086

Here is my reworked version which uses char* to
hold the cwd. I know it is not 100% good because
a path may contain NULL chars. We might improve this
and store char* and its length. The Tcl_Obj is really 
not usable in MT-environments since it can't be 
deep-copied
with the current duplicate function (i mean path objects).
Anyways, the entire file is attached.

Attachments: