Alarm subsystem is now processed by the scheduler. Removes now dead code.

This commit is contained in:
PsiOmega
2015-03-13 10:33:13 +01:00
parent 7420463f73
commit fac4eb08e3
9 changed files with 39 additions and 328 deletions

View File

@@ -97,6 +97,7 @@
#include "code\controllers\verbs.dm" #include "code\controllers\verbs.dm"
#include "code\controllers\voting.dm" #include "code\controllers\voting.dm"
#include "code\controllers\Processes\air.dm" #include "code\controllers\Processes\air.dm"
#include "code\controllers\Processes\alarm.dm"
#include "code\controllers\Processes\disease.dm" #include "code\controllers\Processes\disease.dm"
#include "code\controllers\Processes\emergencyShuttle.dm" #include "code\controllers\Processes\emergencyShuttle.dm"
#include "code\controllers\Processes\event.dm" #include "code\controllers\Processes\event.dm"

View File

@@ -0,0 +1,6 @@
/datum/controller/process/alarm/setup()
name = "alarm"
schedule_interval = 20 // every 2 seconds
/datum/controller/process/alarm/doWork()
alarm_manager.fire()

View File

@@ -1,8 +1,19 @@
/var/global/machinery_sort_required = 0
/datum/controller/process/machinery/setup() /datum/controller/process/machinery/setup()
name = "machinery" name = "machinery"
schedule_interval = 20 // every 2 seconds schedule_interval = 20 // every 2 seconds
/datum/controller/process/machinery/doWork() /datum/controller/process/machinery/doWork()
internal_sort()
internal_process()
/datum/controller/process/machinery/proc/internal_sort()
if(machinery_sort_required)
machinery_sort_required = 0
machines = dd_sortedObjectList(machines)
/datum/controller/process/machinery/proc/internal_process()
//#ifdef PROFILE_MACHINES //#ifdef PROFILE_MACHINES
//machine_profiling.len = 0 //machine_profiling.len = 0
//#endif //#endif
@@ -31,4 +42,3 @@
#endif #endif
scheck() scheck()

View File

@@ -28,23 +28,6 @@ var/datum/controller/failsafe/Failsafe
if(!lighting_controller) new /datum/controller/lighting() //replace the missing lighting_controller if(!lighting_controller) new /datum/controller/lighting() //replace the missing lighting_controller
if(processing) if(processing)
if(master_controller.processing) //only poke if these overrides aren't in effect
if(MC_iteration == controller_iteration) //master_controller hasn't finished processing in the defined interval
switch(MC_defcon)
if(0 to 3)
MC_defcon++
if(4)
admins << "<font color='red' size='2'><b>Warning. The Master Controller has not fired in the last [MC_defcon*processing_interval] ticks. Automatic restart in [processing_interval] ticks.</b></font>"
MC_defcon = 5
if(5)
admins << "<font color='red' size='2'><b>Warning. The Master Controller has still not fired within the last [MC_defcon*processing_interval] ticks. Killing and restarting...</b></font>"
new /datum/controller/game_controller() //replace the old master_controller (hence killing the old one's process)
master_controller.process() //Start it rolling again
MC_defcon = 0
else
MC_defcon = 0
MC_iteration = controller_iteration
if(lighting_controller.processing) if(lighting_controller.processing)
if(lighting_iteration == lighting_controller.iteration) //master_controller hasn't finished processing in the defined interval if(lighting_iteration == lighting_controller.iteration) //master_controller hasn't finished processing in the defined interval
switch(lighting_defcon) switch(lighting_defcon)

View File

