}
#ifdef USE_CURL_MULTI
-int fill_active_slot(void)
+static int fill_active_slot(void *unused)
{
struct object_request *obj_req;
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;
}
#ifdef USE_CURL_MULTI
-int fill_active_slot(void)
+static int fill_active_slot(void *unused)
{
struct transfer_request *request = request_queue_head;
objects_to_send);
#ifdef USE_CURL_MULTI
fill_active_slots();
+ add_fill_function(NULL, fill_active_slot);
#endif
finish_all_active_slots();
}
#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) {
#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);