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:
parent
8eaf884417
commit
c3aca6ed47
87
lib/multi.c
87
lib/multi.c
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user