]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: make is_waiter_for() efficient, maskable
authorSage Weil <sage@newdream.net>
Mon, 20 Apr 2009 16:54:47 +0000 (09:54 -0700)
committerSage Weil <sage@newdream.net>
Mon, 20 Apr 2009 17:38:15 +0000 (10:38 -0700)
src/mds/mdstypes.h

index 8e26538366f74bc3e585561a5a7116731998cca8..beca8b95a53f2ac5b8bb6b674531c55f54ecfbb1 100644 (file)
@@ -1164,8 +1164,19 @@ protected:
   multimap<__u64, Context*>  waiting;
 
  public:
-  bool is_waiter_for(__u64 mask) {
-    return waiting.count(mask) > 0;    // FIXME: not quite right.
+  bool is_waiter_for(__u64 mask, __u64 min=0) {
+    if (!min) {
+      min = mask;
+      while (min & (min-1))  // if more than one bit is set
+       min &= min-1;        //  clear LSB
+    }
+    for (multimap<__u64,Context*>::iterator p = waiting.lower_bound(min);
+        p != waiting.end();
+        p++) {
+      if (p->first & mask) return true;
+      if (p->first > mask) return false;
+    }
+    return false;
   }
   virtual void add_waiter(__u64 mask, Context *c) {
     if (waiting.empty())