}
bool m_release_lock_on_shutdown = false;
+ Context *m_on_released = nullptr;
MOCK_METHOD0(construct, void());
MOCK_METHOD0(destroy, void());
}
void release_lock(Context *on_released) {
+ ceph_assert(MockManagedLock::get_instance().m_on_released == nullptr);
+ MockManagedLock::get_instance().m_on_released = on_released;
+
Context *post_release_ctx = new FunctionContext(
- [this, on_released](int r) {
- post_release_lock_handler(false, r, on_released);
+ [this](int r) {
+ ceph_assert(MockManagedLock::get_instance().m_on_released != nullptr);
+ post_release_lock_handler(false, r,
+ MockManagedLock::get_instance().m_on_released);
+ MockManagedLock::get_instance().m_on_released = nullptr;
});
Context *release_ctx = new FunctionContext(
- [on_released, post_release_ctx](int r) {
+ [this, post_release_ctx](int r) {
if (r < 0) {
- on_released->complete(r);
+ MockManagedLock::get_instance().m_on_released->complete(r);
} else {
MockManagedLock::get_instance().release_lock(post_release_ctx);
}
void expect_release_lock(MockManagedLock &mock_managed_lock, int r,
Context *on_finish = nullptr) {
EXPECT_CALL(mock_managed_lock, release_lock(_))
- .WillOnce(Invoke([on_finish, r](Context *ctx) {
- ctx->complete(r);
+ .WillOnce(Invoke([on_finish, &mock_managed_lock, r](Context *ctx) {
if (on_finish != nullptr) {
- on_finish->complete(0);
+ auto on_released = mock_managed_lock.m_on_released;
+ ceph_assert(on_released != nullptr);
+ mock_managed_lock.m_on_released = new FunctionContext(
+ [on_released, on_finish](int r) {
+ on_released->complete(r);
+ on_finish->complete(r);
+ });
}
+ ctx->complete(r);
}));
}