git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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

  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).