Revision 3ebbd00cf3c5a7c6f90e2fed8adaf0c5145fb4ac authored by Jim Hill on 31 May 2015, 18:16:45 UTC, committed by Junio C Hamano on 10 August 2015, 19:51:13 UTC
The loop in strbuf_read() uses xread() repeatedly while extending
the strbuf until the call returns zero.  If the buffer is
sufficiently large to begin with, this results in xread()
returning the remainder of the file to the end (returning
non-zero), the loop extending the strbuf, and then making another
call to xread() to have it return zero.

By using read_in_full(), we can tell when the read reached the end
of file: when it returns less than was requested, it's eof.  This
way we can avoid an extra iteration that allocates an extra 8kB
that is never used.

Signed-off-by: Jim Hill <gjthill@gmail.com>
Reviewed-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent 282616c
Raw File
walker.h
#ifndef WALKER_H
#define WALKER_H

#include "remote.h"

struct walker {
	void *data;
	int (*fetch_ref)(struct walker *, struct ref *ref);
	void (*prefetch)(struct walker *, unsigned char *sha1);
	int (*fetch)(struct walker *, unsigned char *sha1);
	void (*cleanup)(struct walker *);
	int get_tree;
	int get_history;
	int get_all;
	int get_verbosely;
	int get_recover;

	int corrupt_object_found;
};

/* Report what we got under get_verbosely */
void walker_say(struct walker *walker, const char *, const char *);

/* Load pull targets from stdin */
int walker_targets_stdin(char ***target, const char ***write_ref);

/* Free up loaded targets */
void walker_targets_free(int targets, char **target, const char **write_ref);

/* If write_ref is set, the ref filename to write the target value to. */
/* If write_ref_log_details is set, additional text will appear in the ref log. */
int walker_fetch(struct walker *impl, int targets, char **target,
		 const char **write_ref, const char *write_ref_log_details);

void walker_free(struct walker *walker);

struct walker *get_http_walker(const char *url);

#endif /* WALKER_H */
back to top