@@ -11,27 +11,6 @@ var/global/air_processing_killed = 0
var/global/pipe_processing_killed = 0 var/global/pipe_processing_killed = 0
datum/controller/game_controller datum/controller/game_controller
var/processing = 0
var/breather_ticks = 2 //a somewhat crude attempt to iron over the 'bumps' caused by high-cpu use by letting the MC have a breather for this many ticks after every loop
var/minimum_ticks = 20 //The minimum length of time between MC ticks
var/air_cost = 0
var/sun_cost = 0
var/mobs_cost = 0
var/diseases_cost = 0
var/machines_cost = 0
var/objects_cost = 0
var/networks_cost = 0
var/powernets_cost = 0
var/nano_cost = 0
var/events_cost = 0
var/alarms_cost = 0
var/ticker_cost = 0
var/total_cost = 0
var/last_thing_processed
var/mob/list/expensive_mobs = list()
var/list/shuttle_list // For debugging and VV var/list/shuttle_list // For debugging and VV
var/datum/random_map/ore/asteroid_ore_map // For debugging and VV. var/datum/random_map/ore/asteroid_ore_map // For debugging and VV.
@@ -40,7 +19,6 @@ datum/controller/game_controller/New()
if(master_controller != src) if(master_controller != src)
log_debug("Rebuilding Master Controller") log_debug("Rebuilding Master Controller")
if(istype(master_controller)) if(istype(master_controller))
Recover()
del(master_controller) del(master_controller)
master_controller = src master_controller = src
@@ -52,8 +30,6 @@ datum/controller/game_controller/New()
if(!syndicate_code_phrase) syndicate_code_phrase = generate_code_phrase() if(!syndicate_code_phrase) syndicate_code_phrase = generate_code_phrase()
if(!syndicate_code_response) syndicate_code_response = generate_code_phrase() if(!syndicate_code_response) syndicate_code_response = generate_code_phrase()
// if(!emergency_shuttle) emergency_shuttle = new /datum/emergency_shuttle_controller() // handled in scheduler
// if(!shuttle_controller) shuttle_controller = new /datum/shuttle_controller()
datum/controller/game_controller/proc/setup() datum/controller/game_controller/proc/setup()
world.tick_lag = config.Ticklag world.tick_lag = config.Ticklag
@@ -64,13 +40,6 @@ datum/controller/game_controller/proc/setup()
spawn(20) spawn(20)
createRandomZlevel() createRandomZlevel()
/* if(!air_master) // handled in scheduler
air_master = new /datum/controller/air_system()
air_master.Setup()
if(!ticker)
ticker = new /datum/controller/gameticker()*/
setup_objects() setup_objects()
setupgenetics() setupgenetics()
setupfactions() setupfactions()
@@ -79,12 +48,6 @@ datum/controller/game_controller/proc/setup()
transfer_controller = new transfer_controller = new
/* spawn(0) // handled in scheduler
if(ticker)
ticker.pregame()
lighting_controller.initializeLighting()*/
datum/controller/game_controller/proc/setup_objects() datum/controller/game_controller/proc/setup_objects()
world << "\red \b Initializing objects" world << "\red \b Initializing objects"
@@ -120,239 +83,5 @@ datum/controller/game_controller/proc/setup_objects()
//Set up spawn points. //Set up spawn points.
populate_spawn_points() populate_spawn_points()
// Sort the machinery list so it doesn't cause a lagspike at roundstart
process_machines_sort()
world << "\red \b Initializations complete." world << "\red \b Initializations complete."
sleep(-1) sleep(-1)
datum/controller/game_controller/proc/process()
processing = 1
spawn(0)
set background = 1
while(1) //far more efficient than recursively calling ourself
if(!Failsafe) new /datum/controller/failsafe()
if(processing)
var/timer
var/start_time = world.timeofday
controller_iteration++
vote.process()
transfer_controller.process()
shuttle_controller.process()
process_newscaster()
//AIR
if(!air_processing_killed)
timer = world.timeofday
last_thing_processed = air_master.type
if(!air_master.Tick()) //Runtimed.
air_master.failed_ticks++
if(air_master.failed_ticks > 5)
world << "<font color='red'><b>RUNTIMES IN ATMOS TICKER. Killing air simulation!</font></b>"
world.log << "### ZAS SHUTDOWN"
message_admins("ZASALERT: unable to run [air_master.tick_progress], shutting down!")
log_admin("ZASALERT: unable run zone/process() -- [air_master.tick_progress]")
air_processing_killed = 1
air_master.failed_ticks = 0
air_cost = (world.timeofday - timer) / 10
sleep(breather_ticks)
//SUN
timer = world.timeofday
last_thing_processed = sun.type
sun.calc_position()
sun_cost = (world.timeofday - timer) / 10
sleep(breather_ticks)
//MOBS
timer = world.timeofday
process_mobs()
mobs_cost = (world.timeofday - timer) / 10
sleep(breather_ticks)
//DISEASES
timer = world.timeofday
process_diseases()
diseases_cost = (world.timeofday - timer) / 10
sleep(breather_ticks)
//MACHINES
timer = world.timeofday
process_machines()
machines_cost = (world.timeofday - timer) / 10
sleep(breather_ticks)
//OBJECTS
timer = world.timeofday
process_objects()
objects_cost = (world.timeofday - timer) / 10
sleep(breather_ticks)
//PIPENETS
if(!pipe_processing_killed)
timer = world.timeofday
process_pipenets()
networks_cost = (world.timeofday - timer) / 10
sleep(breather_ticks)
//POWERNETS
timer = world.timeofday
process_powernets()
powernets_cost = (world.timeofday - timer) / 10
sleep(breather_ticks)
//NANO UIS
timer = world.timeofday
process_nano()
nano_cost = (world.timeofday - timer) / 10
sleep(breather_ticks)
//EVENTS
timer = world.timeofday
process_events()
events_cost = (world.timeofday - timer) / 10
//ALARMS
timer = world.timeofday
process_alarms()
alarms_cost = (world.timeofday - timer) / 10
//TICKER
timer = world.timeofday
last_thing_processed = ticker.type
ticker.process()
ticker_cost = (world.timeofday - timer) / 10
//TIMING
total_cost = air_cost + sun_cost + mobs_cost + diseases_cost + machines_cost + objects_cost + networks_cost + powernets_cost + nano_cost + events_cost + alarms_cost + ticker_cost
var/end_time = world.timeofday
if(end_time < start_time) //why not just use world.time instead?
start_time -= 864000 //deciseconds in a day
sleep( round(minimum_ticks - (end_time - start_time),1) )
else
sleep(10)
datum/controller/game_controller/proc/process_mobs()
var/i = 1
expensive_mobs.Cut()
while(i<=mob_list.len)
var/mob/M = mob_list[i]
if(M)
var/clock = world.timeofday
last_thing_processed = M.type
M.Life()
if((world.timeofday - clock) > 1)
expensive_mobs += M
i++
continue
mob_list.Cut(i,i+1)
datum/controller/game_controller/proc/process_diseases()
var/i = 1
while(i<=active_diseases.len)
var/datum/disease/Disease = active_diseases[i]
if(Disease)
last_thing_processed = Disease.type
Disease.process()
i++
continue
active_diseases.Cut(i,i+1)
datum/controller/game_controller/proc/process_machines()
process_machines_sort()
process_machines_process()
/var/global/machinery_sort_required = 0
datum/controller/game_controller/proc/process_machines_sort()
if(machinery_sort_required)
machinery_sort_required = 0
machines = dd_sortedObjectList(machines)
datum/controller/game_controller/proc/process_machines_process()
for(var/obj/machinery/Machine in machines)
last_thing_processed = Machine.type
if(Machine.process() != PROCESS_KILL)
if(Machine)
Machine.power_change()
if(Machine.use_power)
Machine.auto_use_power()
continue
machines -= Machine
datum/controller/game_controller/proc/process_objects()
var/i = 1
while(i<=processing_objects.len)
var/obj/Object = processing_objects[i]
if(Object)
last_thing_processed = Object.type
Object.process()
i++
continue
processing_objects.Cut(i,i+1)
datum/controller/game_controller/proc/process_pipenets()
last_thing_processed = /datum/pipe_network
var/i = 1
while(i<=pipe_networks.len)
var/datum/pipe_network/Network = pipe_networks[i]
if(Network)
Network.process()
i++
continue
pipe_networks.Cut(i,i+1)
/datum/controller/game_controller/proc/process_powernets()
last_thing_processed = /datum/powernet
for(var/datum/powernet/Powernet in powernets)
Powernet.reset()
datum/controller/game_controller/proc/process_nano()
last_thing_processed = /datum/nanoui
var/i = 1
while(i<=nanomanager.processing_uis.len)
var/datum/nanoui/ui = nanomanager.processing_uis[i]
if(ui)
ui.process()
i++
continue
nanomanager.processing_uis.Cut(i,i+1)
datum/controller/game_controller/proc/process_events()
last_thing_processed = /datum/event_manager
event_manager.process()
datum/controller/game_controller/proc/process_alarms()
last_thing_processed = /datum/subsystem/alarm
alarm_manager.fire()
datum/controller/game_controller/proc/Recover() //Mostly a placeholder for now.
var/msg = "## DEBUG: [time2text(world.timeofday)] MC restarted. Reports:\n"
for(var/varname in master_controller.vars)
switch(varname)
if("tag","bestF","type","parent_type","vars") continue
else
var/varval = master_controller.vars[varname]
if(istype(varval,/datum))
var/datum/D = varval
msg += "\t [varname] = [D.type]\n"
else
msg += "\t [varname] = [varval]\n"
world.log << msg

