From: Alexander Köplinger Date: Tue, 5 Apr 2016 19:39:14 +0000 (+0200) Subject: Merge pull request #2832 from razzfazz/handle_eintr X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=b8893efbccd64f92c81082e42b8e480b74881927;hp=-c;p=mono.git Merge pull request #2832 from razzfazz/handle_eintr handle EINTR for kevent calls --- b8893efbccd64f92c81082e42b8e480b74881927 diff --combined mcs/class/System/System.IO/KeventWatcher.cs index 8078964da30,5d476a724b3..f17eb58d28d --- a/mcs/class/System/System.IO/KeventWatcher.cs +++ b/mcs/class/System/System.IO/KeventWatcher.cs @@@ -150,7 -150,7 +150,7 @@@ namespace System.IO [StructLayout(LayoutKind.Sequential)] struct timespec { public IntPtr tv_sec; - public IntPtr tv_usec; + public IntPtr tv_nsec; } class PathData @@@ -313,14 -313,21 +313,21 @@@ Scan (fullPathNoLastSlash, false, ref initialFds); - var immediate_timeout = new timespec { tv_sec = (IntPtr)0, tv_usec = (IntPtr)0 }; + var immediate_timeout = new timespec { tv_sec = (IntPtr)0, tv_nsec = (IntPtr)0 }; var eventBuffer = new kevent[0]; // we don't want to take any events from the queue at this point var changes = CreateChangeList (ref initialFds); - int numEvents = kevent (conn, changes, changes.Length, eventBuffer, eventBuffer.Length, ref immediate_timeout); + int numEvents; + int errno = 0; + do { + numEvents = kevent (conn, changes, changes.Length, eventBuffer, eventBuffer.Length, ref immediate_timeout); + if (numEvents == -1) { + errno = Marshal.GetLastWin32Error (); + } + } while (numEvents == -1 && errno == EINTR); if (numEvents == -1) { - var errMsg = String.Format ("kevent() error at initial event registration, error code = '{0}'", Marshal.GetLastWin32Error ()); + var errMsg = String.Format ("kevent() error at initial event registration, error code = '{0}'", errno); throw new IOException (errMsg); } } @@@ -384,9 -391,10 +391,10 @@@ // Stop () signals us to stop by closing the connection if (requestStop) break; - if (++retries == 3) + int errno = Marshal.GetLastWin32Error (); + if (errno != EINTR && ++retries == 3) throw new IOException (String.Format ( - "persistent kevent() error, error code = '{0}'", Marshal.GetLastWin32Error ())); + "persistent kevent() error, error code = '{0}'", errno)); continue; } @@@ -646,6 -654,7 +654,7 @@@ const int O_EVTONLY = 0x8000; const int F_GETPATH = 50; const int __DARWIN_MAXPATHLEN = 1024; + const int EINTR = 4; static readonly kevent[] emptyEventList = new System.IO.kevent[0]; int maxFds = Int32.MaxValue; @@@ -665,19 -674,19 +674,19 @@@ string fixupPath = null; string fullPathNoLastSlash = null; - [DllImport ("libc", EntryPoint="fcntl", CharSet=CharSet.Auto, SetLastError=true)] + [DllImport ("libc", CharSet=CharSet.Auto, SetLastError=true)] static extern int fcntl (int file_names_by_descriptor, int cmd, StringBuilder sb); - [DllImport ("libc")] + [DllImport ("libc", SetLastError=true)] extern static int open (string path, int flags, int mode_t); [DllImport ("libc")] extern static int close (int fd); - [DllImport ("libc")] + [DllImport ("libc", SetLastError=true)] extern static int kqueue (); - [DllImport ("libc")] + [DllImport ("libc", SetLastError=true)] extern static int kevent (int kq, [In]kevent[] ev, int nchanges, [Out]kevent[] evtlist, int nevents, [In] ref timespec time); [MethodImplAttribute(MethodImplOptions.InternalCall)]