Database-Sophia

 view release on metacpan or  search on metacpan

Sophia-src/db/recover.c  view on Meta::CPAN

{
	/* implement multi-process database exclusive access by creating
	 * lock file. */
	char path[1024];
	snprintf(path, sizeof(path), "%s/lock", s->env->dir);
	int rc = sp_lockfile(&s->lockdb, path);
	if (spunlikely(rc == -1))
		sp_e(s, SPE, "failed to create lock file (errno: %d, %s)",
		     errno, strerror(errno));
	if (rc == 1)
		return sp_e(s, SPE, "database is locked");
	/* within a single process, add database path to the list and
	 * check the presence on a open. */
	sp_lock(&dirlock);
	if (dirlockn == 0) {
		sp_listinit(&dirlocks);
	} else {
		splist *i;
		sp_listforeach(&dirlocks, i) {
			spdirlock *l = spcast(i, spdirlock, link);
			if (! strcmp(s->env->dir, l->dir)) {
				sp_unlock(&dirlock);
				return sp_e(s, SPE, "database is locked");
			}
		}
	}
	int lendir = strlen(s->env->dir) + 1;
	int len = sizeof(spdirlock) + lendir;
	spdirlock *l = malloc(len);
	if (spunlikely(l == NULL)) {
		sp_unlock(&dirlock);
		return sp_e(s, SPEOOM, "failed to allocate memory");
	}



( run in 0.943 second using v1.01-cache-2.11-cpan-49f99fa48dc )