while (!finisher_stop) {
while (!finisher_queue.empty()) {
- list<Context*> ls;
+ vector<Context*> ls;
ls.swap(finisher_queue);
finisher_lock.Unlock();
Mutex finisher_lock;
Cond finisher_cond;
bool finisher_stop;
- list<Context*> finisher_queue;
+ vector<Context*> finisher_queue;
void *finisher_thread_entry();
finisher_cond.Signal();
finisher_lock.Unlock();
}
- void queue(list<Context*>& ls) {
+ void queue(vector<Context*>& ls) {
finisher_lock.Lock();
- finisher_queue.splice(finisher_queue.end(), ls);
+ finisher_queue.insert(finisher_queue.end(), ls.begin(), ls.end());
finisher_cond.Signal();
finisher_lock.Unlock();
+ ls.clear();
+ }
+ void queue(deque<Context*>& ls) {
+ finisher_lock.Lock();
+ finisher_queue.insert(finisher_queue.end(), ls.begin(), ls.end());
+ finisher_cond.Signal();
+ finisher_lock.Unlock();
+ ls.clear();
}
void start();
Cond sync_cond;
uint64_t super_fsid;
- map<version_t, list<Context*> > commit_waiters;
+ map<version_t, vector<Context*> > commit_waiters;
void prepare_super(version_t epoch, bufferptr& bp);
void write_super(version_t epoch, bufferptr& bp);
using std::cout;
using std::endl;
- list<Context*> ls;
if (finished.empty()) return;
+ list<Context*> ls;
ls.swap(finished); // swap out of place to avoid weird loops
generic_dout(10) << ls.size() << " contexts to finish with " << result << dendl;
}
}
+inline void finish_contexts(std::vector<Context*>& finished,
+ int result = 0)
+{
+ using std::cout;
+ using std::endl;
+
+ if (finished.empty()) return;
+
+ vector<Context*> ls;
+ ls.swap(finished); // swap out of place to avoid weird loops
+
+ generic_dout(10) << ls.size() << " contexts to finish with " << result << dendl;
+ for (std::vector<Context*>::iterator it = ls.begin();
+ it != ls.end();
+ it++) {
+ Context *c = *it;
+ generic_dout(10) << "---- " << c << dendl;
+ c->finish(result);
+ delete c;
+ }
+}
+
class C_NoopContext : public Context {
public:
void finish(int r) { }
// to be journaled
list<pair<epoch_t,bufferlist> > writeq;
- list<Context*> commitq;
+ deque<Context*> commitq;
// being journaled
- list<Context*> writingq;
+ deque<Context*> writingq;
// write thread
Mutex write_lock;
epoch_t super_epoch;
Journal *journal;
Finisher finisher;
- map<version_t, list<Context*> > commit_waiters;
+ map<version_t, vector<Context*> > commit_waiters;
void journal_start() {
finisher.start();