Exemple #1
0
static uint32_t *
vsl_get(unsigned len, unsigned records, unsigned flushes)
{
	uint32_t *p;

	if (pthread_mutex_trylock(&vsl_mtx)) {
		AZ(pthread_mutex_lock(&vsl_mtx));
		VSC_C_main->shm_cont++;
	}
	assert(vsl_ptr < vsl_end);
	assert(((uintptr_t)vsl_ptr & 0x3) == 0);

	VSC_C_main->shm_writes++;
	VSC_C_main->shm_flushes += flushes;
	VSC_C_main->shm_records += records;

	/* Wrap if necessary */
	if (VSL_END(vsl_ptr, len) >= vsl_end)
		vsl_wrap();

	p = vsl_ptr;
	vsl_ptr = VSL_END(vsl_ptr, len);

	*vsl_ptr = VSL_ENDMARKER;

	assert(vsl_ptr < vsl_end);
	assert(((uintptr_t)vsl_ptr & 0x3) == 0);
	AZ(pthread_mutex_unlock(&vsl_mtx));

	return (p);
}
Exemple #2
0
static void
wslr(struct vsl_log *vsl, enum VSL_tag_e tag, int id, txt t)
{
	unsigned l, mlen;

	Tcheck(t);
	if (id == -1)
		id = vsl->wid;
	mlen = cache_param->shm_reclen;

	/* Truncate */
	l = Tlen(t);
	if (l > mlen) {
		l = mlen;
		t.e = t.b + l;
	}

	assert(vsl->wlp < vsl->wle);

	/* Wrap if necessary */
	if (VSL_END(vsl->wlp, l) >= vsl->wle)
		VSL_Flush(vsl, 1);
	assert(VSL_END(vsl->wlp, l) < vsl->wle);
	memcpy(VSL_DATA(vsl->wlp), t.b, l);
	vsl_hdr(tag, vsl->wlp, l, id);
	vsl->wlp = VSL_END(vsl->wlp, l);
	assert(vsl->wlp < vsl->wle);
	vsl->wlr++;
	if (cache_param->diag_bitmap & 0x10000)
		VSL_Flush(vsl, 0);
}
Exemple #3
0
static void
wsl(struct vsl_log *vsl, enum VSL_tag_e tag, int id, const char *fmt,
    va_list ap)
{
	char *p;
	unsigned n, mlen;
	txt t;

	AN(fmt);
	mlen = cache_param->shm_reclen;

	if (strchr(fmt, '%') == NULL) {
		t.b = TRUST_ME(fmt);
		t.e = strchr(t.b, '\0');
		wslr(vsl, tag, id, t);
	} else {
		assert(vsl->wlp < vsl->wle);

		/* Wrap if we cannot fit a full size record */
		if (VSL_END(vsl->wlp, mlen) >= vsl->wle)
			VSL_Flush(vsl, 1);

		p = VSL_DATA(vsl->wlp);
		n = vsnprintf(p, mlen, fmt, ap);
		if (n > mlen)
			n = mlen;	/* we truncate long fields */
		vsl_hdr(tag, vsl->wlp, n, id);
		vsl->wlp = VSL_END(vsl->wlp, n);
		assert(vsl->wlp < vsl->wle);
		vsl->wlr++;
	}
	if (cache_param->diag_bitmap & 0x10000)
		VSL_Flush(vsl, 0);
}
void
WSLR(struct worker *wrk, enum VSL_tag_e tag, int id, txt t)
{
	unsigned l, mlen;

	Tcheck(t);
	mlen = cache_param->shm_reclen;

	/* Truncate */
	l = Tlen(t);
	if (l > mlen) {
		l = mlen;
		t.e = t.b + l;
	}

	assert(wrk->wlp < wrk->wle);

	/* Wrap if necessary */
	if (VSL_END(wrk->wlp, l) >= wrk->wle)
		WSL_Flush(wrk, 1);
	assert (VSL_END(wrk->wlp, l) < wrk->wle);
	memcpy(VSL_DATA(wrk->wlp), t.b, l);
	vsl_hdr(tag, wrk->wlp, l, id);
	wrk->wlp = VSL_END(wrk->wlp, l);
	assert(wrk->wlp < wrk->wle);
	wrk->wlr++;
	if (cache_param->diag_bitmap & 0x10000)
		WSL_Flush(wrk, 0);
}