#!/usr/bin/guile \ -e main -s !# (use-modules (ice-9 threads) (ice-9 popen)) (define mutex (make-mutex)) (define message-ready (make-condition-variable)) (define message "") (define (main args) (begin-thread (piper)) (let ((sock #f) (fileno #f)) (lock-mutex mutex) (set! sock (socket AF_INET SOCK_STREAM 0)) (unlock-mutex mutex) (bind sock AF_INET INADDR_ANY 6009) (listen sock 5) (while #t (let* ((client-connection (accept/no-block sock)) (client-details (cdr client-connection)) (client (car client-connection))) (lock-mutex mutex) (do ((line (read-line client) (read-line client))) ((eof-object? line) (shutdown client 2)) (set! message (string-append message line "\n"))) (signal-condition-variable message-ready) (unlock-mutex mutex))))) (define (piper) (while #t (lock-mutex mutex) (if (not (> (string-length message) 0)) (wait-condition-variable message-ready mutex) (let ((outgoing message)) (set! message "") (unlock-mutex mutex) ; Comment this to stop select complaining (let ((pipe (open-output-pipe "./buggy-companion.scm"))) (display "Print this\n" pipe) (close-port pipe)))) ; Remove 3 brackets to stop select complaining ; (unlock-mutex mutex)))) ; Uncomment this to stop select complaining (unlock-mutex mutex))) (define (accept/no-block s) (if (null? (car (select (vector s) '() '()))) ; This select complains (accept/no-block s) (let ((client #f)) (lock-mutex mutex) (set! client (accept s)) (unlock-mutex mutex) client)))