@@ -21,15 +21,42 @@ create or replace package body ut_event_manager as
2121 type t_listener_numbers is table of boolean index by t_listener_number;
2222 type t_events_listeners is table of t_listener_numbers index by t_event_name;
2323
24- g_event_listeners_index t_events_listeners;
25- g_listeners t_listeners;
24+ type t_event_manager is record (
25+ event_listener_index t_events_listeners,
26+ listeners t_listeners
27+ );
28+ type t_event_managers is table of t_event_manager;
29+
30+ g_event_listeners_index t_events_listeners;
31+ g_listeners t_listeners;
32+ g_suspended_event_managers t_event_managers;
2633
2734 procedure initialize is
2835 begin
36+ if g_listeners is not null and g_listeners.count > 0 then
37+ if g_suspended_event_managers is null then
38+ g_suspended_event_managers := t_event_managers();
39+ end if;
40+ g_suspended_event_managers.extend;
41+ g_suspended_event_managers(g_suspended_event_managers.count).event_listener_index := g_event_listeners_index;
42+ g_suspended_event_managers(g_suspended_event_managers.count).listeners := g_listeners;
43+ end if;
2944 g_event_listeners_index.delete;
3045 g_listeners := t_listeners();
3146 end;
3247
48+ procedure dispose_listeners is
49+ begin
50+ if g_suspended_event_managers is not null and g_suspended_event_managers.count > 0 then
51+ g_event_listeners_index := g_suspended_event_managers(g_suspended_event_managers.count).event_listener_index;
52+ g_listeners := g_suspended_event_managers(g_suspended_event_managers.count).listeners;
53+ g_suspended_event_managers.trim(1);
54+ else
55+ g_event_listeners_index.delete;
56+ g_listeners := t_listeners();
57+ end if;
58+ end;
59+
3360 procedure trigger_event( a_event_name t_event_name, a_event_object ut_event_item ) is
3461 begin
3562 if a_event_name is not null and g_event_listeners_index.exists(a_event_name)
@@ -39,6 +66,9 @@ create or replace package body ut_event_manager as
3966 for listener_number in 1 .. g_event_listeners_index(a_event_name).count loop
4067 g_listeners(listener_number).on_event(a_event_name, a_event_object);
4168 end loop;
69+ if a_event_name = ut_utils.gc_finalize then
70+ dispose_listeners;
71+ end if;
4272 end if;
4373 end;
4474
0 commit comments