uv: upgrade to 5b8a112
authorisaacs <i@izs.me>
Fri, 29 Jun 2012 02:10:56 +0000 (19:10 -0700)
committerisaacs <i@izs.me>
Fri, 29 Jun 2012 02:11:30 +0000 (19:11 -0700)
deps/uv/common.gypi
deps/uv/src/unix/core.c
deps/uv/src/unix/linux/syscalls.c

index c2df528f23e40dfbee2ad15e934ba235a7ad3e27..79306a75549537697583190e3e71b9e6d5ec8992 100644 (file)
@@ -32,6 +32,9 @@
             'LinkIncremental': 2, # enable incremental linking
           },
         },
+        'xcode_settings': {
+          'GCC_OPTIMIZATION_LEVEL': '0',
+        },
         'conditions': [
           ['OS != "win"', {
             'defines': [ 'EV_VERIFY=2' ],
index 318eb7184edd84145bb2cd63b01cdee3cae4a7b8..bf42994865d1b0019d2778dbe3e5d7fd4dc548c6 100644 (file)
@@ -426,6 +426,11 @@ int uv__accept(int sockfd) {
 
   while (1) {
 #if __linux__
+    static int no_accept4;
+
+    if (no_accept4)
+      goto skip;
+
     peerfd = uv__accept4(sockfd,
                          NULL,
                          NULL,
@@ -439,6 +444,9 @@ int uv__accept(int sockfd) {
 
     if (errno != ENOSYS)
       break;
+
+    no_accept4 = 1;
+skip:
 #endif
 
     peerfd = accept(sockfd, NULL, NULL);
index 5eb826b7c54c236cb1fcb5534a4d0edeae1088a4..cbf2bbbdeac28a853cf61471c4ee045cd71d98a8 100644 (file)
 
 int uv__accept4(int fd, struct sockaddr* addr, socklen_t* addrlen, int flags) {
 #if __i386__
-  unsigned long args[] = {
-    (unsigned long) fd,
-    (unsigned long) addr,
-    (unsigned long) addrlen,
-    (unsigned long) flags
-  };
-  return syscall(__NR_socketcall, 18 /* SYS_ACCEPT4 */, args);
+  unsigned long args[4];
+  int r;
+
+  args[0] = (unsigned long) fd;
+  args[1] = (unsigned long) addr;
+  args[2] = (unsigned long) addrlen;
+  args[3] = (unsigned long) flags;
+
+  r = syscall(__NR_socketcall, 18 /* SYS_ACCEPT4 */, args);
+
+  /* socketcall() raises EINVAL when SYS_ACCEPT4 is not supported but so does
+   * a bad flags argument. Try to distinguish between the two cases.
+   */
+  if (r == -1)
+    if (errno == EINVAL)
+      if ((flags & ~(UV__SOCK_CLOEXEC|UV__SOCK_NONBLOCK)) == 0)
+        errno = ENOSYS;
+
+  return r;
 #elif __NR_accept4
   return syscall(__NR_accept4, fd, addr, addrlen, flags);
 #else