Version: 1
-Previous: 5c4b4489cce95156bf7e607a77f3d07fe8f0fab8
-Head: 124af5c0388f70afb7680d5551b45deb3f232183
+Previous: 9e3b8e99f67e95c4f38b158c8c77379d3ec449db
+Head: 8c650d7a0e10582928f0fd3e5d9e045a84fc0b66
Applied:
real-close: 3409f8d6af187d25c63a5d1f8ee8bff5f14555e2
dup2: ca5813e7cf95dee5933fc417e4a34d26f2b01824
oobinline: ac51c1095f505373a6ec54b8f1d990259fb34d97
- fork-connect: 10f8a3f709f58fda4072dbd847e9fe2e892a65f7
- refresh-temp: 124af5c0388f70afb7680d5551b45deb3f232183
+ fork-connect: 8c650d7a0e10582928f0fd3e5d9e045a84fc0b66
Unapplied:
dbg-out: 04273ee712db4d53efb390462c1b738bb54a57df
fstat: a62c653906870422edef5f6388dac9f76c953e35
Bottom: 3ea2748a5c41b11a2e7033c56bddd938d2770b6c
-Top: 3ea2748a5c41b11a2e7033c56bddd938d2770b6c
+Top: 216390f24bdb1fa45d9326571f8dd46b1fd804ef
Author: Sean Hefty <sean.hefty@intel.com>
Date: 2012-08-10 21:44:39 -0700
---
-
+diff --git a/src/preload.c b/src/preload.c
+index b18d310..c61d092 100644
+--- a/src/preload.c
++++ b/src/preload.c
+@@ -99,12 +99,20 @@ static int fork_support;
+
+ enum fd_type {
+ fd_normal,
+- fd_rsocket,
+- fd_fork
++ fd_rsocket
++};
++
++enum fd_fork_state {
++ fd_ready,
++ fd_fork,
++ fd_fork_listen,
++ fd_fork_active,
++ fd_fork_passive
+ };
+
+ struct fd_info {
+ enum fd_type type;
++ enum fd_fork_state state;
+ int fd;
+ int dupfd;
+ atomic_t refcnt;
+@@ -143,13 +151,14 @@ err1:
+ return ret;
+ }
+
+-static void fd_store(int index, int fd, enum fd_type type)
++static void fd_store(int index, int fd, enum fd_type type, enum fd_fork_state state)
+ {
+ struct fd_info *fdi;
+
+ fdi = idm_at(&idm, index);
+ fdi->fd = fd;
+ fdi->type = type;
++ fdi->state = state;
+ }
+
+ static inline enum fd_type fd_get(int index, int *fd)
+@@ -175,6 +184,14 @@ static inline int fd_getd(int index)
+ return fdi ? fdi->fd : index;
+ }
+
++static inline enum fd_state fd_gets(int index)
++{
++ struct fd_info *fdi;
++
++ fdi = idm_lookup(&idm, index);
++ return fdi ? fdi->state : fd_ready;
++}
++
+ static inline enum fd_type fd_gett(int index)
+ {
+ struct fd_info *fdi;
+@@ -353,7 +370,7 @@ static int transpose_socket(int socket, enum fd_type new_type)
+ if (ret)
+ goto err;
+
+- fd_store(socket, dfd, new_type);
++ fd_store(socket, dfd, new_type, fd_ready);
+ return dfd;
+
+ err:
+@@ -398,9 +415,9 @@ int socket(int domain, int type, int protocol)
+ ret = real.socket(domain, type, protocol);
+ if (ret < 0)
+ return ret;
+- fd_store(index, ret, fd_fork);
++ fd_store(index, ret, fd_normal, fd_fork);
+ } else {
+- fd_store(index, ret, fd_rsocket);
++ fd_store(index, ret, fd_rsocket, fd_ready);
+ set_rsocket_options(ret);
+ }
+ return index;
+@@ -427,22 +444,32 @@ int listen(int socket, int backlog)
+ int accept(int socket, struct sockaddr *addr, socklen_t *addrlen)
+ {
+ int fd, index, ret;
+- enum fd_type type;
+
+- type = fd_get(socket, &fd);
+- if (type == fd_rsocket || type == fd_fork) {
++ if (fd_get(socket, &fd) == fd_rsocket) {
++ index = fd_open();
++ if (index < 0)
++ return index;
++
++ ret = raccept(fd, addr, addrlen);
++ if (ret < 0) {
++ fd_close(index, &fd);
++ return ret;
++ }
++
++ fd_store(index, ret, fd_rsocket, fd_ready);
++ return index;
++ } else if (fd_gets(socket) == fd_fork_listen) {
+ index = fd_open();
+ if (index < 0)
+ return index;
+
+- ret = (type == fd_rsocket) ? raccept(fd, addr, addrlen) :
+- real.accept(fd, addr, addrlen);
++ ret = real.accept(fd, addr, addrlen);
+ if (ret < 0) {
+ fd_close(index, &fd);
+ return ret;
+ }
+
+- fd_store(index, ret, type);
++ fd_store(index, ret, fd_normal, fd_fork_passive);
+ return index;
+ } else {
+ return real.accept(fd, addr, addrlen);
+@@ -471,7 +498,7 @@ static int fork_active(int socket, const struct sockaddr *addr, socklen_t addrle
+
+ ret = real.recv(fd, &msg, sizeof msg, MSG_PEEK);
+ if ((ret != sizeof msg) || msg) {
+- fd_store(socket, fd, fd_normal);
++ fd_store(socket, fd, fd_normal, fd_ready);
+ return 0;
+ }
+
+@@ -544,7 +571,7 @@ static void fork_passive(int socket)
+ copysockopts(dfd, sfd, &rs, &real);
+ real.shutdown(sfd, SHUT_RDWR);
+ real.close(sfd);
+- fd_store(socket, dfd, fd_rsocket);
++ fd_store(socket, dfd, fd_rsocket, fd_ready);
+
+ lclose:
+ rclose(lfd);
+@@ -553,7 +580,7 @@ sclose:
+ sem_close(sem);
+ out:
+ if (ret)
+- fd_store(socket, sfd, fd_normal);
++ fd_store(socket, sfd, fd_normal, fd_ready);
+ }
+
+ static inline enum fd_type fd_fork_get(int index, int *fd)
+@@ -577,10 +604,7 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen)
+ {
+ int fd, ret;
+
+- switch (fd_get(socket, &fd)) {
+- case fd_fork:
+- return fork_active(socket, addr, addrlen);
+- case fd_rsocket:
++ if (fd_get(socket, &fd) == fd_rsocket) {
+ ret = rconnect(fd, addr, addrlen);
+ if (!ret || errno == EINPROGRESS)
+ return ret;
+@@ -591,12 +615,9 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen)
+
+ rclose(fd);
+ fd = ret;
+- break;
+- default:
+- break;
++ } else {
++ return real.connect(fd, addr, addrlen);
+ }
+-
+- return real.connect(fd, addr, addrlen);
+ }
+
+ ssize_t recv(int socket, void *buf, size_t len, int flags)
+++ /dev/null
-Bottom: 3ea2748a5c41b11a2e7033c56bddd938d2770b6c
-Top: 216390f24bdb1fa45d9326571f8dd46b1fd804ef
-Author: Sean Hefty <sean.hefty@intel.com>
-Date: 2012-08-10 22:06:41 -0700
-
-Refresh of fork-connect
-
----
-
-diff --git a/src/preload.c b/src/preload.c
-index b18d310..c61d092 100644
---- a/src/preload.c
-+++ b/src/preload.c
-@@ -99,12 +99,20 @@ static int fork_support;
-
- enum fd_type {
- fd_normal,
-- fd_rsocket,
-- fd_fork
-+ fd_rsocket
-+};
-+
-+enum fd_fork_state {
-+ fd_ready,
-+ fd_fork,
-+ fd_fork_listen,
-+ fd_fork_active,
-+ fd_fork_passive
- };
-
- struct fd_info {
- enum fd_type type;
-+ enum fd_fork_state state;
- int fd;
- int dupfd;
- atomic_t refcnt;
-@@ -143,13 +151,14 @@ err1:
- return ret;
- }
-
--static void fd_store(int index, int fd, enum fd_type type)
-+static void fd_store(int index, int fd, enum fd_type type, enum fd_fork_state state)
- {
- struct fd_info *fdi;
-
- fdi = idm_at(&idm, index);
- fdi->fd = fd;
- fdi->type = type;
-+ fdi->state = state;
- }
-
- static inline enum fd_type fd_get(int index, int *fd)
-@@ -175,6 +184,14 @@ static inline int fd_getd(int index)
- return fdi ? fdi->fd : index;
- }
-
-+static inline enum fd_state fd_gets(int index)
-+{
-+ struct fd_info *fdi;
-+
-+ fdi = idm_lookup(&idm, index);
-+ return fdi ? fdi->state : fd_ready;
-+}
-+
- static inline enum fd_type fd_gett(int index)
- {
- struct fd_info *fdi;
-@@ -353,7 +370,7 @@ static int transpose_socket(int socket, enum fd_type new_type)
- if (ret)
- goto err;
-
-- fd_store(socket, dfd, new_type);
-+ fd_store(socket, dfd, new_type, fd_ready);
- return dfd;
-
- err:
-@@ -398,9 +415,9 @@ int socket(int domain, int type, int protocol)
- ret = real.socket(domain, type, protocol);
- if (ret < 0)
- return ret;
-- fd_store(index, ret, fd_fork);
-+ fd_store(index, ret, fd_normal, fd_fork);
- } else {
-- fd_store(index, ret, fd_rsocket);
-+ fd_store(index, ret, fd_rsocket, fd_ready);
- set_rsocket_options(ret);
- }
- return index;
-@@ -427,22 +444,32 @@ int listen(int socket, int backlog)
- int accept(int socket, struct sockaddr *addr, socklen_t *addrlen)
- {
- int fd, index, ret;
-- enum fd_type type;
-
-- type = fd_get(socket, &fd);
-- if (type == fd_rsocket || type == fd_fork) {
-+ if (fd_get(socket, &fd) == fd_rsocket) {
-+ index = fd_open();
-+ if (index < 0)
-+ return index;
-+
-+ ret = raccept(fd, addr, addrlen);
-+ if (ret < 0) {
-+ fd_close(index, &fd);
-+ return ret;
-+ }
-+
-+ fd_store(index, ret, fd_rsocket, fd_ready);
-+ return index;
-+ } else if (fd_gets(socket) == fd_fork_listen) {
- index = fd_open();
- if (index < 0)
- return index;
-
-- ret = (type == fd_rsocket) ? raccept(fd, addr, addrlen) :
-- real.accept(fd, addr, addrlen);
-+ ret = real.accept(fd, addr, addrlen);
- if (ret < 0) {
- fd_close(index, &fd);
- return ret;
- }
-
-- fd_store(index, ret, type);
-+ fd_store(index, ret, fd_normal, fd_fork_passive);
- return index;
- } else {
- return real.accept(fd, addr, addrlen);
-@@ -471,7 +498,7 @@ static int fork_active(int socket, const struct sockaddr *addr, socklen_t addrle
-
- ret = real.recv(fd, &msg, sizeof msg, MSG_PEEK);
- if ((ret != sizeof msg) || msg) {
-- fd_store(socket, fd, fd_normal);
-+ fd_store(socket, fd, fd_normal, fd_ready);
- return 0;
- }
-
-@@ -544,7 +571,7 @@ static void fork_passive(int socket)
- copysockopts(dfd, sfd, &rs, &real);
- real.shutdown(sfd, SHUT_RDWR);
- real.close(sfd);
-- fd_store(socket, dfd, fd_rsocket);
-+ fd_store(socket, dfd, fd_rsocket, fd_ready);
-
- lclose:
- rclose(lfd);
-@@ -553,7 +580,7 @@ sclose:
- sem_close(sem);
- out:
- if (ret)
-- fd_store(socket, sfd, fd_normal);
-+ fd_store(socket, sfd, fd_normal, fd_ready);
- }
-
- static inline enum fd_type fd_fork_get(int index, int *fd)
-@@ -577,10 +604,7 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen)
- {
- int fd, ret;
-
-- switch (fd_get(socket, &fd)) {
-- case fd_fork:
-- return fork_active(socket, addr, addrlen);
-- case fd_rsocket:
-+ if (fd_get(socket, &fd) == fd_rsocket) {
- ret = rconnect(fd, addr, addrlen);
- if (!ret || errno == EINPROGRESS)
- return ret;
-@@ -591,12 +615,9 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen)
-
- rclose(fd);
- fd = ret;
-- break;
-- default:
-- break;
-+ } else {
-+ return real.connect(fd, addr, addrlen);
- }
--
-- return real.connect(fd, addr, addrlen);
- }
-
- ssize_t recv(int socket, void *buf, size_t len, int flags)