#include <ncbi.h>
#include <gishlib.h>

static sigset_t	vecsave[2*THREADS_MAX+1];
static unsigned	veccnt[2*THREADS_MAX+1];

void
critical_begin()
{
	sigset_t	fullmask;
	sigset_t	vectmp;
	int	id;

	sigfillset(&fullmask);

	sys_sigsetmask(SIG_SETMASK, &fullmask, &vectmp);

	id = mproc_id();
	if (veccnt[id]++ > 0)
		return;
	vecsave[id] = vectmp;
	return;
}

void
critical_end()
{
	int	id;

	id = mproc_id();
	if (!veccnt[id] || --veccnt[id] > 0)
		return;

	sys_sigsetmask(SIG_SETMASK, &vecsave[id], NULL);
	return;
}
