aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--http-fetch.c6
-rw-r--r--http-push.c3
-rw-r--r--http.c30
-rw-r--r--http.h4
4 files changed, 36 insertions, 7 deletions
diff --git a/http-fetch.c b/http-fetch.c
index e9b9f307f..7786110ff 100644
--- a/http-fetch.c
+++ b/http-fetch.c
@@ -317,7 +317,7 @@ static void release_object_request(struct object_request *obj_req)
}
#ifdef USE_CURL_MULTI
-int fill_active_slot(void)
+static int fill_active_slot(void *unused)
{
struct object_request *obj_req;
@@ -1035,6 +1035,10 @@ int main(int argc, const char **argv)
alt->packs = NULL;
alt->next = NULL;
+#ifdef USE_CURL_MULTI
+ add_fill_function(NULL, fill_active_slot);
+#endif
+
if (pull(commits, commit_id, write_ref, url))
rc = 1;
diff --git a/http-push.c b/http-push.c
index c7471fa11..c54230b6f 100644
--- a/http-push.c
+++ b/http-push.c
@@ -795,7 +795,7 @@ static void finish_request(struct transfer_request *request)
}
#ifdef USE_CURL_MULTI
-int fill_active_slot(void)
+static int fill_active_slot(void *unused)
{
struct transfer_request *request = request_queue_head;
@@ -2496,6 +2496,7 @@ int main(int argc, char **argv)
objects_to_send);
#ifdef USE_CURL_MULTI
fill_active_slots();
+ add_fill_function(NULL, fill_active_slot);
#endif
finish_all_active_slots();
diff --git a/http.c b/http.c
index 1f305bd35..a95483be8 100644
--- a/http.c
+++ b/http.c
@@ -391,13 +391,39 @@ int start_active_slot(struct active_request_slot *slot)
}
#ifdef USE_CURL_MULTI
+struct fill_chain {
+ void *data;
+ int (*fill)(void *);
+ struct fill_chain *next;
+};
+
+static struct fill_chain *fill_cfg = NULL;
+
+void add_fill_function(void *data, int (*fill)(void *))
+{
+ struct fill_chain *new = malloc(sizeof(*new));
+ struct fill_chain **linkp = &fill_cfg;
+ new->data = data;
+ new->fill = fill;
+ new->next = NULL;
+ while (*linkp)
+ linkp = &(*linkp)->next;
+ *linkp = new;
+}
+
void fill_active_slots(void)
{
struct active_request_slot *slot = active_queue_head;
- while (active_requests < max_requests)
- if (!fill_active_slot())
+ while (active_requests < max_requests) {
+ struct fill_chain *fill;
+ for (fill = fill_cfg; fill; fill = fill->next)
+ if (fill->fill(fill->data))
+ break;
+
+ if (!fill)
break;
+ }
while (slot != NULL) {
if (!slot->in_use && slot->curl != NULL) {
diff --git a/http.h b/http.h
index 559105cc0..72abac20f 100644
--- a/http.h
+++ b/http.h
@@ -70,10 +70,8 @@ extern void release_active_slot(struct active_request_slot *slot);
#ifdef USE_CURL_MULTI
extern void fill_active_slots(void);
+extern void add_fill_function(void *data, int (*fill)(void *));
extern void step_active_slots(void);
-
-/* Provided by the program using http. */
-extern int fill_active_slot(void);
#endif
extern void http_init(void);