Example #1
0
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;
}
Example #2
0
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;