Skip to content

Commit

Permalink
Merge pull request #3731 from out-of-phaze/optimization/observ-cleanu…
Browse files Browse the repository at this point in the history
…p-unlisting

Decrease observ cleanup overhead
  • Loading branch information
MistakeNot4892 authored Feb 25, 2024
2 parents 1ba0d09 + b00b0c0 commit eee4bbd
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 28 deletions.
39 changes: 19 additions & 20 deletions code/datums/observation/~cleanup.dm
Original file line number Diff line number Diff line change
@@ -1,31 +1,30 @@
var/global/list/global_listen_count = list()
var/global/list/event_sources_count = list()
var/global/list/event_listen_count = list()

/proc/cleanup_events(var/source)
/datum
/// Tracks how many event registrations are listening to us. Used in cleanup to prevent dangling references.
var/event_source_count = 0
/// Tracks how many event registrations we are listening to. Used in cleanup to prevent dangling references.
var/event_listen_count = 0

/proc/cleanup_events(var/datum/source)
if(global.global_listen_count && global.global_listen_count[source])
cleanup_global_listener(source, global.global_listen_count[source])
if(global.event_sources_count && global.event_sources_count[source])
cleanup_source_listeners(source, global.event_sources_count[source])
if(global.event_listen_count && global.event_listen_count[source])
cleanup_event_listener(source, global.event_listen_count[source])
if(source?.event_source_count > 0)
cleanup_source_listeners(source, source?.event_source_count)
if(source?.event_listen_count > 0)
cleanup_event_listener(source, source?.event_listen_count)

/decl/observ/register(var/datum/event_source, var/datum/listener, var/proc_call)
. = ..()
if(.)
global.event_sources_count[event_source] += 1
global.event_listen_count[listener] += 1
event_source.event_source_count++
listener.event_listen_count++

/decl/observ/unregister(var/datum/event_source, var/datum/listener, var/proc_call)
. = ..() // returns the number of events removed
if(.)
global.event_sources_count[event_source] -= .
global.event_listen_count[listener] -= .

if(global.event_sources_count[event_source] <= 0)
global.event_sources_count -= event_source
if(global.event_listen_count[listener] <= 0)
global.event_listen_count -= listener
event_source.event_source_count -= .
listener.event_listen_count -= .

/decl/observ/register_global(var/datum/listener, var/proc_call)
. = ..()
Expand All @@ -52,8 +51,8 @@ var/global/list/event_listen_count = list()
if(listen_count > 0)
CRASH("Failed to clean up all global listener entries!")

/proc/cleanup_source_listeners(event_source, source_listener_count)
global.event_sources_count -= event_source
/proc/cleanup_source_listeners(datum/event_source, source_listener_count)
event_source.event_source_count = 0
var/events_removed
for(var/entry in global.all_observable_events)
var/decl/observ/event = entry
Expand All @@ -69,8 +68,8 @@ var/global/list/event_listen_count = list()
if(source_listener_count > 0)
CRASH("Failed to clean up all event source entries!")

/proc/cleanup_event_listener(listener, listener_count)
global.event_listen_count -= listener
/proc/cleanup_event_listener(datum/listener, listener_count)
listener.event_listen_count = 0
var/events_removed
for(var/entry in global.all_observable_events)
var/decl/observ/event = entry
Expand Down
8 changes: 0 additions & 8 deletions code/unit_tests/observation_tests.dm
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@
var/list/received_name_set_events

var/list/stored_global_listen_count
var/list/stored_event_sources_count
var/list/stored_event_listen_count

/datum/unit_test/observation/start_test()
received_moves = received_moves || list()
Expand All @@ -24,8 +22,6 @@
events_repository.unregister_global(/decl/observ/moved, global_listener)

stored_global_listen_count = global.global_listen_count.Copy()
stored_event_sources_count = global.event_sources_count.Copy()
stored_event_listen_count = global.event_listen_count.Copy()

sanity_check_events("Pre-Test")
. = conduct_test()
Expand Down Expand Up @@ -62,10 +58,6 @@

for(var/entry in (global.global_listen_count - stored_global_listen_count))
fail("[phase]: global_listen_count - Contained [log_info_line(entry)].")
for(var/entry in (global.event_sources_count - stored_event_sources_count))
fail("[phase]: event_sources_count - Contained [log_info_line(entry)].")
for(var/entry in (global.event_listen_count - stored_event_listen_count))
fail("[phase]: event_listen_count - Contained [log_info_line(entry)].")

/datum/unit_test/observation/proc/conduct_test()
return 0
Expand Down

0 comments on commit eee4bbd

Please sign in to comment.