From: Sage Weil Date: Mon, 20 Apr 2009 16:54:47 +0000 (-0700) Subject: mds: make is_waiter_for() efficient, maskable X-Git-Tag: v0.7.3~102 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b6bdac0bccecf9d49a308702b584fce336498fb8;p=ceph.git mds: make is_waiter_for() efficient, maskable --- diff --git a/src/mds/mdstypes.h b/src/mds/mdstypes.h index 8e26538366f..beca8b95a53 100644 --- a/src/mds/mdstypes.h +++ b/src/mds/mdstypes.h @@ -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())