|
|
|
|
@@ -14,15 +14,6 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
|
|
|
|
|
//Master -> SSPreInit -> GLOB -> world -> config -> SSInit -> Failsafe
|
|
|
|
|
//GOT IT MEMORIZED?
|
|
|
|
|
|
|
|
|
|
GLOBAL_VAR_INIT(MC_restart_clear, 0)
|
|
|
|
|
GLOBAL_VAR_INIT(MC_restart_timeout, 0)
|
|
|
|
|
GLOBAL_VAR_INIT(MC_restart_count, 0)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//current tick limit, assigned by the queue controller before running a subsystem.
|
|
|
|
|
//used by check_tick as well so that the procs subsystems call can obey that SS's tick limits
|
|
|
|
|
GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
|
|
|
|
|
|
|
|
|
|
/datum/controller/master
|
|
|
|
|
name = "Master"
|
|
|
|
|
|
|
|
|
|
@@ -59,6 +50,14 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
|
|
|
|
|
|
|
|
|
|
var/current_runlevel //for scheduling different subsystems for different stages of the round
|
|
|
|
|
|
|
|
|
|
var/static/restart_clear = 0
|
|
|
|
|
var/static/restart_timeout = 0
|
|
|
|
|
var/static/restart_count = 0
|
|
|
|
|
|
|
|
|
|
//current tick limit, assigned before running a subsystem.
|
|
|
|
|
//used by CHECK_TICK as well so that the procs subsystems call can obey that SS's tick limits
|
|
|
|
|
var/static/current_ticklimit = TICK_LIMIT_RUNNING
|
|
|
|
|
|
|
|
|
|
/datum/controller/master/New()
|
|
|
|
|
// Highlander-style: there can only be one! Kill off the old and replace it with the new.
|
|
|
|
|
subsystems = list()
|
|
|
|
|
@@ -90,14 +89,14 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
|
|
|
|
|
// -1 if we encountered a runtime trying to recreate it
|
|
|
|
|
/proc/Recreate_MC()
|
|
|
|
|
. = -1 //so if we runtime, things know we failed
|
|
|
|
|
if (world.time < GLOB.MC_restart_timeout)
|
|
|
|
|
if (world.time < Master.restart_timeout)
|
|
|
|
|
return 0
|
|
|
|
|
if (world.time < GLOB.MC_restart_clear)
|
|
|
|
|
GLOB.MC_restart_count *= 0.5
|
|
|
|
|
if (world.time < Master.restart_clear)
|
|
|
|
|
Master.restart_count *= 0.5
|
|
|
|
|
|
|
|
|
|
var/delay = 50 * ++GLOB.MC_restart_count
|
|
|
|
|
GLOB.MC_restart_timeout = world.time + delay
|
|
|
|
|
GLOB.MC_restart_clear = world.time + (delay * 2)
|
|
|
|
|
var/delay = 50 * ++Master.restart_count
|
|
|
|
|
Master.restart_timeout = world.time + delay
|
|
|
|
|
Master.restart_clear = world.time + (delay * 2)
|
|
|
|
|
Master.processing = 0 //stop ticking this one
|
|
|
|
|
try
|
|
|
|
|
new/datum/controller/master()
|
|
|
|
|
@@ -165,13 +164,13 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
|
|
|
|
|
|
|
|
|
|
var/start_timeofday = REALTIMEOFDAY
|
|
|
|
|
// Initialize subsystems.
|
|
|
|
|
GLOB.CURRENT_TICKLIMIT = config.tick_limit_mc_init
|
|
|
|
|
current_ticklimit = config.tick_limit_mc_init
|
|
|
|
|
for (var/datum/controller/subsystem/SS in subsystems)
|
|
|
|
|
if (SS.flags & SS_NO_INIT)
|
|
|
|
|
continue
|
|
|
|
|
SS.Initialize(REALTIMEOFDAY)
|
|
|
|
|
CHECK_TICK
|
|
|
|
|
GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING
|
|
|
|
|
current_ticklimit = TICK_LIMIT_RUNNING
|
|
|
|
|
var/time = (REALTIMEOFDAY - start_timeofday) / 10
|
|
|
|
|
|
|
|
|
|
var/msg = "Initializations complete within [time] second[time == 1 ? "" : "s"]!"
|
|
|
|
|
@@ -206,6 +205,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
|
|
|
|
|
set waitfor = 0
|
|
|
|
|
if(delay)
|
|
|
|
|
sleep(delay)
|
|
|
|
|
testing("Master starting processing")
|
|
|
|
|
var/rtn = Loop()
|
|
|
|
|
if (rtn > 0 || processing < 0)
|
|
|
|
|
return //this was suppose to happen.
|
|
|
|
|
@@ -276,7 +276,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
|
|
|
|
|
while (1)
|
|
|
|
|
tickdrift = max(0, MC_AVERAGE_FAST(tickdrift, (((REALTIMEOFDAY - init_timeofday) - (world.time - init_time)) / world.tick_lag)))
|
|
|
|
|
if (processing <= 0)
|
|
|
|
|
GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING
|
|
|
|
|
current_ticklimit = TICK_LIMIT_RUNNING
|
|
|
|
|
sleep(10)
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
@@ -284,7 +284,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
|
|
|
|
|
// because sleeps are processed in the order received, so longer sleeps are more likely to run first
|
|
|
|
|
if (world.tick_usage > TICK_LIMIT_MC)
|
|
|
|
|
sleep_delta += 2
|
|
|
|
|
GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING * 0.5
|
|
|
|
|
current_ticklimit = TICK_LIMIT_RUNNING * 0.5
|
|
|
|
|
sleep(world.tick_lag * (processing + sleep_delta))
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
@@ -322,7 +322,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
|
|
|
|
|
if (!error_level)
|
|
|
|
|
iteration++
|
|
|
|
|
error_level++
|
|
|
|
|
GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING
|
|
|
|
|
current_ticklimit = TICK_LIMIT_RUNNING
|
|
|
|
|
sleep(10)
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
@@ -334,7 +334,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
|
|
|
|
|
if (!error_level)
|
|
|
|
|
iteration++
|
|
|
|
|
error_level++
|
|
|
|
|
GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING
|
|
|
|
|
current_ticklimit = TICK_LIMIT_RUNNING
|
|
|
|
|
sleep(10)
|
|
|
|
|
continue
|
|
|
|
|
error_level--
|
|
|
|
|
@@ -345,7 +345,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
|
|
|
|
|
iteration++
|
|
|
|
|
last_run = world.time
|
|
|
|
|
src.sleep_delta = MC_AVERAGE_FAST(src.sleep_delta, sleep_delta)
|
|
|
|
|
GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING - (TICK_LIMIT_RUNNING * 0.25) //reserve the tail 1/4 of the next tick for the mc.
|
|
|
|
|
current_ticklimit = TICK_LIMIT_RUNNING - (TICK_LIMIT_RUNNING * 0.25) //reserve the tail 1/4 of the next tick for the mc.
|
|
|
|
|
sleep(world.tick_lag * (processing + sleep_delta))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -436,7 +436,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
|
|
|
|
|
|
|
|
|
|
tick_precentage = max(tick_precentage*0.5, tick_precentage-queue_node.tick_overrun)
|
|
|
|
|
|
|
|
|
|
GLOB.CURRENT_TICKLIMIT = round(world.tick_usage + tick_precentage)
|
|
|
|
|
current_ticklimit = round(world.tick_usage + tick_precentage)
|
|
|
|
|
|
|
|
|
|
if (!(queue_node_flags & SS_TICKER))
|
|
|
|
|
ran_non_ticker = TRUE
|
|
|
|
|
|