[gambit-list] Flushing not done ?

Marc Feeley feeley at iro.umontreal.ca
Thu May 31 19:15:04 EDT 2007


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1


On 31-May-07, at 6:26 PM, Adrien Pierard wrote:

> Here is the code :
>
> (let ((o (open-output-file "/tmp/flushed-data")))
>   (display "whirl" o)
>   (display "\n" o))
>
> I thought that when the gambit process cleanly finishes, it would  
> flush
> the port, though it didn't.
> I had to append a (close-output-port o) in order to have my data  
> dumped.

You have to call (close-output-port o), otherwise the runtime system  
does not know that you are done with port "o".  All buffering is done  
at the Scheme level, so your calls to "display" are merely filling  
some internal Scheme buffers (Scheme strings and u8vectors).  The OS  
is not aware of these buffers.  It is when you do a (force-output- 
port o) or (close-output-port o) or when the internal buffer is full  
that the data is sent to the OS.

If you dislike this, you can always disable the buffering, or add a  
finalizer that closes the port, for example:

(define open-output-file
   (let ((orig-open-output-file open-output-file))
     (lambda (filename)
       (let ((port (orig-open-output-file filename)))
         (make-will port close-output-port)
         port))))

(let ((o (open-output-file "out")))
   (display "foo" o)
   (display "bar\n" o))

(##gc) ;; GC will call finalizer

Marc

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.3 (Darwin)

iD8DBQFGX1b4//V9Zc2T/v4RAtdbAJ9kkrwyAUKfiTypL4+UN1hvUaq1wACfTBDB
Pdj66+zPRsddKTlLa5oIvVE=
=/Vcq
-----END PGP SIGNATURE-----



More information about the Gambit-list mailing list