TEST(WorkQueue, cancel) { RunLoop loop(uv_default_loop()); WorkQueue queue; auto work = [&]() { FAIL() << "Should never be called"; }; queue.push(work); queue.push(work); queue.push(work); queue.push(work); queue.push(work); }
// store equivalence class in VertexInfo for each vertex static vector<VertexInfoSet> partitionGraph(ptr_vector<VertexInfo> &infos, WorkQueue &work_queue, const NGHolder &g, EquivalenceType eq) { const size_t num_verts = infos.size(); vector<VertexInfoSet> classes; unordered_map<ClassInfo, unsigned> classinfomap; // assume we will have lots of classes, so we don't waste time resizing // these structures. classes.reserve(num_verts); classinfomap.reserve(num_verts); // get distances from start (or accept) for all vertices // only one of them is used at a time, never both vector<NFAVertexDepth> depths; vector<NFAVertexRevDepth> rdepths; if (eq == LEFT_EQUIVALENCE) { calcDepths(g, depths); } else { calcDepths(g, rdepths); } // partition the graph based on CharReach for (VertexInfo &vi : infos) { ClassInfo::ClassDepth depth; if (eq == LEFT_EQUIVALENCE) { depth = depths[vi.vert_index]; } else { depth = rdepths[vi.vert_index]; } ClassInfo ci(g, vi, depth, eq); auto ii = classinfomap.find(ci); if (ii == classinfomap.end()) { // vertex is in a new equivalence class by itself. unsigned eq_class = classes.size(); vi.equivalence_class = eq_class; classes.push_back({&vi}); classinfomap.emplace(move(ci), eq_class); } else { // vertex is added to an existing class. unsigned eq_class = ii->second; vi.equivalence_class = eq_class; classes.at(eq_class).insert(&vi); // we now know that this particular class has more than one // vertex, so we add it to the work queue work_queue.push(eq_class); } } DEBUG_PRINTF("partitioned, %zu equivalence classes\n", classes.size()); return classes; }
void test_work_queue() { WorkQueue<string> q; string t = "hello"; q.push(t); string s; if(q.try_pop(s, 500)){ cout << "got " << s << " from queue" << endl; } bool ok = q.try_pop(s,500); if(ok) { cout << "failed, should have timed out" << endl; } else{ cout << "passed, timed out as expected" << endl; } }
///////////////////////// Platform::submit_work ///////////////////////////// void Platform::submit_work(void (*func)(PlatformInterface &, void*, void*), void *ldata, void *rdata) { m_workqueue.push([=]() { func(*this, ldata, rdata); }); }