Esempio n. 1
0
GIT_INLINE(int) pack_window_contains(git_mwindow *win, off_t offset)
{
	/* We must promise at least 20 bytes (one hash) after the
	 * offset is available from this window, otherwise the offset
	 * is not actually in this window and a different window (which
	 * has that one hash excess) must be used.  This is to support
	 * the object header and delta base parsing routines below.
	 */
	return git_mwindow_contains(win, offset + 20);
}
Esempio n. 2
0
/*
 * Open a new window, closing the least recenty used until we have
 * enough space. Don't forget to add it to your list
 */
unsigned char *git_mwindow_open(git_mwindow_file *mwf, git_mwindow **cursor,
								git_off_t offset, int extra, unsigned int *left)
{
	git_mwindow *w = *cursor;

	if (!w || !git_mwindow_contains(w, offset + extra)) {
		if (w) {
			w->inuse_cnt--;
		}

		for (w = mwf->windows; w; w = w->next) {
			if (git_mwindow_contains(w, offset + extra))
				break;
		}

		/*
		 * If there isn't a suitable window, we need to create a new
		 * one.
		 */
		if (!w) {
			w = new_window(mwf, mwf->fd, mwf->size, offset);
			if (w == NULL)
				return NULL;
			w->next = mwf->windows;
			mwf->windows = w;
		}
	}

	/* If we changed w, store it in the cursor */
	if (w != *cursor) {
		w->last_used = ctl.used_ctr++;
		w->inuse_cnt++;
		*cursor = w;
	}

	offset -= w->offset;
	assert(git__is_sizet(offset));

	if (left)
		*left = (unsigned int)(w->window_map.len - offset);

	return (unsigned char *) w->window_map.data + offset;
}