1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-22 08:08:50 -05:00

multi: simplified singlesocket

Since sh_getentry() now checks for invalid sockets itself and by
narrowing the scope of the remove_sock_from_hash variable.
This commit is contained in:
Daniel Stenberg 2016-03-14 09:44:14 +01:00
parent 8eaf884417
commit c3aca6ed47

View File

@ -2000,7 +2000,6 @@ static void singlesocket(struct Curl_multi *multi,
curl_socket_t s; curl_socket_t s;
int num; int num;
unsigned int curraction; unsigned int curraction;
bool remove_sock_from_hash;
for(i=0; i< MAX_SOCKSPEREASYHANDLE; i++) for(i=0; i< MAX_SOCKSPEREASYHANDLE; i++)
socks[i] = CURL_SOCKET_BAD; socks[i] = CURL_SOCKET_BAD;
@ -2068,57 +2067,50 @@ static void singlesocket(struct Curl_multi *multi,
break; break;
} }
} }
if(s != CURL_SOCKET_BAD) {
entry = sh_getentry(&multi->sockhash, s);
if(entry) {
/* this socket has been removed. Tell the app to remove it */ /* this socket has been removed. Tell the app to remove it */
remove_sock_from_hash = TRUE; bool remove_sock_from_hash = TRUE;
entry = sh_getentry(&multi->sockhash, s); /* check if the socket to be removed serves a connection which has
if(entry) { other easy-s in a pipeline. In this case the socket should not be
/* check if the socket to be removed serves a connection which has removed. */
other easy-s in a pipeline. In this case the socket should not be struct connectdata *easy_conn = data->easy_conn;
removed. */ if(easy_conn) {
struct connectdata *easy_conn = data->easy_conn; if(easy_conn->recv_pipe && easy_conn->recv_pipe->size > 1) {
if(easy_conn) { /* the handle should not be removed from the pipe yet */
if(easy_conn->recv_pipe && easy_conn->recv_pipe->size > 1) { remove_sock_from_hash = FALSE;
/* the handle should not be removed from the pipe yet */
remove_sock_from_hash = FALSE;
/* Update the sockhash entry to instead point to the next in line /* Update the sockhash entry to instead point to the next in line
for the recv_pipe, or the first (in case this particular easy for the recv_pipe, or the first (in case this particular easy
isn't already) */ isn't already) */
if(entry->easy == data) { if(entry->easy == data) {
if(Curl_recvpipe_head(data, easy_conn)) if(Curl_recvpipe_head(data, easy_conn))
entry->easy = easy_conn->recv_pipe->head->next->ptr; entry->easy = easy_conn->recv_pipe->head->next->ptr;
else else
entry->easy = easy_conn->recv_pipe->head->ptr; entry->easy = easy_conn->recv_pipe->head->ptr;
}
} }
if(easy_conn->send_pipe && easy_conn->send_pipe->size > 1) {
/* the handle should not be removed from the pipe yet */
remove_sock_from_hash = FALSE;
/* Update the sockhash entry to instead point to the next in line
for the send_pipe, or the first (in case this particular easy
isn't already) */
if(entry->easy == data) {
if(Curl_sendpipe_head(data, easy_conn))
entry->easy = easy_conn->send_pipe->head->next->ptr;
else
entry->easy = easy_conn->send_pipe->head->ptr;
}
}
/* Don't worry about overwriting recv_pipe head with send_pipe_head,
when action will be asked on the socket (see multi_socket()), the
head of the correct pipe will be taken according to the
action. */
} }
if(easy_conn->send_pipe && easy_conn->send_pipe->size > 1) {
/* the handle should not be removed from the pipe yet */
remove_sock_from_hash = FALSE;
/* Update the sockhash entry to instead point to the next in line
for the send_pipe, or the first (in case this particular easy
isn't already) */
if(entry->easy == data) {
if(Curl_sendpipe_head(data, easy_conn))
entry->easy = easy_conn->send_pipe->head->next->ptr;
else
entry->easy = easy_conn->send_pipe->head->ptr;
}
}
/* Don't worry about overwriting recv_pipe head with send_pipe_head,
when action will be asked on the socket (see multi_socket()), the
head of the correct pipe will be taken according to the
action. */
} }
else
/* just a precaution, this socket really SHOULD be in the hash already
but in case it isn't, we don't have to tell the app to remove it
either since it never got to know about it */
remove_sock_from_hash = FALSE;
if(remove_sock_from_hash) { if(remove_sock_from_hash) {
/* in this case 'entry' is always non-NULL */ /* in this case 'entry' is always non-NULL */
@ -2130,9 +2122,8 @@ static void singlesocket(struct Curl_multi *multi,
entry->socketp); entry->socketp);
sh_delentry(&multi->sockhash, s); sh_delentry(&multi->sockhash, s);
} }
} /* if sockhash entry existed */
} } /* for loop over numsocks */
}
memcpy(data->sockets, socks, num*sizeof(curl_socket_t)); memcpy(data->sockets, socks, num*sizeof(curl_socket_t));
data->numsocks = num; data->numsocks = num;