On Thu, 2008-08-21 at 17:34 -0400, Jim Davidson wrote: > So, technically this was a case where > we dynamically created code which was later read by ADP (which had the > same dev/inode cache stuff as fastpath). However, this was done > carefully: > > -- Tcl-level mutex/condition variables to ensure only one thread did > the "hard" work even if several were interested in the result > -- Careful write to a non .adp extension, unique temp file > -- Atomic rename in place when ready > > It was a combination of traditional atomic Unix filesystem semantics > and newer thread synchronization at the Tcl level used to avoid ever > getting some mutant result.
Here is an example using Tcl level commands (although a hidden use of mutex/condition vars: # save datastore to file # Note: a data.tmp file is created. If writing to this # succeeds, this is renamed to the data file, hopefully # atomically replacing it # Note2: the data.tmp file is not a lock file, it is used # to avoid a half written file in the event of power loss # or process exit. proc ::datastore::save { store } { .... set LockID [lock $store] if {[catch { set FD [open ${dataFileroot}.tmp w+] fconfigure $FD -translation binary -encoding binary puts $FD "$out" close $FD file rename -force ${dataFileroot}.tmp $dataFileroot } err ]} { unlock $store $LockID error $err "::datastore::save error saving store $store" } unlock $store $LockID } But it is very difficult (impossible) to safely read/write files unless you can synchronize access (you need cooperation) and/or use atomic file operations (serialize access). The above example uses both. tom jackson -- AOLserver - http://www.aolserver.com/ To Remove yourself from this list, simply send an email to <[EMAIL PROTECTED]> with the body of "SIGNOFF AOLSERVER" in the email message. You can leave the Subject: field of your email blank.