return c;
}
static void complete(Ptr&& p, int r) {
- auto c = p->_super->pc;
+ auto c = p->_super;
p->_super = nullptr;
- c->lock.lock();
- c->rval = r;
- c->complete = true;
- c->lock.unlock();
-
- auto cb_complete = c->callback_complete;
- auto cb_complete_arg = c->callback_complete_arg;
- if (cb_complete)
- cb_complete(c, cb_complete_arg);
-
- auto cb_safe = c->callback_safe;
- auto cb_safe_arg = c->callback_safe_arg;
- if (cb_safe)
- cb_safe(c, cb_safe_arg);
-
- c->lock.lock();
- c->callback_complete = nullptr;
- c->callback_safe = nullptr;
- c->cond.notify_all();
- c->put_unlock();
+ c->pc->put();
+ rgw_complete_aio_completion(c, r);
}
static void cb(lr::completion_t, void* arg) {
librados::AioCompletion* c) override {
int r = 0;
if (marker == rgw::cls::fifo::marker(0, 0).to_string()) {
- auto pc = c->pc;
- pc->get();
- pc->lock.lock();
- pc->rval = 0;
- pc->complete = true;
- pc->lock.unlock();
- auto cb_complete = pc->callback_complete;
- auto cb_complete_arg = pc->callback_complete_arg;
- if (cb_complete)
- cb_complete(pc, cb_complete_arg);
-
- auto cb_safe = pc->callback_safe;
- auto cb_safe_arg = pc->callback_safe_arg;
- if (cb_safe)
- cb_safe(pc, cb_safe_arg);
-
- pc->lock.lock();
- pc->callback_complete = NULL;
- pc->callback_safe = NULL;
- pc->cond.notify_all();
- pc->put_unlock();
+ rgw_complete_aio_completion(c, 0);
} else {
fifos[index]->trim(marker, false, c);
}
#include "include/types.h"
#include "include/stringify.h"
+#include "librados/AioCompletionImpl.h"
+
#include "rgw_common.h"
#include "rgw_tools.h"
#include "rgw_acl_s3.h"
delete ext_mime_map;
ext_mime_map = nullptr;
}
+
+void rgw_complete_aio_completion(librados::AioCompletion* c, int r) {
+ auto pc = c->pc;
+ librados::CB_AioCompleteAndSafe cb(pc);
+ cb(r);
+}
using RGWDataAccessRef = std::shared_ptr<RGWDataAccess>;
+/// Complete an AioCompletion. To return error values or otherwise
+/// satisfy the caller. Useful for making complicated asynchronous
+/// calls and error handling.
+void rgw_complete_aio_completion(librados::AioCompletion* c, int r);
+
#endif