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 )