I'm still kind of new here, so forgive me if this is a silly question, but why do this with a define and not an template function?
On Fri, May 1, 2009 at 12:35 PM, Adam Langley <a...@chromium.org> wrote: > > On POSIX systems, system calls can be interrupted by signals. In this case, > they'll return EINTR, indicating that the system call needs to be > restarted. > > (The situation is a little more complicated than this with SA_RESTART, but > you > can read man 7 signal if you like.) > > The short of it is that you need to catch EINTR and restart the call for > these > system calls: > > * read, readv, write, writev, ioctl > * open() when dealing with a fifo > * wait* > * Anything socket based (send*, recv*, connect, accept etc) > * flock and lock control with fcntl > * mq_ functions which can block > * futex > * sem_wait (and timed wait) > * pause, sigsuspend, sigtimedwait, sigwaitinfo > * poll, epoll_wait, select and 'p' versions of the same > * msgrcv, msgsnd, semop, semtimedop > * close (although, on Linux, EINTR won't happen here) > * any sleep functions (careful, you need to handle this are restart with > different arguments) > > We've been a little sloppy with this until now. Once the tree reopens, > I'll be > landing 100225 which adds a macro for dealing with this and corrects every > case > of these system calls (that I found). > > The macro is HANDLE_EINTR in base/eintr_wrapper.h. It's safe to include on > Windows and is a no-op there. > > On POSIX, it uses GCC magic to return the correct type based on the > expression > and restarts the system call if it throws EINTR. Here it is: > > #define HANDLE_EINTR(x) ({ \ > typeof(x) ret; \ > do { \ > ret = x; \ > } while (ret == -1 && errno == EINTR); \ > ret;\ > }) > > And you can use it like: > HANDLE_EINTR(close(fd)); > > Or: > ssize_t bytes_read = HANDLE_EINTR(read(fd, buffer, len)); > > > > AGL > > > > --~--~---------~--~----~------------~-------~--~----~ Chromium Developers mailing list: chromium-dev@googlegroups.com View archives, change email options, or unsubscribe: http://groups.google.com/group/chromium-dev -~----------~----~----~----~------~----~------~--~---