From: Junio C Hamano <gitster@pobox.com>
To: Brandon Casey <drafnel@gmail.com>
Cc: "Linus Torvalds" <torvalds@linux-foundation.org>,
"Brandon Casey" <casey@nrlssc.navy.mil>,
"Git Mailing List" <git@vger.kernel.org>,
"Alex Riesen" <raa.lkml@gmail.com>,
"Kristian Høgsberg" <krh@redhat.com>
Subject: [PATCH 1/2] Document lockfile API
Date: Wed, 16 Jan 2008 11:00:13 -0800 [thread overview]
Message-ID: <7vk5m9r3ya.fsf_-_@gitster.siamese.dyndns.org> (raw)
In-Reply-To: <Pine.LNX.4.44.0801152006260.944-100000@demand> (Brandon Casey's message of "Tue, 15 Jan 2008 20:11:55 -0600 (CST)")
We have nice set of placeholders, but nobody stepped in to fill
the gap in the API documentation, so I am doing it myself.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
Documentation/technical/api-lockfile.txt | 67 ++++++++++++++++++++++++++---
1 files changed, 60 insertions(+), 7 deletions(-)
diff --git a/Documentation/technical/api-lockfile.txt b/Documentation/technical/api-lockfile.txt
index 73ac102..5b1553e 100644
--- a/Documentation/technical/api-lockfile.txt
+++ b/Documentation/technical/api-lockfile.txt
@@ -1,12 +1,65 @@
lockfile API
============
-Talk about <lockfile.c>, things like:
+The lockfile API serves two purposes:
-* lockfile lifetime -- atexit(3) looks at them, do not put them on the
- stack;
-* hold_lock_file_for_update()
-* commit_lock_file()
-* rollback_rock_file()
+* Mutual exclusion. When we write out a new index file, first
+ we create a new file `$GIT_DIR/index.lock`, write the new
+ contents into it, and rename it to the final destination
+ `$GIT_DIR/index`. We try to create the `$GIT_DIR/index.lock`
+ file with O_EXCL so that we can notice and fail when somebody
+ else is already trying to update the index file.
-(JC, Dscho, Shawn)
+* Automatic cruft removal. After we create the "lock" file, we
+ may decide to `die()`, and we would want to make sure that we
+ remove the file that has not been committed to its final
+ destination. This is done by remembering the lockfiles we
+ created in a linked list and cleaning them up from an
+ `atexit(3)` handler. Outstanding lockfiles are also removed
+ when the program dies on a signal.
+
+
+The functions
+-------------
+
+hold_lock_file_for_update::
+
+ Take a pointer to `struct lock_file`, the filename of
+ the final destination (e.g. `$GIT_DIR/index`) and a flag
+ `die_on_error`. Attempt to create a lockfile for the
+ destination and return the file descriptor for writing
+ to the file. If `die_on_error` flag is true, it dies if
+ a lock is already taken for the file; otherwise it
+ returns a negative integer to the caller on failure.
+
+commit_lock_file::
+
+ Take a pointer to the `struct lock_file` initialized
+ with an earlier call to `hold_lock_file_for_update()`,
+ close the file descriptor and rename the lockfile to its
+ final destination.
+
+rollback_lock_file::
+
+ Take a pointer to the `struct lock_file` initialized
+ with an earlier call to `hold_lock_file_for_update()`,
+ close the file descriptor and remove the lockfile.
+
+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.
+
+Call `commit_lock_file()` or `rollback_lock_file()` when you are
+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
+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
+`close(2)`. Worse yet, if you `close(2)`, open another file
+descriptor for completely different purpose, and then call
+`commit_lock_file()` or `rollback_lock_file()`, they may close
+that unrelated file descriptor.
--
1.5.4.rc3.14.g44397
next prev parent reply other threads:[~2008-01-16 19:01 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-11 22:11 git-commit fatal: Out of memory? mmap failed: Bad file descriptor Brandon Casey
2008-01-11 22:18 ` Charles Bailey
2008-01-12 4:56 ` Jeff King
2008-01-11 22:19 ` Marco Costalba
2008-01-11 22:47 ` Brandon Casey
2008-01-11 23:48 ` Junio C Hamano
2008-01-12 0:43 ` Brandon Casey
2008-01-12 1:08 ` Junio C Hamano
2008-01-12 20:16 ` Alex Riesen
2008-01-14 23:22 ` Brandon Casey
2008-01-15 2:42 ` Brandon Casey
2008-01-15 5:42 ` Linus Torvalds
2008-01-15 17:26 ` Brandon Casey
2008-01-15 17:36 ` Linus Torvalds
2008-01-15 18:27 ` Brandon Casey
2008-01-15 18:50 ` Linus Torvalds
2008-01-15 19:43 ` Brandon Casey
2008-01-15 20:00 ` Kristian Høgsberg
2008-01-15 20:27 ` Brandon Casey
2008-01-15 20:39 ` Brandon Casey
2008-01-15 20:09 ` Linus Torvalds
2008-01-15 20:20 ` Linus Torvalds
2008-01-15 23:10 ` Junio C Hamano
2008-01-16 1:27 ` Junio C Hamano
2008-01-16 2:11 ` Brandon Casey
2008-01-16 19:00 ` Junio C Hamano [this message]
2008-01-16 19:05 ` [PATCH 2/2] close_lock_file(): new function in the lockfile API Junio C Hamano
2008-01-16 20:08 ` Linus Torvalds
2008-01-16 20:36 ` Junio C Hamano
2008-01-16 20:46 ` Brandon Casey
2008-01-16 21:57 ` Junio C Hamano
2008-01-16 22:46 ` Brandon Casey
2008-01-16 22:55 ` Junio C Hamano
2008-01-16 23:08 ` Brandon Casey
2008-01-16 23:16 ` Brandon Casey
2008-01-16 23:19 ` Junio C Hamano
2008-01-16 23:28 ` Brandon Casey
2008-01-16 7:53 ` git-commit fatal: Out of memory? mmap failed: Bad file descriptor Johannes Sixt
2008-01-15 12:21 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7vk5m9r3ya.fsf_-_@gitster.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=casey@nrlssc.navy.mil \
--cc=drafnel@gmail.com \
--cc=git@vger.kernel.org \
--cc=krh@redhat.com \
--cc=raa.lkml@gmail.com \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).