Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
Make function to refill http queue a callback
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
iabervon authored and gitster committed Sep 19, 2007
1 parent 45c1741 commit fc57b6a
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 7 deletions.
6 changes: 5 additions & 1 deletion http-fetch.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand Down
3 changes: 2 additions & 1 deletion http-push.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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();

Expand Down
30 changes: 28 additions & 2 deletions http.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
4 changes: 1 addition & 3 deletions http.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit fc57b6a

Please sign in to comment.