[racket] Deadlock with FIFO files

From: Matthew Flatt (mflatt at cs.utah.edu)
Date: Sun Oct 26 11:14:13 EDT 2014

It looks like kqueue() is broken for FIFOs on Mac OS X. See the
enclosed "kqueue_fifo.c". Unless I'm confused (a review of the enclosed
program would be welcome), adding a kqueue event to watch for FIFO
input disables an event that watches for FIFO output space, or
something like that.

I enabled the use of kqueue() on FIFOs only in June. I'll disable it
again.

At Sat, 25 Oct 2014 21:06:54 -0700, Eric Dobson wrote:
> I'm attempting to use FIFOs as a simple IPC mechanism and I'm getting
> into a deadlock. I've simplified my program to the following and am
> still getting deadlocks. I believe that this shouldn't have an issues,
> but I might be wrong about that. Am I doing something wrong, or might
> this be a bug in the IO system? I'm running on OS X 10.9.5 if that is
> relevant.
> 
> It usually gets stuck at around 10-11 thousand.
> 
> 
> #lang racket
> 
> (define the-fifo-path "the-fifo")
> 
> (when (file-exists? the-fifo-path)
>   (delete-file the-fifo-path))
> 
> (system "mkfifo the-fifo")
> 
> (thread
>   (lambda ()
>     (call-with-output-file* the-fifo-path #:exists 'append
>       (lambda (port)
>         (file-stream-buffer-mode port 'none)
>         (let loop ([i 0])
>           (printf "Writing ~a~n" i)
>           (write i port)
>           (newline port)
>           (loop (add1 i)))))))
> 
> (call-with-input-file* the-fifo-path
>   (lambda (port)
>     (file-stream-buffer-mode port 'none)
>     (let loop ()
>       (displayln "Reading")
>       (define v (read-line port))
>       (unless (eof-object? v)
>         (printf "Read ~a~n" v)
>         (loop)))))
> ____________________
>   Racket Users list:
>   http://lists.racket-lang.org/users
-------------- next part --------------
A non-text attachment was scrubbed...
Name: kqueue_fifo.c
Type: application/octet-stream
Size: 2759 bytes
Desc: not available
URL: <http://lists.racket-lang.org/users/archive/attachments/20141026/d66a5539/attachment.obj>

Posted on the users mailing list.