In summary, the primary client library mutex must be released when calling the user's callback, and therefore a finite interval in time exists when we are moving forward with the intent to call the users callback but the users IO object could also be deleted by the user during this interval. To prevent, in all situations, the user's callback from being called after he destroys his IO object, we must install a fix that acquires the callback control mutex in the client library when destroying any IO object.
In summary, the primary client library mutex must be released when calling the user's callback, and therefore a finite interval in time exists when we are moving forward with the intent to call the users callback but the users IO object could also be deleted by the user during this interval. To prevent, in all situations, the user's callback from being called after he destroys his IO object, we must install a fix that acquires the callback control mutex in the client library when destroying any IO object.