Macro base::handle_eintr 
source · macro_rules! handle_eintr { ($x:expr) => { ... }; }
Expand description
Macro that retries the given expression every time its result indicates it was interrupted (i.e.
returned EINTR). This is useful for operations that are prone to being interrupted by
signals, such as blocking syscalls.
The given expression $x can return
crate::linux::Resultin which case the expression is retried if theError::errno()isEINTR.std::io::Resultin which case the expression is retried if theErrorKindisErrorKind::Interrupted.
Note that if expression returns i32 (i.e. either -1 or error code), then handle_eintr_errno() or handle_eintr_rc() should be used instead.
In all cases where the result does not indicate that the expression was interrupted, the result is returned verbatim to the caller of this macro.
See the section titled Interruption of system calls and library functions by signal handlers
on the man page for signal(7) to see more information about interruptible syscalls.
To summarize, routines that use one of these syscalls might need to handle EINTR:
accept(2)clock_nanosleep(2)connect(2)epoll_pwait(2)epoll_wait(2)fcntl(2)fifo(7)flock(2)futex(2)getrandom(2)inotify(7)io_getevents(2)ioctl(2)mq_receive(3)mq_send(3)mq_timedreceive(3)mq_timedsend(3)msgrcv(2)msgsnd(2)nanosleep(2)open(2)pause(2)poll(2)ppoll(2)pselect(2)pthread_cond_wait(3)pthread_mutex_lock(3)read(2)readv(2)recv(2)recvfrom(2)recvmmsg(2)recvmsg(2)select(2)sem_timedwait(3)sem_wait(3)semop(2)semtimedop(2)send(2)sendmsg(2)sendto(2)setsockopt(2)sigsuspend(2)sigtimedwait(2)sigwaitinfo(2)sleep(3)usleep(3)wait(2)wait3(2)wait4(2)waitid(2)waitpid(2)write(2)writev(2)
§Examples
let mut line = String::new();
let res = handle_eintr!(stdin().read_line(&mut line));