[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
- A timely question on interrupted system calls,
mark . d . witmer <=