Skip to content

Commit

Permalink
Merge pull request #1090 from smith-kyle/mem-safety-time
Browse files Browse the repository at this point in the history
Memory management: duplicate time
  • Loading branch information
maxkorp committed Aug 12, 2016
2 parents 07121fa + ce35433 commit 1e1a4d6
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 0 deletions.
3 changes: 3 additions & 0 deletions generate/input/descriptor.json
Original file line number Diff line number Diff line change
Expand Up @@ -2453,6 +2453,9 @@
}
}
},
"time": {
"dupFunction": "git_time_dup"
},
"trace": {
"functions": {
"git_trace_set": {
Expand Down
1 change: 1 addition & 0 deletions generate/templates/manual/include/functions/copy.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ const git_time *git_time_dup(const git_time *arg);
const git_diff_delta *git_diff_delta_dup(const git_diff_delta *arg);
const git_diff_file *git_diff_file_dup(const git_diff_file *arg);

void git_time_dup(git_time **out, const git_time *arg);
void git_transfer_progress_dup(git_transfer_progress **out, const git_transfer_progress *arg);

#endif
5 changes: 5 additions & 0 deletions generate/templates/manual/src/functions/copy.cc
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ const git_error *git_error_dup(const git_error *arg) {
return result;
}

void git_time_dup(git_time **out, const git_time *arg) {
*out = (git_time *)malloc(sizeof(git_time));
memcpy(*out, arg, sizeof(git_time));
}

void git_transfer_progress_dup(git_transfer_progress **out, const git_transfer_progress *arg) {
*out = (git_transfer_progress *)malloc(sizeof(git_transfer_progress));
memcpy(*out, arg, sizeof(git_transfer_progress));
Expand Down
23 changes: 23 additions & 0 deletions test/tests/signature.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ var assert = require("assert");
var path = require("path");
var local = path.join.bind(path, __dirname);

var garbageCollect = require("../utils/garbage_collect.js");
var exec = require("../../utils/execPromise");

describe("Signature", function() {
Expand Down Expand Up @@ -83,4 +84,26 @@ describe("Signature", function() {
});
});
});

it("duplicates time", function() {
garbageCollect();
var Time = NodeGit.Time;
var startSelfFreeingCount = Time.getSelfFreeingInstanceCount();
var startNonSelfFreeingCount =
Time.getNonSelfFreeingConstructedCount();
var time = Signature.now(name, email).when();

garbageCollect();
var endSelfFreeingCount = Time.getSelfFreeingInstanceCount();
var endNonSelfFreeingCount = Time.getNonSelfFreeingConstructedCount();
// we should get one duplicated, self-freeing time
assert.equal(startSelfFreeingCount + 1, endSelfFreeingCount);
assert.equal(startNonSelfFreeingCount, endNonSelfFreeingCount);

time = null;
garbageCollect();
endSelfFreeingCount = Time.getSelfFreeingInstanceCount();
// the self-freeing time should get freed
assert.equal(startSelfFreeingCount, endSelfFreeingCount);
});
});

0 comments on commit 1e1a4d6

Please sign in to comment.