$res = (int) Database::fetchField('SELECT IFNULL(SUM(`capacity`), 0) as occupation FROM `' . FRAMEWORK_COLLECTION_PROCESS . '` WHERE `pid` IS NOT NULL AND `pid` > 0'); Database::unlockTables(true); if ($res >= $capLimit) { Log::debug('Active processes has occupied maximum server capacity, daemon exits.'); Database::rollback(); die; } unset($res, $capLimit); Database::lockTables(array(FRAMEWORK_COLLECTION_PROCESS . ' LOW_PRIORITY WRITE', FRAMEWORK_COLLECTION_PROCESS . ' as `active` LOW_PRIORITY WRITE', FRAMEWORK_COLLECTION_PROCESS . ' as `inactive` LOW_PRIORITY WRITE')); $process = Database::fetchRow('SELECT `inactive`.* FROM `' . FRAMEWORK_COLLECTION_PROCESS . '` as `inactive` LEFT JOIN ( SELECT `type`, SUM(`capacity`) as `occupation` FROM `' . FRAMEWORK_COLLECTION_PROCESS . '` WHERE `pid` IS NOT NULL GROUP BY `type` ) as `active` ON `active`.`type` = `inactive`.`type` WHERE `timestamp` <= CURRENT_TIMESTAMP AND `start_time` <= CURRENT_TIMESTAMP AND `inactive`.`pid` IS NULL ORDER BY `occupation`, `weight` DESC, `id` LIMIT 1;'); // No waiting jobs in queue. if (!$process) { Database::unlockTables(true); Database::rollback(); Log::debug('No more jobs to do, suicide.'); die; } $processContents = (array) ContentDecoder::json($process[Node::FIELD_VIRTUAL], 1); unset($process[Node::FIELD_VIRTUAL]); $process += $processContents; unset($processContents);