Skip to content

Commit

Permalink
Add a lockfile function to append to a file
Browse files Browse the repository at this point in the history
This takes care of copying the original contents into the replacement
file after the lock is held, so that concurrent additions can't miss
each other's changes.

[jc: munged to drop mmap in favor of copy_file.]

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Daniel Barkalow authored and Junio C Hamano committed May 5, 2008
1 parent 2d5c298 commit ea3cd5c
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 0 deletions.
1 change: 1 addition & 0 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,7 @@ struct lock_file {
char filename[PATH_MAX];
};
extern int hold_lock_file_for_update(struct lock_file *, const char *path, int);
extern int hold_lock_file_for_append(struct lock_file *, const char *path, int);
extern int commit_lock_file(struct lock_file *);

extern int hold_locked_index(struct lock_file *, int);
Expand Down
28 changes: 28 additions & 0 deletions lockfile.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,34 @@ int hold_lock_file_for_update(struct lock_file *lk, const char *path, int die_on
return fd;
}

int hold_lock_file_for_append(struct lock_file *lk, const char *path, int die_on_error)
{
int fd, orig_fd;

fd = lock_file(lk, path);
if (fd < 0) {
if (die_on_error)
die("unable to create '%s.lock': %s", path, strerror(errno));
return fd;
}

orig_fd = open(path, O_RDONLY);
if (orig_fd < 0) {
if (errno != ENOENT) {
if (die_on_error)
die("cannot open '%s' for copying", path);
close(fd);
return error("cannot open '%s' for copying", path);
}
} else if (copy_fd(orig_fd, fd)) {
if (die_on_error)
exit(128);
close(fd);
return -1;
}
return fd;
}

int close_lock_file(struct lock_file *lk)
{
int fd = lk->fd;
Expand Down

0 comments on commit ea3cd5c

Please sign in to comment.