On Fri, Jul 24, 2020 at 08:51:32AM -0400, Derrick Stolee wrote: > On 7/24/2020 8:23 AM, Derrick Stolee wrote: > > On 7/23/2020 3:57 PM, Junio C Hamano wrote: > >> "Derrick Stolee via GitGitGadget" <gitgitgadget@xxxxxxxxx> writes: > >> > >>> +static void initialize_tasks(void) > >>> +{ > >>> + int i; > >>> + num_tasks = 0; > >>> + > >>> + for (i = 0; i < MAX_NUM_TASKS; i++) > >>> + tasks[i] = xcalloc(1, sizeof(struct maintenance_task)); > >>> + > >>> + tasks[num_tasks]->name = "gc"; > >>> + tasks[num_tasks]->fn = maintenance_task_gc; > >>> + tasks[num_tasks]->enabled = 1; > >>> + num_tasks++; > >> > >> Are we going to have 47 different tasks initialized by code like > >> this in the future? I would have expected that you'd have a table > >> of tasks that serves as the blueprint copy and copy it to the table > >> to be used if there is some need to mutate the table-to-be-used. > > > > Making it a table will likely make it easier to read. I hadn't > > thought of it. > > > > At the start, I thought that the diff would look awful as we add > > members to the struct. However, the members that are not specified > > are set to zero, so I should be able to craft this into something > > not too terrible. > > OK, my attempt has led to this final table: > > const struct maintenance_task default_tasks[] = { > { > "prefetch", > maintenance_task_prefetch, > }, > { > "loose-objects", > maintenance_task_loose_objects, > loose_object_auto_condition, > }, > { > "incremental-repack", > maintenance_task_incremental_repack, > incremental_repack_auto_condition, > }, > { > "gc", > maintenance_task_gc, > need_to_gc, > 1, > }, > { > "commit-graph", > maintenance_task_commit_graph, > should_write_commit_graph, > } > }; > num_tasks = sizeof(default_tasks) / sizeof(struct maintenance_task); > > This is followed by allocating and copying the data to the > 'tasks' array, allowing it to be sorted and modified according > to command-line arguments and config. > > Is this what you intended? I'm not sure if Junio intended what I'm going to suggest, but I think that you could make looking up these "blueprint" tasks a little easier by using the designated index initializer. For what it's worth, I wasn't sure if we allow this in the codebase, but some quick perusing through Documentation/CodingGuidelines turns up 512f41cfac (clean.c: use designated initializer, 2017-07-14), which does use this style. Maybe something like: enum maintenance_task_kind { TASK_PREFETCH = 0, TASK_LOOSE_OBJECTS, /* ... */ TASK__COUNT }; const struct maintenance_task default_tasks[TASK__COUNT] = { [TASK_PREFETCH] = { "prefetch", maintenance_task_prefetch, }, [...] = ... }; and then you should be able to pick those out with 'default_tasks[TASK_PREFETCH]'. I'm not sure if you are able to rely on those tasks appearing in a certain order in which case you can feel free to discard this suggestion. If nothing else, I'm glad that we can use the '[...] = '-style initializers :-). > Thanks, > -Stolee Thanks, Taylor