fin->complete(r);
}
-elist<MDSIOContextBase*> MDSIOContextBase::ctx_list(member_offset(MDSIOContextBase, list_item));
-ceph::spinlock MDSIOContextBase::ctx_list_lock;
+struct MDSIOContextList {
+ elist<MDSIOContextBase*> list;
+ ceph::spinlock lock;
+ MDSIOContextList() : list(member_offset(MDSIOContextBase, list_item)) {}
+ ~MDSIOContextList() {
+ list.clear(); // avoid assertion in elist's destructor
+ }
+} ioctx_list;
MDSIOContextBase::MDSIOContextBase(bool track)
{
created_at = ceph::coarse_mono_clock::now();
if (track) {
- ctx_list_lock.lock();
- ctx_list.push_back(&list_item);
- ctx_list_lock.unlock();
+ ioctx_list.lock.lock();
+ ioctx_list.list.push_back(&list_item);
+ ioctx_list.lock.unlock();
}
}
MDSIOContextBase::~MDSIOContextBase()
{
- ctx_list_lock.lock();
+ ioctx_list.lock.lock();
list_item.remove_myself();
- ctx_list_lock.unlock();
+ ioctx_list.lock.unlock();
}
bool MDSIOContextBase::check_ios_in_flight(ceph::coarse_mono_time cutoff,
static const unsigned MAX_COUNT = 100;
unsigned slow = 0;
- ctx_list_lock.lock();
- for (elist<MDSIOContextBase*>::iterator p = ctx_list.begin(); !p.end(); ++p) {
+ ioctx_list.lock.lock();
+ for (elist<MDSIOContextBase*>::iterator p = ioctx_list.list.begin(); !p.end(); ++p) {
MDSIOContextBase *c = *p;
if (c->created_at >= cutoff)
break;
if (slow == 1)
oldest = c->created_at;
}
- ctx_list_lock.unlock();
+ ioctx_list.lock.unlock();
if (slow > 0) {
if (slow > MAX_COUNT)
private:
ceph::coarse_mono_time created_at;
elist<MDSIOContextBase*>::item list_item;
-
- static elist<MDSIOContextBase*> ctx_list;
- static ceph::spinlock ctx_list_lock;
+
+ friend struct MDSIOContextList;
};
/**