From f65257623b8758e24fb701d8ef85ccdaeba20e34 Mon Sep 17 00:00:00 2001 From: "jiangfriend@gmail.com" Date: Thu, 16 Feb 2012 00:25:55 +0800 Subject: [PATCH] fixes failed on curl_multi_perform cause curl_multi_remove failed --- package.json | 2 +- src/node-curl.h | 20 +++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 6716a7d..0b85fb4 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "node-curl", "version": "0.1.0", "author" : "Jiang Miao ", - "description": "node wrapper for multi curl, full implemented.", + "description": "node wrapper for multi curl, fully implemented.", "keywords" : ["node-curl", "curl", "multi-curl", "mcurl"], "homepage": "http://github.com/jiangmiao/node-curl", "repository" : { diff --git a/src/node-curl.h b/src/node-curl.h index 41112f7..a0bc9f9 100644 --- a/src/node-curl.h +++ b/src/node-curl.h @@ -1,8 +1,6 @@ #ifndef NODE_CURL_NOHE_CURL_H #define NODE_CURL_NOHE_CURL_H - -#include #include #include #include @@ -327,18 +325,22 @@ class NodeCurl if (msg->msg == CURLMSG_DONE) { NodeCurl * curl = curls[msg->easy_handle]; - // ensure curl still exists, - // gc will delete the curl if there is no reference. - if (msg->data.result == CURLE_OK) - curl->on_end(msg); - else - curl->on_error(msg); + // copy CURLMsg + // on_error may delete the whole NodeCurl + CURLMsg msg_copy = *msg; code = curl_multi_remove_handle(curlm, msg->easy_handle); curl->in_curlm = false; if (code != CURLM_OK) { return raise("curl_multi_remove_handle failed", curl_multi_strerror(code)); } + + // ensure curl still exists, + // gc will delete the curl if there is no reference. + if (msg_copy.data.result == CURLE_OK) + curl->on_end(&msg_copy); + else + curl->on_error(&msg_copy); } } } @@ -350,11 +352,11 @@ class NodeCurl { NodeCurl *curl = unwrap(args.This()); CURLMcode code = curl_multi_add_handle(curlm, curl->curl); - curl->in_curlm = true; if (code != CURLM_OK) { return raise("curl_multi_add_handle failed", curl_multi_strerror(code)); } + curl->in_curlm = true; ++running_handles; return args.This(); }