Skip to content

Commit e927a97

Browse files
committed
Make retrieval of error message thread-safe
Fix #203
1 parent 8fa70ff commit e927a97

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1939
-812
lines changed

LibGit2Sharp/Blob.cs

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using System;
2-
using System.IO;
3-
using System.Runtime.InteropServices;
1+
using System.IO;
42
using LibGit2Sharp.Core;
53
using LibGit2Sharp.Core.Handles;
64

@@ -37,12 +35,7 @@ public virtual byte[] Content
3735
{
3836
get
3937
{
40-
using (var obj = new ObjectSafeWrapper(Id, repo))
41-
{
42-
var arr = new byte[Size];
43-
Marshal.Copy(NativeMethods.git_blob_rawcontent(obj.ObjectPtr), arr, 0, Size);
44-
return arr;
45-
}
38+
return Proxy.git_blob_rawcontent(repo.Handle, Id, Size);
4639
}
4740
}
4841

@@ -53,22 +46,15 @@ public virtual Stream ContentStream
5346
{
5447
get
5548
{
56-
using (var obj = new ObjectSafeWrapper(Id, repo))
57-
{
58-
IntPtr ptr = NativeMethods.git_blob_rawcontent(obj.ObjectPtr);
59-
unsafe
60-
{
61-
return new UnmanagedMemoryStream((byte*)ptr.ToPointer(), Size);
62-
}
63-
}
49+
return Proxy.git_blob_rawcontent_stream(repo.Handle, Id, Size);
6450
}
6551
}
6652

6753
internal static Blob BuildFromPtr(GitObjectSafeHandle obj, ObjectId id, Repository repo)
6854
{
6955
var blob = new Blob(repo, id)
7056
{
71-
Size = NativeMethods.git_blob_rawsize(obj)
57+
Size = Proxy.git_blob_rawsize(obj)
7258
};
7359
return blob;
7460
}

LibGit2Sharp/BranchCollection.cs

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ private class BranchNameEnumerable : IEnumerable<string>
101101

102102
public BranchNameEnumerable(RepositorySafeHandle handle, GitBranchType gitBranchType)
103103
{
104-
Ensure.Success(NativeMethods.git_branch_foreach(handle, gitBranchType, Callback, IntPtr.Zero));
104+
Proxy.git_branch_foreach(handle, gitBranchType, Callback);
105105
}
106106

107107
private int Callback(IntPtr branchName, GitBranchType branchType, IntPtr payload)
@@ -146,11 +146,7 @@ public virtual Branch Add(string name, string commitish, bool allowOverwrite = f
146146

147147
ObjectId commitId = repo.LookupCommit(commitish).Id;
148148

149-
using (var osw = new ObjectSafeWrapper(commitId, repo))
150-
{
151-
GitOid oid;
152-
Ensure.Success(NativeMethods.git_branch_create(out oid, repo.Handle, name, osw.ObjectPtr, allowOverwrite));
153-
}
149+
Proxy.git_branch_create(repo.Handle, name, commitId, allowOverwrite);
154150

155151
return this[ShortToLocalName(name)];
156152
}
@@ -177,14 +173,7 @@ public virtual void Remove(string name, bool isRemote = false)
177173
{
178174
Ensure.ArgumentNotNullOrEmptyString(name, "name");
179175

180-
int res = NativeMethods.git_branch_delete(repo.Handle, name, isRemote ? GitBranchType.GIT_BRANCH_REMOTE : GitBranchType.GIT_BRANCH_LOCAL);
181-
182-
if (res == (int)GitErrorCode.NotFound)
183-
{
184-
return;
185-
}
186-
187-
Ensure.Success(res);
176+
Proxy.git_branch_delete(repo.Handle, name, isRemote ? GitBranchType.GIT_BRANCH_REMOTE : GitBranchType.GIT_BRANCH_LOCAL);
188177
}
189178

