Message ID | pull.1040.v2.git.1632152178.gitgitgadget@gmail.com (mailing list archive) |
---|---|
Headers | show |
Series | Builtin FSMonitor Part 1 | expand |
On Mon, Sep 20 2021, Jeff Hostetler via GitGitGadget wrote: > Here is V2 of Part 1 of my Builtin FSMonitor series. > > Changes since V1 include: > > * Drop the Trace2 memory leak. > * Added a new "child_ready" event to Trace2 as an alternative to the > "child_exit" event for background processes. > * Convert the Trace2-related NEEDSWORK items in "start_bg_command()" to use > the new "child_ready" event. > * Various minor code and documentation cleanups. I see 7/7 still has a pattern you included only to make a compiler error better. I noted in https://lore.kernel.org/git/87ilyycko3.fsf@evledraar.gmail.com/ that it make the error worse, on at least clang. You didn't note which compiler you were massaging, presumably MSVC. I think that's a relatively small matter, but it *is* one I know about, and there's no reply there, mention of it being unaddressed here or in the commit message. I haven't gone back & re-read v1 and seen if there's more unaddresed feedback from others, instead I wanted to encourage you to provide such a summary. It really helps when a series is re-rolled to aid review both for newcomers and returning reviewers. I really don't care about "getting my way" on such a minor thing. But it is frustrating to have the state of a re-roll be observably indistinguishable from one's E-Mail not having been received, when that's the case you've got to go back and re-read the thread, scour the range-diff, and generalyl do a lot of work that the person doing the re-roll has done, but either didn't keep notes, or didn't share them. Personally I'm in the habit of "flagging" (starring in GMail terms) E-Mails with outstanding unaddresed comments I get on my own topics, then when I re-roll them I look at the thread, and "unwind the stack" as it were by removing flags on E-Mails that I've either addressed via updated commit messages, or added a note to a WIP cover letter. E.g. here (just an example that includes Taylor, since he reviewed v1 here) is a case where Taylor suggested something that I didn't go for, but i'd like to think noting it helped him catch up: https://lore.kernel.org/git/cover-v4-0.5-00000000000-20210921T131003Z-avarab@gmail.com/ All the best, just trying to make the reviewer & re-rolling process better for everyone.
On 9/23/21 10:33 AM, Ævar Arnfjörð Bjarmason wrote: > > On Mon, Sep 20 2021, Jeff Hostetler via GitGitGadget wrote: > >> Here is V2 of Part 1 of my Builtin FSMonitor series. >> >> Changes since V1 include: >> >> * Drop the Trace2 memory leak. >> * Added a new "child_ready" event to Trace2 as an alternative to the >> "child_exit" event for background processes. >> * Convert the Trace2-related NEEDSWORK items in "start_bg_command()" to use >> the new "child_ready" event. >> * Various minor code and documentation cleanups. > > I see 7/7 still has a pattern you included only to make a compiler error > better. I noted in > https://lore.kernel.org/git/87ilyycko3.fsf@evledraar.gmail.com/ that it > make the error worse, on at least clang. You didn't note which compiler > you were massaging, presumably MSVC. > I've been holding my tongue for days on this issue and hoping a third party would step in an render an opinion one way or another. Too me, a forward declaration seemed like no big deal and it does have value as I tried to explain. And frankly, it felt a little bit like bike-shedding and was trying to avoid that again. The error message I quoted was from Clang v11.0.3. My forward declaration of the function prior to the actual definition of the function causes the compiler to stop at the function definition and complain with a short message saying that the function itself is incorrectly defined and doesn't match the typedef that it is associated with. When I use MSVC I get a similar error at the function definition. When I use GCC I get error messages at both the function definition and the usage in the call. Additionally, the forward declaration states that the function is associated with that typedef (something that is otherwise implicit and may be hard to discover (more on that in a minute)). And it doesn't require a reference to the function pointer (either on the right side of an assignment, a vtable initialization, or passing it in a function call) to flag the error. We always get the error at the point of the definition. The error message in your example is, I feel, worse than mine. It splats 2 different function signatures -- only one of which has the typedef name -- in a large, poorly wrapped brick of text. Yes, your error message does print corresponding arg in the function prototype of "start_bg_command()" that doesn't agree with the symbol used at the call-site, but that is much later than where the actual error occurred. And if the forward declaration were present, you'd already know that back up at the definition, right. Let's look at this from another point of view. Suppose for example we have two function prototypes with the same signature. Perhaps they describe groups of functions with different semantics -- the fact that they have the same argument list and return type is just a coincidence. typedef int(t_fn_1)(int); typedef int(t_fn_2)(int); And then declare one or more instances of functions in those groups: int foo_a(int x) { ... } int foo_b(int x) { ... } int foo_c(int x) { ... } int foo_d(int x) { ... } int foo_e(int x) { ... } int foo_f(int x) { ... } int foo_g(int x) { ... } Which of those functions should be associated with "t_fn_1" and which with "t_fn_2"? Again, they all have the same signature, but different semantics. The author knows when they wrote the code, but it may be hard to automatically determine later. If I then have a function like start_bg_command() that receives a function pointer: int test(..., t_fn_1 *fn, ...) { ... } In C -- even with the use of forward function declarations -- the compiler won't complain if you pass test() a pointer of type t_fn_2 -- as long a t_fn_1 and t_fn_2 have the same signature. But it does give the human a chance to catch the error. Of if we later change the function signature in the t_fn_1 typedef, we will automatically get a list of which of those foo_x functions do and do not need to be updated. Anyway, I've soapboxed on this enough. I think it is a worthy feature for the price. Jeff
On Thu, Sep 23, 2021 at 04:33:20PM +0200, Ævar Arnfjörð Bjarmason wrote: > E.g. here (just an example that includes Taylor, since he reviewed v1 > here) is a case where Taylor suggested something that I didn't go for, > but i'd like to think noting it helped him catch up: > https://lore.kernel.org/git/cover-v4-0.5-00000000000-20210921T131003Z-avarab@gmail.com/ It did, but to be honest I would have been totally fine with you mentioning the changes you did incorporate into the rerolled version, and omitting mention of any insignificant suggestions you decided to ignore. In other words, when I got to the same spot in the rerolled version, I would have either thought "looks like Ævar didn't take my suggestion, OK" or not have remembered it in the first place. Either way, the point was trivial enough that I didn't bother to pursue it further in that thread. And I think that's what is happening here, too. Yes, I find the forward declaration useless on GCC, though it appears to be helpful on MSVC and hurtful on clang. Even if it does produce a strictly worse error message on clang, do we really care? It may cause some mild inconvenience for a developer later on, but I find it highly unlikely that it would allow us to ship a bug that wouldn't have been caught one way or another during development. So I was a little disappointed to see such a back-and-forth about this quite trivial point. I realize that I'm piling on here by adding my two-cents, but I think it's worth it to ask ourselves more often what points we're willing to concede and which are worth advocating more strongly for. Thanks, Taylor
On Thu, Sep 23 2021, Jeff Hostetler wrote: > On 9/23/21 10:33 AM, Ævar Arnfjörð Bjarmason wrote: >> On Mon, Sep 20 2021, Jeff Hostetler via GitGitGadget wrote: >> >>> Here is V2 of Part 1 of my Builtin FSMonitor series. >>> >>> Changes since V1 include: >>> >>> * Drop the Trace2 memory leak. >>> * Added a new "child_ready" event to Trace2 as an alternative to the >>> "child_exit" event for background processes. >>> * Convert the Trace2-related NEEDSWORK items in "start_bg_command()" to use >>> the new "child_ready" event. >>> * Various minor code and documentation cleanups. >> I see 7/7 still has a pattern you included only to make a compiler >> error >> better. I noted in >> https://lore.kernel.org/git/87ilyycko3.fsf@evledraar.gmail.com/ that it >> make the error worse, on at least clang. You didn't note which compiler >> you were massaging, presumably MSVC. >> > > I've been holding my tongue for days on this issue and hoping a third > party would step in an render an opinion one way or another. > > Too me, a forward declaration seemed like no big deal and it does > have value as I tried to explain. And frankly, it felt a little bit > like bike-shedding and was trying to avoid that again. I agree with you that it's no big deal in the end, I thought I made it clear in <87v92r49mt.fsf@evledraar.gmail.com> but the main thing I'm commenting on is not that I or anyone else suggested Y over X, and you said nah and went for X in the end. That's fine, I mean, depending on the comment/issue etc. it's something other reviewers & Junio can draw their own conclusions about. What I am saying that it's much better for review of iterations of patches in general, and especially of a complex multi-part series if reviewers don't have to read the cover letter of vX and wonder what's omitted/unaddressed in the V(X-1) comments, and then go and re-read the discussion themselves. It's not the "nah", but that the "nah" is implicit and only apparent when sending an E-Mail like this. Of course that's never perfect, you can't summarize every point etc. Personally I try to do this, but I've sometimes noticed after the fact that I've gotten it wrong etc. In the end I and I think anyone else offering their time to review things is trying to move the relevant topic forward in one way or another. I'd much rather spend my time on a vX discussing new things & getting the thing closer to merge-able state, than re-reading all of v(X-1) & effectively coming up with my own cover letter summary in my head or in my own notes as I read along. Anyway, sorry about the bikeshedding getting out of hand, and what seems to have been at least partially a misunderstanding in the last couple of E-Mails between us, but the above is all I was going for. > The error message I quoted was from Clang v11.0.3. My forward > declaration of the function prior to the actual definition of > the function causes the compiler to stop at the function definition > and complain with a short message saying that the function itself > is incorrectly defined and doesn't match the typedef that it is > associated with. > > When I use MSVC I get a similar error at the function definition. > > When I use GCC I get error messages at both the function definition > and the usage in the call. > > > Additionally, the forward declaration states that the function is > associated with that typedef (something that is otherwise implicit > and may be hard to discover (more on that in a minute)). > > And it doesn't require a reference to the function pointer (either > on the right side of an assignment, a vtable initialization, or passing > it in a function call) to flag the error. We always get the error > at the point of the definition. > > > The error message in your example is, I feel, worse than mine. > It splats 2 different function signatures -- only one of which has > the typedef name -- in a large, poorly wrapped brick of text. For what it's worth any poor wrapping is my fault, I have a relatively wide terminal and re-wrapped this when composing the E-Mail. I think both GCC & Clang (and most other mature compilers) would give the person getting the error sane wrapping based on their $COLUMNS. > Yes, your error message does print corresponding arg in the function > prototype of "start_bg_command()" that doesn't agree with the symbol > used at the call-site, but that is much later than where the actual > error occurred. And if the forward declaration were present, you'd > already know that back up at the definition, right. > > > Let's look at this from another point of view. > > Suppose for example we have two function prototypes with the same > signature. Perhaps they describe groups of functions with different > semantics -- the fact that they have the same argument list and return > type is just a coincidence. > > typedef int(t_fn_1)(int); > typedef int(t_fn_2)(int); > > And then declare one or more instances of functions in those groups: > > int foo_a(int x) { ... } > int foo_b(int x) { ... } > int foo_c(int x) { ... } > int foo_d(int x) { ... } > int foo_e(int x) { ... } > int foo_f(int x) { ... } > int foo_g(int x) { ... } > > Which of those functions should be associated with "t_fn_1" and which > with "t_fn_2"? Again, they all have the same signature, but different > semantics. The author knows when they wrote the code, but it may be > hard to automatically determine later. > > If I then have a function like start_bg_command() that receives a > function pointer: > > int test(..., t_fn_1 *fn, ...) { ... } > > In C -- even with the use of forward function declarations -- the > compiler won't complain if you pass test() a pointer of type t_fn_2 > -- as long a t_fn_1 and t_fn_2 have the same signature. > > But it does give the human a chance to catch the error. Of if we > later change the function signature in the t_fn_1 typedef, we will > automatically get a list of which of those foo_x functions do and > do not need to be updated. > > > Anyway, I've soapboxed on this enough. I think it is a worthy > feature for the price. Code in git.git generally just declares say an "int foo(int)" and leaves it at passing the "foo", we're not concerned about that "foo" just so happening to be passed to some other interface that takes the same signature, certainly not something within a <1k line t/helper/* file. We all have habits we've picked up from other codebases prior to working on git.git. I'm not arguing that what you're describing is worse in some abtract sense, but that there's a larger value in following conventions within the codebase as Junio noted in his reply.
On 9/23/21 4:47 PM, Ævar Arnfjörð Bjarmason wrote: > > On Thu, Sep 23 2021, Jeff Hostetler wrote: > >> On 9/23/21 10:33 AM, Ævar Arnfjörð Bjarmason wrote: >>> On Mon, Sep 20 2021, Jeff Hostetler via GitGitGadget wrote: >>> >>>> Here is V2 of Part 1 of my Builtin FSMonitor series. >>>> >>>> Changes since V1 include: >>>> >>>> * Drop the Trace2 memory leak. >>>> * Added a new "child_ready" event to Trace2 as an alternative to the >>>> "child_exit" event for background processes. >>>> * Convert the Trace2-related NEEDSWORK items in "start_bg_command()" to use >>>> the new "child_ready" event. >>>> * Various minor code and documentation cleanups. >>> I see 7/7 still has a pattern you included only to make a compiler >>> error >>> better. I noted in >>> https://lore.kernel.org/git/87ilyycko3.fsf@evledraar.gmail.com/ that it >>> make the error worse, on at least clang. You didn't note which compiler >>> you were massaging, presumably MSVC. >>> >> >> I've been holding my tongue for days on this issue and hoping a third >> party would step in an render an opinion one way or another. >> >> Too me, a forward declaration seemed like no big deal and it does >> have value as I tried to explain. And frankly, it felt a little bit >> like bike-shedding and was trying to avoid that again. > > I agree with you that it's no big deal in the end, > > I thought I made it clear in <87v92r49mt.fsf@evledraar.gmail.com> but > the main thing I'm commenting on is not that I or anyone else suggested > Y over X, and you said nah and went for X in the end. > > That's fine, I mean, depending on the comment/issue etc. it's something > other reviewers & Junio can draw their own conclusions about. > > What I am saying that it's much better for review of iterations of > patches in general, and especially of a complex multi-part series if > reviewers don't have to read the cover letter of vX and wonder what's > omitted/unaddressed in the V(X-1) comments, and then go and re-read the > discussion themselves. It's not the "nah", but that the "nah" is > implicit and only apparent when sending an E-Mail like this. > > Of course that's never perfect, you can't summarize every point > etc. Personally I try to do this, but I've sometimes noticed after the > fact that I've gotten it wrong etc. > > In the end I and I think anyone else offering their time to review > things is trying to move the relevant topic forward in one way or > another. I'd much rather spend my time on a vX discussing new things & > getting the thing closer to merge-able state, than re-reading all of > v(X-1) & effectively coming up with my own cover letter summary in my > head or in my own notes as I read along. > > Anyway, sorry about the bikeshedding getting out of hand, and what seems > to have been at least partially a misunderstanding in the last couple of > E-Mails between us, but the above is all I was going for. Thanks. Yeah, email is a terrible communication medium and prone to misunderstandings. It's easy to forget that at times, since we spend so much time in it. Drafting a v(X+1) cover letter is a bit of an art. It is easy to err on the less-is-better side when trying to decide how much to include to explain the new version vs not wanting to including every little typo or nit. I tend to drop / cross-off issues that I decide to ignore or not act upon rather than report them. However, you're right, I should have included a brief statement about not changing the stuff mentioned in 7/7, since there was a larger conversation around it. Sorry. Jeff