Background: I noticed that the condition in add_work() for when the producer could add a new item was oddly different from the other conditions on the todo_* bookkeeping variables - namely, in the other cases we want todo_a != todo_b, whereas in add_work the condition is todo_a+1!=todo_b. Another hint that something is slightly off is that the code would break down if TODO_SIZE was set to 1. The practical effect is negligible, and fixing it seems to be a bit involved, hence probably not worth the churn - and if that's the verdict, I suggest adding a comment in add_work() for future readers and/or people who copy the producer/consumer logic to their own code. Rasmus Villemoes (5): builtin/grep.c: change todo_* variables to unsigned builtin/grep.c: refactor loop in work_done() slightly builtin/grep.c: add shorthand for &todo[todo_end] in add_work() builtin/grep.c: add todo_item helper builtin/grep.c: fix fence-post error in add_work() builtin/grep.c | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) -- 2.20.1