aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Barkalow <barkalow@iabervon.org>2007-09-10 23:02:34 -0400
committerJunio C Hamano <gitster@pobox.com>2007-09-19 03:22:30 -0700
commitfc57b6aaa5bc59ecbe0c052b98196a93b35760a5 (patch)
treee64dcae3f9242d3a57fbb138e6d38f1b9672216e
parent45c1741235a1fbd54484fa1c67ea68569dcfa23e (diff)
downloadgit-fc57b6aaa5bc59ecbe0c052b98196a93b35760a5.tar.gz
git-fc57b6aaa5bc59ecbe0c052b98196a93b35760a5.tar.xz
Make function to refill http queue a callback
This eliminates the last function provided by the code using http.h as a global symbol, so it should be possible to have multiple programs using http.h in the same executable, and it also adds an argument to that callback, so that info can be passed into the callback without being global. Signed-off-by: Daniel Barkalow <barkalow@iabervon.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-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);