client: use recursive mutex
trans: release lock before invoking callback