From: Sage Weil Date: Wed, 5 May 2010 21:40:59 +0000 (-0700) Subject: librados: separate callbacks for aio ack/complete and safe X-Git-Tag: v0.20.1~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=74cd7ac6219bd84dce3e56e21ffeee914d6582b7;p=ceph.git librados: separate callbacks for aio ack/complete and safe --- diff --git a/src/include/librados.h b/src/include/librados.h index 761703ddd3ee..00e8494bfc55 100644 --- a/src/include/librados.h +++ b/src/include/librados.h @@ -77,8 +77,8 @@ int rados_exec(rados_pool_t pool, const char *oid, const char *cls, const char * typedef void *rados_completion_t; typedef void (*rados_callback_t)(rados_completion_t cb, void *arg); -int rados_aio_create_completion(rados_callback_t, void *arg, rados_completion_t *pc); -int rados_aio_set_callback(rados_completion_t c, rados_callback_t, void *arg); +int rados_aio_create_completion(void *cb_arg, rados_callback_t cb_complete, rados_callback_t cb_safe, + rados_completion_t *pc); 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); diff --git a/src/include/librados.hpp b/src/include/librados.hpp index 91eb1028adae..21dafd5ec4c1 100644 --- a/src/include/librados.hpp +++ b/src/include/librados.hpp @@ -98,7 +98,8 @@ public: struct AioCompletion { void *pc; AioCompletion(void *_pc) : pc(_pc) {} - int set_callback(callback_t cb, void *cba); + int set_complete_callback(void *cb_arg, callback_t cb); + int set_safe_callback(void *cb_arg, callback_t cb); int wait_for_complete(); int wait_for_safe(); bool is_complete(); @@ -112,7 +113,7 @@ public: int aio_write(pool_t pool, const std::string& oid, off_t off, const bufferlist& bl, size_t len, AioCompletion *c); AioCompletion *aio_create_completion(); - AioCompletion *aio_create_completion(callback_t cb, void *cba); + AioCompletion *aio_create_completion(void *cb_arg, callback_t cb_complete, callback_t cb_safe); }; } diff --git a/src/librados.cc b/src/librados.cc index 723557c8552c..5963c8b3813c 100644 --- a/src/librados.cc +++ b/src/librados.cc @@ -145,7 +145,7 @@ public: bool released; bool ack, safe; - rados_callback_t callback; + rados_callback_t callback_complete, callback_safe; void *callback_arg; // for read @@ -155,13 +155,20 @@ public: AioCompletion() : lock("RadosClient::AioCompletion::lock"), ref(1), rval(0), released(false), ack(false), safe(false), - callback(0), callback_arg(0), + callback_complete(0), callback_safe(0), callback_arg(0), pbl(0), buf(0), maxlen(0) { } - int set_callback(rados_callback_t cb, void *cba) { + int set_complete_callback(void *cb_arg, rados_callback_t cb) { lock.Lock(); - callback = cb; - callback_arg = cba; + callback_complete = cb; + callback_arg = cb_arg; + lock.Unlock(); + return 0; + } + int set_safe_callback(void *cb_arg, rados_callback_t cb) { + lock.Lock(); + callback_safe = cb; + callback_arg = cb_arg; lock.Unlock(); return 0; } @@ -240,11 +247,11 @@ public: *c->pbl = c->bl; } - if (c->callback) { - rados_callback_t cb = c->callback; - void *cba = c->callback_arg; + if (c->callback_complete) { + rados_callback_t cb = c->callback_complete; + void *cb_arg = c->callback_arg; c->lock.Unlock(); - cb(c, cba); + cb(c, cb_arg); c->lock.Lock(); } @@ -266,11 +273,11 @@ public: c->safe = true; c->cond.Signal(); - if (c->callback) { - rados_callback_t cb = c->callback; - void *cba = c->callback_arg; + if (c->callback_safe) { + rados_callback_t cb = c->callback_safe; + void *cb_arg = c->callback_arg; c->lock.Unlock(); - cb(c, cba); + cb(c, cb_arg); c->lock.Lock(); } @@ -292,9 +299,12 @@ public: AioCompletion *aio_create_completion() { return new AioCompletion; } - AioCompletion *aio_create_completion(rados_callback_t cb, void *cba) { + AioCompletion *aio_create_completion(void *cb_arg, rados_callback_t cb_complete, rados_callback_t cb_safe) { AioCompletion *c = new AioCompletion; - c->set_callback(cb, cba); + if (cb_complete) + c->set_complete_callback(cb_arg, cb_complete); + if (cb_safe) + c->set_safe_callback(cb_arg, cb_safe); return c; } }; @@ -1400,16 +1410,21 @@ Rados::AioCompletion *Rados::aio_create_completion() return new AioCompletion(c); } -Rados::AioCompletion *Rados::aio_create_completion(callback_t cb, void *cba) +Rados::AioCompletion *Rados::aio_create_completion(void *cb_arg, callback_t cb_complete, callback_t cb_safe) { - RadosClient::AioCompletion *c = ((RadosClient *)client)->aio_create_completion(cb, cba); + RadosClient::AioCompletion *c = ((RadosClient *)client)->aio_create_completion(cb_arg, cb_complete, cb_safe); return new AioCompletion(c); } -int Rados::AioCompletion::set_callback(rados_callback_t cb, void *cba) +int Rados::AioCompletion::set_complete_callback(void *cb_arg, rados_callback_t cb) +{ + RadosClient::AioCompletion *c = (RadosClient::AioCompletion *)pc; + return c->set_complete_callback(cb_arg, cb); +} +int Rados::AioCompletion::set_safe_callback(void *cb_arg, rados_callback_t cb) { RadosClient::AioCompletion *c = (RadosClient::AioCompletion *)pc; - return c->set_callback(cb, cba); + return c->set_safe_callback(cb_arg, cb); } int Rados::AioCompletion::wait_for_complete() { @@ -1737,9 +1752,10 @@ extern "C" int rados_list_objects_next(rados_list_ctx_t listctx, const char **en // ------------------------- // aio -extern "C" int rados_aio_create_completion(rados_callback_t cb, void *cba, rados_completion_t *pc) +extern "C" int rados_aio_create_completion(void *cb_arg, rados_callback_t cb_complete, rados_callback_t cb_safe, + rados_completion_t *pc) { - *pc = radosp->aio_create_completion(cb, cba); + *pc = radosp->aio_create_completion(cb_arg, cb_complete, cb_safe); return 0; }