From: "Shawn O. Pearce" <spearce@spearce.org>
To: Robin Rosenberg <robin.rosenberg@dewire.com>
Cc: git@vger.kernel.org
Subject: [JGIT PATCH 04/13] Make RefDatabase thread-safe
Date: Mon, 22 Dec 2008 16:27:14 -0800 [thread overview]
Message-ID: <1229992043-1053-5-git-send-email-spearce@spearce.org> (raw)
In-Reply-To: <1229992043-1053-4-git-send-email-spearce@spearce.org>
This is necessary to support a thread-safe Repository.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
.../src/org/spearce/jgit/lib/RefDatabase.java | 29 +++++++++++---------
1 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/RefDatabase.java b/org.spearce.jgit/src/org/spearce/jgit/lib/RefDatabase.java
index 4cf6e08..87f26bf 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/RefDatabase.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/RefDatabase.java
@@ -93,7 +93,7 @@ RefDatabase(final Repository r) {
clearCache();
}
- void clearCache() {
+ synchronized void clearCache() {
looseRefs = new HashMap<String, Ref>();
looseRefsMTime = new HashMap<String, Long>();
packedRefs = new HashMap<String, Ref>();
@@ -139,9 +139,11 @@ RefUpdate newUpdate(final String name) throws IOException {
}
void stored(final String origName, final String name, final ObjectId id, final long time) {
- looseRefs.put(name, new Ref(Ref.Storage.LOOSE, origName, name, id));
- looseRefsMTime.put(name, time);
- setModified();
+ synchronized (this) {
+ looseRefs.put(name, new Ref(Ref.Storage.LOOSE, origName, name, id));
+ looseRefsMTime.put(name, time);
+ setModified();
+ }
db.fireRefsMaybeChanged();
}
@@ -157,11 +159,13 @@ void stored(final String origName, final String name, final ObjectId id, final l
void link(final String name, final String target) throws IOException {
final byte[] content = Constants.encode("ref: " + target + "\n");
lockAndWriteFile(fileForRef(name), content);
- setModified();
+ synchronized (this) {
+ setModified();
+ }
db.fireRefsMaybeChanged();
}
- void setModified() {
+ private void setModified() {
lastRefModification = refModificationCounter++;
}
@@ -210,7 +214,7 @@ Ref readRef(final String partialName) throws IOException {
return avail;
}
- private void readPackedRefs(final Map<String, Ref> avail) {
+ private synchronized void readPackedRefs(final Map<String, Ref> avail) {
refreshPackedRefs();
avail.putAll(packedRefs);
}
@@ -229,7 +233,7 @@ private void readLooseRefs(final Map<String, Ref> avail,
}
}
- private void readOneLooseRef(final Map<String, Ref> avail,
+ private synchronized void readOneLooseRef(final Map<String, Ref> avail,
final String origName, final String refName, final File ent) {
// Unchanged and cached? Don't read it again.
//
@@ -323,8 +327,8 @@ private Ref readRefBasic(final String name, final int depth) throws IOException
return readRefBasic(name, name, depth);
}
- private Ref readRefBasic(final String origName, final String name, final int depth)
- throws IOException {
+ private synchronized Ref readRefBasic(final String origName,
+ final String name, final int depth) throws IOException {
// Prefer loose ref to packed ref as the loose
// file can be more up-to-date than a packed one.
//
@@ -408,7 +412,7 @@ private Ref readRefBasic(final String origName, final String name, final int dep
return ref;
}
- private void refreshPackedRefs() {
+ private synchronized void refreshPackedRefs() {
final long currTime = packedRefsFile.lastModified();
final long currLen = currTime == 0 ? 0 : packedRefsFile.length();
if (currTime == packedRefsLastModified && currLen == packedRefsLength)
@@ -479,7 +483,7 @@ private void lockAndWriteFile(File file, byte[] content) throws IOException {
throw new ObjectWritingException("Unable to write " + name);
}
- void removePackedRef(String name) throws IOException {
+ synchronized void removePackedRef(String name) throws IOException {
packedRefs.remove(name);
writePackedRefs();
}
@@ -508,5 +512,4 @@ private static BufferedReader openReader(final File fileLocation)
return new BufferedReader(new InputStreamReader(new FileInputStream(
fileLocation), Constants.CHARSET));
}
-
}
--
1.6.1.rc4.301.g5497a
next prev parent reply other threads:[~2008-12-23 0:30 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-23 0:27 [JGIT PATCH 00/13] Add receive-pack server side support Shawn O. Pearce
2008-12-23 0:27 ` [JGIT PATCH 01/13] Fix invalid "double checked locking" in InflaterCache Shawn O. Pearce
2008-12-23 0:27 ` [JGIT PATCH 02/13] Cleanup stupid release of the cached Inflater in IndexPack Shawn O. Pearce
2008-12-23 0:27 ` [JGIT PATCH 03/13] Cache an Inflater inside a WindowCursor and reuse it as much as possible Shawn O. Pearce
2008-12-23 0:27 ` Shawn O. Pearce [this message]
2008-12-23 0:27 ` [JGIT PATCH 05/13] Make PackFile thread-safe Shawn O. Pearce
2008-12-23 0:27 ` [JGIT PATCH 06/13] Make Repository thread-safe Shawn O. Pearce
2008-12-23 0:27 ` [JGIT PATCH 07/13] Don't open a PackFile multiple times on scanForPacks Shawn O. Pearce
2008-12-23 0:27 ` [JGIT PATCH 08/13] Expose RepositoryConfig.getBoolean so applications can use it Shawn O. Pearce
2008-12-23 0:27 ` [JGIT PATCH 09/13] Add AnyObjectId.copyTo(StringBuilder) Shawn O. Pearce
2008-12-23 0:27 ` [JGIT PATCH 10/13] Add compare-and-swap semantics to RefUpdate Shawn O. Pearce
2008-12-23 0:27 ` [JGIT PATCH 11/13] Allow null new ObjectId during RefUpdate.delete Shawn O. Pearce
2008-12-23 0:27 ` [JGIT PATCH 12/13] Implement the git-receive-pack process in Java Shawn O. Pearce
2008-12-23 0:27 ` [JGIT PATCH 13/13] Add basic git daemon support to publish receive-pack Shawn O. Pearce
2009-01-03 23:48 ` Robin Rosenberg
2009-01-05 2:46 ` [PATCH] Permit a wider range of repository names in jgit daemon requests Shawn O. Pearce
2009-01-05 23:07 ` Robin Rosenberg
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=1229992043-1053-5-git-send-email-spearce@spearce.org \
--to=spearce@spearce.org \
--cc=git@vger.kernel.org \
--cc=robin.rosenberg@dewire.com \
/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).