finalize() without drop()?
The only way I can find to "gracefully" stop another thread that is blocking on C_WaitForSlotEvent is to call C_Finalize.
Pkcs11::finalize() is a no-op and Pkcs11Impl::finalize() is only called on drop(). I cannot drop the library if it is being used in another thread.
Is it ok to let Pkcs11::finalize() call Pkcs11Impl::finalize()?
We also need to fix Pkcs11::is_initialized() but that is a separate issue.
Hmm... Yeah, it looks problematic. I'm not the author of this code but I assume the intention is to allow multiple threads access through Arc to the Impl struct and finalize when all threads are done.
And your point is that you want to call finalize earlier? The problematic part is, the pkcs11 struct assumes that what it holds is an initialized object before finalization. Would it be possible for your code to get all threads to drop their references? That'd deterministically call finalize when the last reference is dropped.