[PATCH 2/2] close_lock_file(): new function in the lockfile API
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jan 16, 2008, 19:05 UTC
- Message-ID
- <7vejchr3pf.fsf_-_@gitster.siamese.dyndns.org>
- In-Reply-To
- <Pine.LNX.4.44.0801152006260.944-100000@demand>
The lockfile API is a handy way to obtain a file that is cleaned up if you die(). But sometimes you would need this sequence to work:
1. hold_lock_file_for_update() to get a file descriptor for
writing; 2. write the contents out, without being able to decide if the
results should be committed or rolled back; 3. do something else that makes the decision --- and this
"something else" needs the lockfile not to have an open file
descriptor for writing (e.g. Windows do not want a open file
to be renamed); 4. call commit_lock_file() or rollback_lock_file() as
appropriately.This adds close_lock_file() you can call between step 2 and 3 in the above sequence.
Signed-off-by: Junio C Hamano <gitster@pobox.com> --- Documentation/technical/api-lockfile.txt | 11 +++++++++-- cache.h | 2 +- lockfile.c | 6 ++++++ 3 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/Documentation/technical/api-lockfile.txt b/Documentation/technical/api-lockfile.txt index 5b1553e..def5f2a 100644 --- a/Documentation/technical/api-lockfile.txt +++ b/Documentation/technical/api-lockfile.txt @@ -45,6 +45,11 @@ rollback_lock_file:: with an earlier call to `hold_lock_file_for_update()`, close the file descriptor and remove the lockfile. +close_lock_file:: + Take a pointer to the `struct lock_file` initialized + with an earlier call to `hold_lock_file_for_update()`, + and close the file descriptor. + Because the structure is used in an `atexit(3)` handler, its storage has to stay throughout the life of the program. It cannot be an auto variable allocated on the stack. @@ -54,8 +59,10 @@ done writing to the file descriptor. If you do not call either and simply `exit(3)` from the program, an `atexit(3)` handler will close and remove the lockfile. -You should not close the file descriptor you obtained from -`hold_lock_file_for_update` function yourself. The `struct +If you need to close the file descriptor you obtained from +`hold_lock_file_for_update` function yourself, do so by calling +`close_lock_file()`. You should never call `close(2)` yourself! +Otherwise the `struct lock_file` structure still remembers that the file descriptor needs to be closed, and a later call to `commit_lock_file()` or `rollback_lock_file()` will result in duplicate calls to diff --git a/cache.h b/cache.h index 39331c2..5033b34 100644 --- a/cache.h +++ b/cache.h @@ -308,7 +308,7 @@ extern int commit_lock_file(struct lock_file *); extern int hold_locked_index(struct lock_file *, int); extern int commit_locked_index(struct lock_file *); extern void set_alternate_index_output(const char *); - +extern void close_lock_file(struct lock_file *); extern void rollback_lock_file(struct lock_file *); extern int delete_ref(const char *, const unsigned char *sha1); diff --git a/lockfile.c b/lockfile.c index f45d3ed..e57d850 100644 --- a/lockfile.c +++ b/lockfile.c @@ -201,3 +201,9 @@ void rollback_lock_file(struct lock_file *lk) } lk->filename[0] = 0; } + +void close_lock_file(struct lock_file *lk) +{ + close(lk->fd); + lk->fd = -1; +}
-- 1.5.4.rc3.14.g44397