diff options
author | Sage Weil <sage@inktank.com> | 2012-05-04 20:23:07 -0700 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2012-05-05 16:32:21 -0700 |
commit | c19f998a8afa1017c21b31ef52f98850929d2c5f (patch) | |
tree | 3d37c0dbe17539eee0c5cc0cee807ba0d9cf6097 | |
parent | 38edd3bb07cba4733d654209af4d3a63bc1f5224 (diff) | |
download | ceph-c19f998a8afa1017c21b31ef52f98850929d2c5f.tar.gz |
common: add C_Cond
Similar to C_SafeCond, but assume finisher already holds the relevant lock.
Signed-off-by: Sage Weil <sage@newdream.net>
-rw-r--r-- | src/common/Cond.h | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/src/common/Cond.h b/src/common/Cond.h index deb94a66cf7..70441f87c2e 100644 --- a/src/common/Cond.h +++ b/src/common/Cond.h @@ -90,18 +90,47 @@ class Cond { } }; +/** + * context to signal a cond + * + * Generic context to signal a cond and store the return value. We + * assume the caller is holding the appropriate lock. + */ +class C_Cond : public Context { + Cond *cond; ///< Cond to signal + bool *done; ///< true if finish() has been called + int *rval; ///< return value +public: + C_Cond(Cond *c, bool *d, int *r) : cond(c), done(d), rval(r) { + *done = false; + } + void finish(int r) { + *done = true; + *rval = r; + cond->Signal(); + } +}; + +/** + * context to signal a cond, protected by a lock + * + * Generic context to signal a cond under a specific lock. We take the + * lock in the finish() callback, so the finish() caller must not + * already hold it. + */ class C_SafeCond : public Context { - Mutex *lock; - Cond *cond; - bool *done; - int *rval; + Mutex *lock; ///< Mutex to take + Cond *cond; ///< Cond to signal + bool *done; ///< true after finish() has been called + int *rval; ///< return value (optional) public: C_SafeCond(Mutex *l, Cond *c, bool *d, int *r=0) : lock(l), cond(c), done(d), rval(r) { *done = false; } void finish(int r) { lock->Lock(); - if (rval) *rval = r; + if (rval) + *rval = r; *done = true; cond->Signal(); lock->Unlock(); |