[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

close on synonym streams, etc



    Date: 18 Aug 86 20:25:45 EDT
    From: Charles Hedrick <HEDRICK@RED.RUTGERS.EDU>

    ... I could conceive of implementations where buffering is done 
    in each stream.  In that case, it might be a good idea to close 
    a synonym or broadcast stream, in order to make sure that any 
    buffered characters are taken care of and any cleanup is done. 

It looks to me like this issue is adequately addressed by the presence
of FINISH-OUTPUT and FORCE-OUTPUT. Perhaps the documentation could be
clearer on that point.

    ... If you intend to outlaw close on one of these composite streams,
    then you should mention this fact clearly where synonym and broadcast
    streams are defined, and note that this means that they must be
    implemented in such a way that a close is not required when you are
    finished using them.

Indeed, the documentation should be clear about these points.

It seems to me, however, that the only point to CLOSE is that it 
allows the freeing of things like operating system "channels" 
which are often critical resources. In that respect, it's like 
a fast GC. If they weren't critical resources, I assume we'd 
just drop pointers to streams and let the GC take care of 
straightening out the resources in its own sweet time. 

Since echo and broadcast streams are presumably just lisp objects 
which have slots containing other streams, I see no reason to worry
about fast GC of them. Statistically, I bet their components will
tend to (not really coincidentally) get closed anyway by other
mechanisms. eg, consider:

 (WITH-OPEN-FILE (FILE-STREAM ...)
   (LET ((ECHO-STREAM (MAKE-ECHO-STREAM STREAM *TERMINAL-IO*)))
     ...))

The file stream will get closed fine by the WITH-OPEN-FILE. The echo
stream (holding the closed file stream) will eventually get cleaned 
up by the GC. That should be fine. No one's going to miss the couple
of conses which is presumably the only resource being used in the
meantime.

It's true that there may be certain situations where you might think
you want ECHO-STREAM-P, ECHO-STREAM-INPUT-STREAM, and 
ECHO-STREAM-OUTPUT-STREAM operations in order to clean up the loose 
ends. Eg, you might have done:

 (DEFVAR *ECHO-STREAM* (MAKE-ECHO-STREAM (OPEN ...) *TERMINAL-IO*))

and maybe you later want to close the encapsulated real stream, but my
feeling is that it was so easy for you to have done:

 (DEFVAR *FILE-STREAM* (OPEN ...))
 (DEFVAR *ECHO-STREAM* (MAKE-ECHO-STREAM *FILE-STREAM* *TERMINAL-IO*))

that there just isn't any way to claim that the language didn't let 
you do what you wanted to do. In fact, if someone else wrote the module 
that gave you the pointer to the echo stream and that person wouldn't 
give you the encapsulated stream, maybe it was for a reason. If so, 
you're asking a lot by claiming it should be ok to be closing that 
encapsulated stream...