View File

@@ -13,9 +13,6 @@
/datum/subsystem/alarm/New() /datum/subsystem/alarm/New()
all_handlers = list(atmosphere_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm) all_handlers = list(atmosphere_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm)
/datum/subsystem/alarm/stat_entry()
stat(null,"Alarm-[master_controller.alarms_cost]\t#[number_of_active_alarms()]")
/datum/subsystem/alarm/fire() /datum/subsystem/alarm/fire()
for(var/datum/alarm_handler/AH in all_handlers) for(var/datum/alarm_handler/AH in all_handlers)
AH.process() AH.process()

View File

@@ -39,10 +39,6 @@
usr = null usr = null
src = null src = null
switch(controller) switch(controller)
if("Master")
new /datum/controller/game_controller()
master_controller.process()
feedback_add_details("admin_verb","RMC")
if("Failsafe") if("Failsafe")
new /datum/controller/failsafe() new /datum/controller/failsafe()
feedback_add_details("admin_verb","RFailsafe") feedback_add_details("admin_verb","RFailsafe")

View File

@@ -164,14 +164,14 @@
html += "<div class='block'>" html += "<div class='block'>"
html += "<h2>Running Events</h2>" html += "<h2>Running Events</h2>"
html += "Estimated times, affected by master controller delays." html += "Estimated times, affected by process scheduler delays."
html += "<table[table_options]>" html += "<table[table_options]>"
html += "<tr><td[row_options1]>Severity</td><td[row_options2]>Name</td><td[row_options1]>Ends At</td><td[row_options1]>Ends In</td><td[row_options3]>Stop</td></tr>" html += "<tr><td[row_options1]>Severity</td><td[row_options2]>Name</td><td[row_options1]>Ends At</td><td[row_options1]>Ends In</td><td[row_options3]>Stop</td></tr>"
for(var/datum/event/E in active_events) for(var/datum/event/E in active_events)
if(!E.event_meta) if(!E.event_meta)
continue continue
var/datum/event_meta/EM = E.event_meta var/datum/event_meta/EM = E.event_meta
var/ends_at = E.startedAt + (E.lastProcessAt() * master_controller.minimum_ticks) // A best estimate var/ends_at = E.startedAt + (E.lastProcessAt() * 20) // A best estimate, based on how often the alarm manager processes
var/ends_in = max(0, round((ends_at - world.time) / 600, 0.1)) var/ends_in = max(0, round((ends_at - world.time) / 600, 0.1))
html += "<tr>" html += "<tr>"
html += "<td>[severity_to_string[EM.severity]]</td>" html += "<td>[severity_to_string[EM.severity]]</td>"

