The sequencer is our attempt to lib-ify cherry-pick. Yet it behaves like a one-shot command when it reads its configuration: memory is allocated and released only when the command exits. This is kind of okay for git-cherry-pick, which *is* a one-shot command. All the work to make the sequencer its work horse was done to allow using the functionality as a library function, though, including proper clean-up after use. This patch introduces an API to pass the responsibility of releasing certain memory to the sequencer. Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- sequencer.c | 13 +++++++++++++ sequencer.h | 8 +++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/sequencer.c b/sequencer.c index c4b223b..b5be0f9 100644 --- a/sequencer.c +++ b/sequencer.c @@ -114,9 +114,22 @@ static int has_conforming_footer(struct strbuf *sb, struct strbuf *sob, return 1; } +void *sequencer_entrust(struct replay_opts *opts, void *set_me_free_after_use) +{ + ALLOC_GROW(opts->owned, opts->owned_nr + 1, opts->owned_alloc); + opts->owned[opts->owned_nr++] = set_me_free_after_use; + + return set_me_free_after_use; +} + static void remove_sequencer_state(const struct replay_opts *opts) { struct strbuf dir = STRBUF_INIT; + int i; + + for (i = 0; i < opts->owned_nr; i++) + free(opts->owned[i]); + free(opts->owned); strbuf_addf(&dir, "%s", get_dir(opts)); remove_dir_recursively(&dir, 0); diff --git a/sequencer.h b/sequencer.h index c955594..20b708a 100644 --- a/sequencer.h +++ b/sequencer.h @@ -43,8 +43,14 @@ struct replay_opts { /* Only used by REPLAY_NONE */ struct rev_info *revs; + + /* malloc()ed data entrusted to the sequencer */ + void **owned; + int owned_nr, owned_alloc; }; -#define REPLAY_OPTS_INIT { -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, 0, 0, NULL } +#define REPLAY_OPTS_INIT { -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, 0, 0, NULL, NULL, 0, 0 } + +void *sequencer_entrust(struct replay_opts *opts, void *set_me_free_after_use); int sequencer_pick_revisions(struct replay_opts *opts); -- 2.10.0.rc1.114.g2bd6b38