The Clozure CL implementation has added additional keywords to OPEN, including the :SHARING keyword which controls the access to the stream by multiple threads. The default value is :PRIVATE, which allows access to only the thread that created the stream. More info here: http://openmcl.clozure.com/manual/chapter9.1.html#CCL-Stream-Extensions
I was using cl-prevalence as a backend for a Weblocks application when I stumbled upon thread locking errors while accessing the site with multiple browsers. Setting :SHARING to nil fixed my problem.
Should this be the default behavior for cl-prevalence? After skimming the code, it appears cl-prevalence has it's own locking mechanisms, making Clozure's extra keyword arguments unnecessary. I also noticed in the TODO file that porting to ccl is on the list.
In case anyone is curious, here's how to reproduce the error in Weblocks:
1. Create a new project as outlined in the bottom of http://trac.common-lisp.net/cl-weblocks/wiki/UserManual
2. Edit you init-session.lisp file to this:
(defun init-user-session (root) (setf (widget-children root) (list (make-grid-edit))))
(defclass thing () ((id :initform nil :initarg :id :accessor thing-id :type (or null integer)) (name :initform nil :initarg :name :accessor thing-name)))
(defun make-grid-edit () (make-instance 'gridedit :data-class 'thing))
3. Open the site using two different browsers. Add a record using each browser. The second time you add a record, you receive this error:
SIMPLE-ERROR: Stream #<BASIC-FILE-CHARACTER-OUTPUT-STREAM ("/<path-to-file>/transaction-log.xml"/15 ISO-8859-1) #x1987FB3E> is private to #<PROCESS Hunchentoot worker (client: 127.0.0.1:47448)(14) [Reset] #x1983AA9E>