close
Stops drawing and gives everything back except the Surface, which was never this renderer's.
The order is the whole point, and every step is there because leaving it out loses something: mark closed first so present stops accepting frames, close the signal so the worker's wait ends, then cancel and join the worker so a lock or a post already in flight finishes and the frame it was drawing is closed. Only then is the slot drained, which is final because nothing is left running to refill it, and only then are the pixel buffers and the drawing thread released.
This blocks the caller until the worker is done, and that is safe from any thread including the one that runs the user interface: every canvas call this renderer makes is made on its own private thread, so nothing it waits for can be waiting on the caller.