Re: [PATCH] config: use a static lock_file struct
flat view
From: Jeff King <hidden>
Date: 2017-08-30 04:31:55
On Wed, Aug 30, 2017 at 05:25:18AM +0200, Michael Haggerty wrote:
quoted
quoted
quoted
In the long run we may want to drop the "tempfiles must remain forever" rule. This is certainly not the first time it has caused confusion or leaks. And I don't think it's a fundamental issue, just the way the code is written. But in the interim, this fix is probably worth doing.The main issue is that the caller needs to make sure they're removed from the list (via commit or rollback) before being freed. As far as I know anyway. This restriction dates back to the very early days of the lockfile code and has been carried through the various tempfile-cleanup refactorings over the years (mostly because each was afraid to make functional changes). +cc Michael, who did most comprehensive cleanup of that code.It was surprisingly hard trying to get that code to do the right thing, non-racily, in every error path. Since `remove_tempfiles()` can be called any time (even from a signal handler), the linked list of `tempfile` objects has to be kept valid at all times but can't use mutexes. I didn't have the energy to keep going and make the lock objects freeable. I suppose the task could be made a bit easier by using `sigprocmask(2)` or `pthread_sigmask(3)` to make its running environment a little bit less hostile.
I think there are really two levels of carefulness here:
1. Avoiding complicated things during a signal handler that may rely
on having a sane state from the rest of the program (e.g.,
half-formed entries, stdio locks, etc).
2. Being truly race-free in the face of a signal arriving while we're
running arbitrary code that might have a tempfile struct in a funny
state.
I feel like right now we meet (1) and not (2). But I think if we keep to
that lower bar of (1), it might not be that bad. We're assuming now that
there's no race on the tempfile->active flag, for instance. We could
probably make a similar assumption about putting items onto or taking
them off of a linked list (it's not really atomic, but a single pointer
assignment is probably "atomic enough" for our purposes).
Or I dunno. There's a lot of "volatile" modifiers sprinkled around.
Maybe those are enough to give us (2) as well (though in that case, I
think we'd still be as OK with the list manipulation as we are with the
active flag manipulation).
-Peff