When -N doesn't equal -j, TH continually calls setNumCapabilities
While investigating #22960, I attempted to call GHC with -j > -N. `-j` controls how many modules may be compiled concurrently, while `-N` controls the amount of capabilities. Normally these are the same number, since if you don't explicitly set `-N`, the make driver code will set it to be the same as `-j`.
Strangely, the eventlog showed that capabilities would occasionally be created and destroyed.
I found that the only other call to `setNumCapabilities` is in `compiler/GHC/Runtime/Interpreter.hs`.
It looks like `createBCO` has a slightly different copy of the capability logic found in the driver. Unlike the driver code it also changes the capability count even if `-N` has been manually set. `createBCO` is called while evaluating TH, so that explains the behaviour I was seeing.
A fix would be to harmonise the logic with what we have in the driver, but I'm confused why this code is calling `setNumCapabilities` at all. `setNumCapabilities` seems a bit heavy-weight to call in a function like this.
I think the `setNumCapabilities` logic should be removed from `createBCO` altogether. According to `git blame` it was introduced to speed up remote TH. So, maybe it needs to be moved somewhere else on the remote TH side.
I'd be happy to make an MR
issue