Fixed lock file error
This commit is contained in:
parent
c7a9e2f6aa
commit
03d970c576
|
|
@ -635,13 +635,13 @@ amduat_asl_pointer_error_t amduat_asl_pointer_cas(
|
||||||
const amduat_reference_t *new_ref,
|
const amduat_reference_t *new_ref,
|
||||||
bool *out_swapped) {
|
bool *out_swapped) {
|
||||||
char *head_path = NULL;
|
char *head_path = NULL;
|
||||||
int fd = -1;
|
int lock_fd = -1;
|
||||||
struct flock lock;
|
struct flock lock;
|
||||||
bool exists = false;
|
bool exists = false;
|
||||||
amduat_reference_t current_ref;
|
amduat_reference_t current_ref;
|
||||||
amduat_reference_t prev_ref;
|
amduat_reference_t prev_ref;
|
||||||
bool has_prev = false;
|
bool has_prev = false;
|
||||||
bool created = false;
|
char *lock_path = NULL;
|
||||||
amduat_asl_pointer_error_t err;
|
amduat_asl_pointer_error_t err;
|
||||||
|
|
||||||
if (out_swapped == NULL) {
|
if (out_swapped == NULL) {
|
||||||
|
|
@ -663,8 +663,18 @@ amduat_asl_pointer_error_t amduat_asl_pointer_cas(
|
||||||
return AMDUAT_ASL_POINTER_ERR_IO;
|
return AMDUAT_ASL_POINTER_ERR_IO;
|
||||||
}
|
}
|
||||||
|
|
||||||
fd = open(head_path, O_RDWR | O_CREAT, 0644);
|
lock_path = (char *)malloc(strlen(head_path) + sizeof(".lock"));
|
||||||
if (fd < 0) {
|
if (lock_path == NULL) {
|
||||||
|
free(head_path);
|
||||||
|
return AMDUAT_ASL_POINTER_ERR_IO;
|
||||||
|
}
|
||||||
|
snprintf(lock_path, strlen(head_path) + sizeof(".lock"), "%s.lock",
|
||||||
|
head_path);
|
||||||
|
|
||||||
|
/* Lock a stable sidecar file so lock ownership survives head-file renames. */
|
||||||
|
lock_fd = open(lock_path, O_RDWR | O_CREAT, 0644);
|
||||||
|
if (lock_fd < 0) {
|
||||||
|
free(lock_path);
|
||||||
free(head_path);
|
free(head_path);
|
||||||
return AMDUAT_ASL_POINTER_ERR_IO;
|
return AMDUAT_ASL_POINTER_ERR_IO;
|
||||||
}
|
}
|
||||||
|
|
@ -674,19 +684,13 @@ amduat_asl_pointer_error_t amduat_asl_pointer_cas(
|
||||||
lock.l_whence = SEEK_SET;
|
lock.l_whence = SEEK_SET;
|
||||||
lock.l_start = 0;
|
lock.l_start = 0;
|
||||||
lock.l_len = 0;
|
lock.l_len = 0;
|
||||||
if (fcntl(fd, F_SETLKW, &lock) != 0) {
|
if (fcntl(lock_fd, F_SETLKW, &lock) != 0) {
|
||||||
close(fd);
|
close(lock_fd);
|
||||||
|
free(lock_path);
|
||||||
free(head_path);
|
free(head_path);
|
||||||
return AMDUAT_ASL_POINTER_ERR_IO;
|
return AMDUAT_ASL_POINTER_ERR_IO;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
struct stat st;
|
|
||||||
if (fstat(fd, &st) == 0 && st.st_size == 0) {
|
|
||||||
created = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
err = amduat_asl_pointer_read_head(head_path, name, &exists, ¤t_ref,
|
err = amduat_asl_pointer_read_head(head_path, name, &exists, ¤t_ref,
|
||||||
&prev_ref, &has_prev);
|
&prev_ref, &has_prev);
|
||||||
if (err == AMDUAT_ASL_POINTER_ERR_NOT_FOUND) {
|
if (err == AMDUAT_ASL_POINTER_ERR_NOT_FOUND) {
|
||||||
|
|
@ -694,24 +698,21 @@ amduat_asl_pointer_error_t amduat_asl_pointer_cas(
|
||||||
err = AMDUAT_ASL_POINTER_OK;
|
err = AMDUAT_ASL_POINTER_OK;
|
||||||
}
|
}
|
||||||
if (err != AMDUAT_ASL_POINTER_OK) {
|
if (err != AMDUAT_ASL_POINTER_OK) {
|
||||||
close(fd);
|
close(lock_fd);
|
||||||
|
free(lock_path);
|
||||||
free(head_path);
|
free(head_path);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (expected_exists != exists) {
|
if (expected_exists != exists) {
|
||||||
if (created) {
|
close(lock_fd);
|
||||||
(void)unlink(head_path);
|
free(lock_path);
|
||||||
}
|
|
||||||
close(fd);
|
|
||||||
free(head_path);
|
free(head_path);
|
||||||
return AMDUAT_ASL_POINTER_OK;
|
return AMDUAT_ASL_POINTER_OK;
|
||||||
}
|
}
|
||||||
if (expected_exists && !amduat_reference_eq(*expected_ref, current_ref)) {
|
if (expected_exists && !amduat_reference_eq(*expected_ref, current_ref)) {
|
||||||
if (created) {
|
close(lock_fd);
|
||||||
(void)unlink(head_path);
|
free(lock_path);
|
||||||
}
|
|
||||||
close(fd);
|
|
||||||
free(head_path);
|
free(head_path);
|
||||||
return AMDUAT_ASL_POINTER_OK;
|
return AMDUAT_ASL_POINTER_OK;
|
||||||
}
|
}
|
||||||
|
|
@ -729,7 +730,8 @@ amduat_asl_pointer_error_t amduat_asl_pointer_cas(
|
||||||
if (has_prev) {
|
if (has_prev) {
|
||||||
amduat_reference_free(&prev_ref);
|
amduat_reference_free(&prev_ref);
|
||||||
}
|
}
|
||||||
close(fd);
|
close(lock_fd);
|
||||||
|
free(lock_path);
|
||||||
free(head_path);
|
free(head_path);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue