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

Dmitry Kurochkin removed the cancelled state for pipelining, as we agreed

that it is bad anyway. Starting now, removing a handle that is in used in a
pipeline will break the pipeline - it'll be set back up again but still...
This commit is contained in:
Daniel Stenberg 2008-01-21 23:48:58 +00:00
parent a674654f83
commit ef0ed9b720
6 changed files with 19 additions and 45 deletions

View File

@ -6,6 +6,11 @@
Changelog Changelog
Daniel S (22 Jan 2008)
- Dmitry Kurochkin removed the cancelled state for pipelining, as we agreed
that it is bad anyway. Starting now, removing a handle that is in used in a
pipeline will break the pipeline - it'll be set back up again but still...
Yang Tse (21 Jan 2008) Yang Tse (21 Jan 2008)
- Disable ldap support for cygwin builds, since it breaks whole build process. - Disable ldap support for cygwin builds, since it breaks whole build process.
Fixing it will affect other platforms, so it is postponed for another release. Fixing it will affect other platforms, so it is postponed for another release.

View File

@ -58,6 +58,8 @@ This release includes the following bugfixes:
o improved OOM handling for data url encoded HTTP POSTs when read from a file o improved OOM handling for data url encoded HTTP POSTs when read from a file
o test suite could pick wrong tool(s) if more than one existed in the PATH o test suite could pick wrong tool(s) if more than one existed in the PATH
o curl_multi_fdset() failed to return socket while doing CONNECT over proxy o curl_multi_fdset() failed to return socket while doing CONNECT over proxy
o curl_multi_remove_handle() on a handle that is in used for a pipeline now
break that pipeline
This release includes the following known bugs: This release includes the following known bugs:

View File

@ -85,7 +85,6 @@ typedef enum {
CURLM_STATE_TOOFAST, /* wait because limit-rate exceeded */ CURLM_STATE_TOOFAST, /* wait because limit-rate exceeded */
CURLM_STATE_DONE, /* post data transfer operation */ CURLM_STATE_DONE, /* post data transfer operation */
CURLM_STATE_COMPLETED, /* operation complete */ CURLM_STATE_COMPLETED, /* operation complete */
CURLM_STATE_CANCELLED, /* cancelled */
CURLM_STATE_LAST /* not a true state, never use this */ CURLM_STATE_LAST /* not a true state, never use this */
} CURLMstate; } CURLMstate;
@ -216,7 +215,6 @@ static const char * const statename[]={
"TOOFAST", "TOOFAST",
"DONE", "DONE",
"COMPLETED", "COMPLETED",
"CANCELLED"
}; };
void curl_multi_dump(CURLM *multi_handle); void curl_multi_dump(CURLM *multi_handle);
@ -587,15 +585,12 @@ CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
multi->num_alive--; multi->num_alive--;
if(easy->easy_handle->state.is_in_pipeline && if(easy->easy_handle->state.is_in_pipeline &&
easy->state > CURLM_STATE_DO && easy->state > CURLM_STATE_WAITDO &&
easy->state < CURLM_STATE_COMPLETED) { easy->state < CURLM_STATE_COMPLETED)
/* If the handle is in a pipeline and has finished sending off its /* If the handle is in a pipeline and has started sending off its
request but not received its reponse yet, we need to remember the request but not received its reponse yet, we need to close
fact that we want to remove this handle but do the actual removal at connection. */
a later time */ easy->easy_conn->bits.close = TRUE;
easy->easy_handle->state.cancelled = TRUE;
return CURLM_OK;
}
/* The timer must be shut down before easy->multi is set to NULL, /* The timer must be shut down before easy->multi is set to NULL,
else the timenode will remain in the splay tree after else the timenode will remain in the splay tree after
@ -1351,22 +1346,16 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
result = CURLM_CALL_MULTI_PERFORM; result = CURLM_CALL_MULTI_PERFORM;
} }
if(!easy->easy_handle->state.cancelled) {
/* post-transfer command */ /* post-transfer command */
easy->result = Curl_done(&easy->easy_conn, CURLE_OK, FALSE); easy->result = Curl_done(&easy->easy_conn, CURLE_OK, FALSE);
/* after we have DONE what we're supposed to do, go COMPLETED, and /* after we have DONE what we're supposed to do, go COMPLETED, and
it doesn't matter what the Curl_done() returned! */ it doesn't matter what the Curl_done() returned! */
multistate(easy, CURLM_STATE_COMPLETED); multistate(easy, CURLM_STATE_COMPLETED);
}
break; break;
case CURLM_STATE_COMPLETED: case CURLM_STATE_COMPLETED:
if(easy->easy_handle->state.cancelled)
/* Go into the CANCELLED state if we were cancelled */
multistate(easy, CURLM_STATE_CANCELLED);
/* this is a completed transfer, it is likely to still be connected */ /* this is a completed transfer, it is likely to still be connected */
/* This node should be delinked from the list now and we should post /* This node should be delinked from the list now and we should post
@ -1377,13 +1366,6 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
easy->easy_conn = NULL; easy->easy_conn = NULL;
break; break;
case CURLM_STATE_CANCELLED:
/* Cancelled transfer, wait to be cleaned up */
/* Reset the conn pointer so we don't leave it dangling */
easy->easy_conn = NULL;
break;
default: default:
return CURLM_INTERNAL_ERROR; return CURLM_INTERNAL_ERROR;
} }
@ -1481,15 +1463,6 @@ CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles)
while(easy != &multi->easy) { while(easy != &multi->easy) {
CURLMcode result; CURLMcode result;
if(easy->easy_handle->state.cancelled &&
easy->state == CURLM_STATE_CANCELLED) {
/* Remove cancelled handles once it's safe to do so */
Curl_multi_rmeasy(multi_handle, easy->easy_handle);
easy->easy_handle = NULL;
easy = easy->next;
continue;
}
result = multi_runsingle(multi, easy); result = multi_runsingle(multi, easy);
if(result) if(result)
returncode = result; returncode = result;

View File

@ -419,11 +419,6 @@ CURLcode Curl_client_write(struct connectdata *conn,
struct SessionHandle *data = conn->data; struct SessionHandle *data = conn->data;
size_t wrote; size_t wrote;
if(data->state.cancelled) {
/* We just suck everything into a black hole */
return CURLE_OK;
}
/* If reading is actually paused, we're forced to append this chunk of data /* If reading is actually paused, we're forced to append this chunk of data
to the already held data, but only if it is the same type as otherwise it to the already held data, but only if it is the same type as otherwise it
can't work and it'll return error instead. */ can't work and it'll return error instead. */

View File

@ -2477,7 +2477,7 @@ ConnectionExists(struct SessionHandle *data,
} }
if(match) { if(match) {
if(!Curl_isPipeliningEnabled(data)) { if(!check->is_in_pipeline) {
/* The check for a dead socket makes sense only in the /* The check for a dead socket makes sense only in the
non-pipelining case */ non-pipelining case */
bool dead = SocketIsDead(check->sock[FIRSTSOCKET]); bool dead = SocketIsDead(check->sock[FIRSTSOCKET]);

View File

@ -1194,7 +1194,6 @@ struct UrlState {
bool pipe_broke; /* TRUE if the connection we were pipelined on broke bool pipe_broke; /* TRUE if the connection we were pipelined on broke
and we need to restart from the beginning */ and we need to restart from the beginning */
bool cancelled; /* TRUE if the request was cancelled */
#ifndef WIN32 #ifndef WIN32
/* do FTP line-end conversions on most platforms */ /* do FTP line-end conversions on most platforms */