View File

@@ -787,7 +787,8 @@ note dizziness decrements automatically in the mob's Life() proc.
//reset the pixel offsets to zero //reset the pixel offsets to zero
is_floating = 0 is_floating = 0
/proc/getStatName(var/datum/controller/process/process)
return uppertext(copytext(process.name, 1, 4))
/mob/Stat() /mob/Stat()
..() ..()
@@ -797,57 +798,45 @@ note dizziness decrements automatically in the mob's Life() proc.
stat(null,"Location:\t([x], [y], [z])") stat(null,"Location:\t([x], [y], [z])")
stat(null,"CPU:\t[world.cpu]") stat(null,"CPU:\t[world.cpu]")
stat(null,"Instances:\t[world.contents.len]") stat(null,"Instances:\t[world.contents.len]")
if(statpanel("Status") && master_controller) if(statpanel("Status") && processScheduler.getIsRunning())
/* stat(null,"MasterController-[last_tick_duration] ([master_controller.processing?"On":"Off"]-[controller_iteration])") // all this is now under the scheduler
stat(null,"Air-[master_controller.air_cost]\tSun-[master_controller.sun_cost]")
stat(null,"Mob-[master_controller.mobs_cost]\t#[mob_list.len]")
stat(null,"Dis-[master_controller.diseases_cost]\t#[active_diseases.len]")
stat(null,"Mch-[master_controller.machines_cost]\t#[machines.len]")
stat(null,"Obj-[master_controller.objects_cost]\t#[processing_objects.len]")
stat(null,"Net-[master_controller.networks_cost]\tPnet-[master_controller.powernets_cost]")
stat(null,"NanoUI-[master_controller.nano_cost]\t#[nanomanager.processing_uis.len]")*/
stat(null,"Event-[master_controller.events_cost]\t#[event_manager.active_events.len]")
alarm_manager.stat_entry()
stat(null,"Tick-[master_controller.ticker_cost]\tALL-[master_controller.total_cost]")
else
stat(null,"MasterController-ERROR")
if(processScheduler.getIsRunning())
var/datum/controller/process/process var/datum/controller/process/process
process = processScheduler.getProcess("ticker") process = processScheduler.getProcess("ticker")
stat(null, "TIC\t - #[process.getTicks()]\t - [process.getLastRunTime()]") stat(null, "[getStatName(process)]\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
process = processScheduler.getProcess("air") process = processScheduler.getProcess("air")
stat(null, "AIR\t - #[process.getTicks()]\t - [process.getLastRunTime()]") stat(null, "[getStatName(process)]\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
process = processScheduler.getProcess("lighting") process = processScheduler.getProcess("lighting")
stat(null, "LIG\t - #[process.getTicks()]\t - [process.getLastRunTime()]") stat(null, "[getStatName(process)]\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
process = processScheduler.getProcess("alarm")
var/list/alarms = alarm_manager.active_alarms()
stat(null, "[getStatName(process)]([alarms.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
process = processScheduler.getProcess("mob") process = processScheduler.getProcess("mob")
stat(null, "MOB([mob_list.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") stat(null, "[getStatName(process)]([mob_list.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
process = processScheduler.getProcess("machinery") process = processScheduler.getProcess("machinery")
stat(null, "MAC([machines.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") stat(null, "[getStatName(process)]([machines.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
process = processScheduler.getProcess("obj") process = processScheduler.getProcess("obj")
stat(null, "OBJ([processing_objects.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") stat(null, "[getStatName(process)]([processing_objects.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
process = processScheduler.getProcess("pipenet") process = processScheduler.getProcess("pipenet")
stat(null, "PIP([pipe_networks.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") stat(null, "[getStatName(process)]([pipe_networks.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
process = processScheduler.getProcess("powernet") process = processScheduler.getProcess("powernet")
stat(null, "POW([powernets.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") stat(null, "[getStatName(process)]([powernets.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
process = processScheduler.getProcess("nanoui") process = processScheduler.getProcess("nanoui")
stat(null, "NAN([nanomanager.processing_uis.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") stat(null, "[getStatName(process)]([nanomanager.processing_uis.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
process = processScheduler.getProcess("disease") process = processScheduler.getProcess("disease")
stat(null, "DIS([active_diseases.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") stat(null, "[getStatName(process)]([active_diseases.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
process = processScheduler.getProcess("sun") process = processScheduler.getProcess("sun")
stat(null, "SUN\t - #[process.getTicks()]\t - [process.getLastRunTime()]") stat(null, "[getStatName(process)]\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
else else
stat(null, "processScheduler is not running.") stat(null, "processScheduler is not running.")