);
return f.get();
} else if (what == "devices") {
- PyEval_RestoreThread(tstate);
f.open_array_section("devices");
- daemon_state.with_devices([&f] (const DeviceState& dev) {
- f.dump_object("device", dev);
- });
-
- PyEval_RestoreThread(tstate);
+ daemon_state.with_devices2(
+ [&tstate]() {
+ PyEval_RestoreThread(tstate);
+ },
+ [&f] (const DeviceState& dev) {
+ f.dump_object("device", dev);
+ });
f.close_section();
return f.get();
} else if (what.size() > 7 &&
}
}
+ template<typename CallbackInitial, typename Callback, typename...Args>
+ void with_devices2(CallbackInitial&& cbi, // with lock taken
+ Callback&& cb, // for each device
+ Args&&... args) const {
+ RWLock::RLocker l(lock);
+ cbi();
+ for (auto& i : devices) {
+ std::forward<Callback>(cb)(*i.second, std::forward<Args>(args)...);
+ }
+ }
+
void list_devids_by_server(const std::string& server,
std::set<std::string> *ls) {
auto m = get_by_server(server);