guile-user
[Top][All Lists]
Advanced

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

A timely question on interrupted system calls


From: mark . d . witmer
Subject: A timely question on interrupted system calls
Date: Wed, 10 Jul 2013 23:45:06 -0700
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux)

I followed the thread a few days ago on @guile-dev about SCM_SYSCALL and
was grateful I hadn't run into any problems with it. But now I have!

I'm working with an event loop for my X bindings that polls a socket for
availablity using `select'. Meanwhile, I have a repl server running in
another thread. When something connects to the server, the call to
`select' get interrupted and throws a system error. In the following
code the catch expression doesn't catch the system error:

(define (file-ready? fd)
    (memq fd
          (car 
           (catch 'system-error
             (lambda () (select (list fd) '() '() 0 16667))
             (lambda args
               (if (= (system-error-errno args) EINTR)
                   '(() () ()) ;; Assume it isn't available for now
                   (apply throw args)))))))

I gathered from what I read that the error is getting handled in a
system async, which could explain why my catch expression doesn't see
it. I also tried a couple versions of `sigaction' without any luck:

(sigaction SIGINT (lambda (signum) #t) SA_RESTART)

and

(sigaction SIGINT #f SA_RESTART)

It'd be fine if it automatically retried instead of returning the empty
lists. Any ideas?

-- 
Mark Witmer



reply via email to

[Prev in Thread] Current Thread [Next in Thread]