bool RequestManager::nextPreRenderRequest() { boost::mutex::scoped_lock preLock(preRJMutex); if (preRenderRequests.empty()) return false; shared_ptr<MetaIdentifier> mid = preRenderRequests.front(); preRenderRequests.pop(); currentPrerenderingThreads++; preLock.unlock(); Job job(mid, config, shared_from_this()); // check if tiles are already in progress if (running->start(&job, mid)) { job.process(); running->finished(&job); job.deliver(); } if (!job.isEmpty() && mid->getZoom() < config->get<int>(opt::server::prerender_level)) { std::vector<shared_ptr<MetaIdentifier>> children; mid->getSubIdentifiers(children); for (auto& c : children) enqueue(c); } preLock.lock(); currentPrerenderingThreads--; preLock.unlock(); if (currentPrerenderingThreads == 0 && preRenderRequests.size() == 0) { TIMER_STOP(prerender); log.info("Prerendering finished in %02i:%02i", (int) TIMER_MIN(prerender), ((int) TIMER_SEC(prerender)) % 60); } return true; }
typedef struct { const sch_t func; const timer_t period; } loop_t; const loop_t loops [] PROGMEM = { #ifdef LOOP_CLOCK { { clock_loop , 0, -1 }, TIMER_S(CLOCK_LOOP_PERIOD) }, // TODO: use some priority between highest & lowest #endif { { watchdog_reseter, 0, -1 }, WATCHDOG_RESETER_PERIOD }, { { syscheck_loop , 0, 0 }, TIMER_S(14) }, { { lcd_loop , 0, 0 }, TIMER_S(11) }, { { pumping_loop , 0, 0 }, TIMER_MIN(1) }, { { collector_loop , 0, 0 }, TIMER_S(30) }, { { furnace_loop , 0, 0 }, TIMER_S(10) }, { { radiator_loop , 0, 0 }, TIMER_S(10) }, }; #define LOOP_NR (sizeof(loops)/sizeof(loop_t)) static timer_t loop_next [LOOP_NR]; static void loop_handler(void * arg) { uint8_t i = (uint16_t)arg; loop_t l; memcpy_P(&l, &loops[i], sizeof(loop_t)); timer_t prev = loop_next[i]; sch_add(l.func); timer_t next = prev + l.period;