190179
/// <summary>
@@ -210,7 +199,7 @@ public virtual Branch Move(string currentName, string newName, bool allowOverwri
210199
Ensure.ArgumentNotNullOrEmptyString(currentName, "currentName");
211200
Ensure.ArgumentNotNullOrEmptyString(newName, "name");
212201

213-
Ensure.Success(NativeMethods.git_branch_move(repo.Handle, currentName, newName, allowOverwrite));
202+
Proxy.git_branch_move(repo.Handle, currentName, newName, allowOverwrite);
214203

215204
return this[newName];
216205
}

LibGit2Sharp/Commit.cs

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,7 @@ public virtual int ParentsCount
104104
{
105105
get
106106
{
107-
using (var obj = new ObjectSafeWrapper(Id, repo))
108-
{
109-
return (int)NativeMethods.git_commit_parentcount(obj.ObjectPtr);
110-
}
107+
return Proxy.git_commit_parentcount(repo.Handle, Id);
111108
}
112109
}
113110

@@ -121,13 +118,13 @@ public virtual IEnumerable<Note> Notes
121118

122119
private IEnumerable<Commit> RetrieveParentsOfCommit(ObjectId oid)
123120
{
124-
using (var obj = new ObjectSafeWrapper(oid, repo))
121+
using (var obj = new ObjectSafeWrapper(oid, repo.Handle))
125122
{
126-
uint parentsCount = NativeMethods.git_commit_parentcount(obj.ObjectPtr);
123+
int parentsCount = Proxy.git_commit_parentcount(obj);
127124

128125
for (uint i = 0; i < parentsCount; i++)
129126
{
130-
using (var parentCommit = GetParentCommitHandle(i, obj))
127+
using (var parentCommit = Proxy.git_commit_parent(obj, i))
131128
{
132129
yield return BuildFromPtr(parentCommit, ObjectIdOf(parentCommit), repo);
133130
}
@@ -142,27 +139,20 @@ private IEnumerable<Note> RetrieveNotesOfCommit(ObjectId oid)
142139

143140
internal static Commit BuildFromPtr(GitObjectSafeHandle obj, ObjectId id, Repository repo)
144141
{
145-
ObjectId treeId = NativeMethods.git_commit_tree_oid(obj).MarshalAsObjectId();
142+
ObjectId treeId = Proxy.git_commit_tree_oid(obj);
146143

147144
return new Commit(id, treeId, repo)
148145
{
149-
Message = NativeMethods.git_commit_message(obj),
146+
Message = Proxy.git_commit_message(obj),
150147
Encoding = RetrieveEncodingOf(obj),
151-
Author = new Signature(NativeMethods.git_commit_author(obj)),
152-
Committer = new Signature(NativeMethods.git_commit_committer(obj)),
148+
Author = Proxy.git_commit_author(obj),
149+
Committer = Proxy.git_commit_committer(obj),
153150
};
154151
}
155152

156-
private static GitObjectSafeHandle GetParentCommitHandle(uint i, ObjectSafeWrapper obj)
157-
{
158-
GitObjectSafeHandle parentCommit;
159-
Ensure.Success(NativeMethods.git_commit_parent(out parentCommit, obj.ObjectPtr, i));
160-
return parentCommit;
161-
}
162-
163153
private static string RetrieveEncodingOf(GitObjectSafeHandle obj)
164154
{
165-
string encoding = NativeMethods.git_commit_message_encoding(obj);
155+
string encoding = Proxy.git_commit_message_encoding(obj);
166156

167157
return encoding ?? "UTF-8";
168158
}

LibGit2Sharp/CommitLog.cs

Lines changed: 12 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -108,21 +108,9 @@ public virtual Commit FindCommonAncestor(Commit first, Commit second)
108108
Ensure.ArgumentNotNull(first, "first");
109109
Ensure.ArgumentNotNull(second, "second");
110110

111-
using (var osw1 = new ObjectSafeWrapper(first.Id, repo))
112-
using (var osw2 = new ObjectSafeWrapper(second.Id, repo))
113-
{
114-
GitOid ret;
115-
int result = NativeMethods.git_merge_base(out ret, repo.Handle, osw1.ObjectPtr, osw2.ObjectPtr);
116-
117-
if (result == (int)GitErrorCode.NotFound)
118-
{
119-
return null;
120-
}
111+
ObjectId id = Proxy.git_merge_base(repo.Handle, first, second);
121112

122-
Ensure.Success(result);
123-
124-
return repo.Lookup<Commit>(new ObjectId(ret));
125-
}
113+
return id == null ? null : repo.Lookup<Commit>(id);
126114
}
127115

128116
/// <summary>
@@ -192,11 +180,9 @@ private class CommitEnumerator : IEnumerator<Commit>
192180
public CommitEnumerator(Repository repo, Filter filter)
193181
{
194182
this.repo = repo;
195-
int res = NativeMethods.git_revwalk_new(out handle, repo.Handle);
183+
handle = Proxy.git_revwalk_new(repo.Handle);
196184
repo.RegisterForCleanup(handle);
197185

198-
Ensure.Success(res);
199-
200186
Sort(filter.SortBy);
201187
Push(filter.SinceList);
202188
Hide(filter.UntilList);
@@ -216,24 +202,21 @@ object IEnumerator.Current
216202

217203
public bool MoveNext()
218204
{
219-
GitOid oid;
220-
int res = NativeMethods.git_revwalk_next(out oid, handle);
205+
ObjectId id = Proxy.git_revwalk_next(handle);
221206

222-
if (res == (int)GitErrorCode.RevWalkOver)
207+
if (id == null)
223208
{
224209
return false;
225210
}
226211

227-
Ensure.Success(res);
228-
229-
currentOid = new ObjectId(oid);
212+
currentOid = id;
230213

231214
return true;
232215
}
233216

234217
public void Reset()
235218
{
236-
NativeMethods.git_revwalk_reset(handle);
219+
Proxy.git_revwalk_reset(handle);
237220
}
238221

239222
#endregion
@@ -249,23 +232,21 @@ private void Dispose(bool disposing)
249232
handle.SafeDispose();
250233
}
251234

252-
private delegate int HidePushSignature(RevWalkerSafeHandle handle, ref GitOid oid);
235+
private delegate void HidePushSignature(RevWalkerSafeHandle handle, ObjectId id);
253236

254237
private void InternalHidePush(IList<object> identifier, HidePushSignature hidePush)
255238
{
256239
IEnumerable<ObjectId> oids = RetrieveCommitOids(identifier).TakeWhile(o => o != null);
257240

258241
foreach (ObjectId actedOn in oids)
259242
{
260-
GitOid oid = actedOn.Oid;
261-
int res = hidePush(handle, ref oid);
262-
Ensure.Success(res);
243+
hidePush(handle, actedOn);
263244
}
264245
}
265246

266247
private void Push(IList<object> identifier)
267248
{
268-
InternalHidePush(identifier, NativeMethods.git_revwalk_push);
249+
InternalHidePush(identifier, Proxy.git_revwalk_push);
269250
}
270251

271252
private void Hide(IList<object> identifier)
@@ -275,12 +256,12 @@ private void Hide(IList<object> identifier)
275256
return;
276257
}
277258

278-
InternalHidePush(identifier, NativeMethods.git_revwalk_hide);
259+
InternalHidePush(identifier, Proxy.git_revwalk_hide);
279260
}
280261

281262
private void Sort(GitSortOptions options)
282263
{
283-
NativeMethods.git_revwalk_sorting(handle, options);
264+
Proxy.git_revwalk_sorting(handle, options);
284265
}
285266

286267
private ObjectId DereferenceToCommit(string identifier)

0 commit comments

Comments
 (0)