summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2012-05-04 20:23:07 -0700
committerSage Weil <sage@newdream.net>2012-05-05 16:32:21 -0700
commitc19f998a8afa1017c21b31ef52f98850929d2c5f (patch)
tree3d37c0dbe17539eee0c5cc0cee807ba0d9cf6097
parent38edd3bb07cba4733d654209af4d3a63bc1f5224 (diff)
downloadceph-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.h39
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();