You cannot take a lock from the streaming thread, ever, if that lock will be held from the main thread while waiting for the streaming thread to finish. This is why stream_cs exists in the first place.
It's certainly true, of course, that the streaming thread *can* call any function that takes filter_cs. We've generally gone by assuming that it won't, and in times like these we have to update those assumptions. I'm not really sure how native deals with this. Possibly we need the passthrough to cache peers.
Quartz threading is horribly underspecified in the documentation, and unfortunately, my computer that has a large portion of my personal notes on it recently broke. I'll update this when I'm able to consult those notes.