From 966f26e564542719ba3125b4f46fca7af1667118 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 5 Jun 2009 17:45:50 -0700 Subject: [PATCH] librados: aio completion notification via a callback --- src/include/librados.h | 3 +++ src/librados.cc | 41 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/include/librados.h b/src/include/librados.h index b656e09789926..b7a9bb3f9f9e3 100644 --- a/src/include/librados.h +++ b/src/include/librados.h @@ -40,7 +40,9 @@ int rados_exec(rados_pool_t pool, const char *oid, const char *cls, const char * /* async io */ typedef void *rados_completion_t; +typedef void (*rados_callback_t)(rados_completion_t cb, void *arg); +int rados_aio_set_callback(rados_completion_t c, rados_callback_t, void *arg); int rados_aio_wait_for_complete(rados_completion_t c); int rados_aio_wait_for_safe(rados_completion_t c); int rados_aio_is_complete(rados_completion_t c); @@ -87,6 +89,7 @@ public: struct AioCompletion { void *pc; AioCompletion(void *_pc) : pc(_pc) {} + int set_callback(rados_callback_t cb, void *cba); int wait_for_complete(); int wait_for_safe(); bool is_complete(); diff --git a/src/librados.cc b/src/librados.cc index c931d6419a9f3..6ca9d42a3c8e5 100644 --- a/src/librados.cc +++ b/src/librados.cc @@ -104,14 +104,26 @@ public: int ref, rval; bool ack, safe; + rados_callback_t callback; + void *callback_arg; + // for read bufferlist bl, *pbl; char *buf; unsigned maxlen; AioCompletion() : lock("RadosClient::AioCompletion"), - ref(1), rval(0), ack(false), safe(false), pbl(0), buf(0), maxlen(0) { } + ref(1), rval(0), ack(false), safe(false), + callback(0), callback_arg(0), + pbl(0), buf(0), maxlen(0) { } + int set_callback(rados_callback_t cb, void *cba) { + lock.Lock(); + callback = cb; + callback_arg = cba; + lock.Unlock(); + return 0; + } int wait_for_complete() { lock.Lock(); while (!ack) @@ -176,6 +188,14 @@ public: *c->pbl = c->bl; } + if (c->callback) { + rados_callback_t cb = c->callback; + void *cba = c->callback_arg; + c->lock.Unlock(); + cb(c, cba); + c->lock.Lock(); + } + int n = --c->ref; c->lock.Unlock(); if (!n) @@ -196,6 +216,15 @@ public: } c->safe = true; c->cond.Signal(); + + if (c->callback) { + rados_callback_t cb = c->callback; + void *cba = c->callback_arg; + c->lock.Unlock(); + cb(c, cba); + c->lock.Lock(); + } + int n = --c->ref; c->lock.Unlock(); if (!n) @@ -716,6 +745,11 @@ int Rados::aio_write(rados_pool_t pool, const object_t& oid, off_t off, bufferli return r; } +int Rados::AioCompletion::set_callback(rados_callback_t cb, void *cba) +{ + RadosClient::AioCompletion *c = (RadosClient::AioCompletion *)pc; + return c->set_callback(cb, cba); +} int Rados::AioCompletion::wait_for_complete() { RadosClient::AioCompletion *c = (RadosClient::AioCompletion *)pc; @@ -938,6 +972,11 @@ extern "C" int rados_pool_list_next(rados_pool_t pool, const char **entry, rados // ------------------------- // aio +extern "C" int rados_aio_set_callback(rados_completion_t c, rados_callback_t cb, void *cba) +{ + return ((RadosClient::AioCompletion *)c)->set_callback(cb, cba); +} + extern "C" int rados_aio_wait_for_complete(rados_completion_t c) { return ((RadosClient::AioCompletion *)c)->wait_for_complete(); -- 2.39.5