_begin();
}
-void TestOp::finish()
+void TestOp::finish(TestOp::CallbackInfo *info)
{
- _finish();
+ _finish(info);
//if (stat && finished()) stat->end(this);
}
void callback(librados::completion_t cb, void *arg) {
TestOp *op = static_cast<TestOp*>(arg);
- op->finish();
+ op->finish(NULL);
}
virtual ~TestOp();
+ /**
+ * This struct holds data to be passed by a callback
+ * to a TestOp::finish method.
+ */
+ struct CallbackInfo {
+ uint64_t id;
+ CallbackInfo(uint64_t id) : id(id) {}
+ virtual ~CallbackInfo() {};
+ };
+
virtual void _begin() = 0;
- virtual void _finish() = 0;
+
+ /**
+ * Called when the operation completes.
+ * This should be overridden by asynchronous operations.
+ *
+ * @param info information stored by a callback, or NULL -
+ * useful for multi-operation TestOps
+ */
+ virtual void _finish(CallbackInfo *info)
+ {
+ return;
+ }
virtual string getType() = 0;
virtual bool finished()
{
}
void begin();
- void finish();
+ void finish(CallbackInfo *info);
};
class TestOpGenerator {
}
}
- void _finish()
+ void _finish(CallbackInfo *info)
{
context->state_lock.Lock();
assert(!done);
context->oid_in_use.erase(oid);
context->oid_not_in_use.insert(oid);
context->state_lock.Unlock();
- finish();
- }
-
- void _finish()
- {
- return;
- }
-
- bool finished()
- {
- return true;
}
string getType()
}
}
- void _finish()
+ void _finish(CallbackInfo *info)
{
context->state_lock.Lock();
assert(!done);
context->state_lock.Lock();
context->add_snap(snap);
context->state_lock.Unlock();
-
- finish();
- }
-
- void _finish()
- {
- return;
}
string getType()
context->state_lock.Unlock();
assert(!context->io_ctx.selfmanaged_snap_remove(snap));
- finish();
- }
-
- void _finish()
- {
- return;
}
string getType()
cerr << "r is " << r << std::endl;
assert(0);
}
- finish();
- }
-
- void _finish()
- {
- return;
}
-
string getType()
{