Skip to content

Commit 9d52d16

Browse files
committed
fixed event triggering crash
1 parent 2d2e112 commit 9d52d16

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

loader_core/gw2al_api_event.cpp

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,21 @@ gw2al_api_ret gw2al_core__watch_event(gw2al_event_id id, gw2al_hashed_name subsc
3232
evDsc->subs = (gw2al_event_subscriber*)realloc(evDsc->subs, subArrSz);
3333
}
3434

35+
++evDsc->activeSubCount;
36+
3537
gw2al_event_subscriber* evSub = &evDsc->subs[subId];
3638

3739
evSub->handler = handler;
3840
evSub->priority = priority;
3941
evSub->subscriber = subscriber;
4042

41-
//sort priority
43+
//re sort priority
4244

4345
for (int i = 0; i != subc; ++i)
4446
{
4547
for (int j = i; j != subc; ++j)
4648
{
47-
if (evDsc->subs[i].priority < evDsc->subs[j].priority)
49+
if ((evDsc->subs[i].priority < evDsc->subs[j].priority) || ((evDsc->subs[i].handler == NULL) && (evDsc->subs[j].handler != NULL)))
4850
{
4951
gw2al_event_subscriber swp = evDsc->subs[i];
5052
evDsc->subs[i] = evDsc->subs[j];
@@ -80,6 +82,23 @@ void gw2al_core__unwatch_event(gw2al_event_id id, gw2al_hashed_name subscriber)
8082
evDsc->subs[i].priority = 0;
8183
}
8284
}
85+
86+
++evDsc->activeSubCount;
87+
88+
//re sort priority
89+
90+
for (int i = 0; i != subc; ++i)
91+
{
92+
for (int j = i; j != subc; ++j)
93+
{
94+
if ((evDsc->subs[i].priority < evDsc->subs[j].priority) || ((evDsc->subs[i].handler == NULL) && (evDsc->subs[j].handler != NULL)))
95+
{
96+
gw2al_event_subscriber swp = evDsc->subs[i];
97+
evDsc->subs[i] = evDsc->subs[j];
98+
evDsc->subs[j] = swp;
99+
}
100+
}
101+
}
83102
}
84103

85104
gw2al_event_id gw2al_core__query_event(gw2al_hashed_name name)
@@ -98,6 +117,7 @@ gw2al_event_id gw2al_core__query_event(gw2al_hashed_name name)
98117
memset(evDsc->subs, 0, subArrSz);
99118

100119
evDsc->id = eventStorage.register_new_obj(evDsc, name);
120+
evDsc->activeSubCount = 0;
101121

102122
LOG_DEBUG(L"core", L"new event %016llX = %lu", name, evDsc->id);
103123
}
@@ -109,10 +129,10 @@ unsigned int gw2al_core__trigger_event(gw2al_event_id id, void * data)
109129
{
110130
gw2al_event_dsc* evDsc = eventStorage.get_obj(id);
111131

112-
unsigned int subc = evDsc->subCount;
132+
unsigned int subc = evDsc->activeSubCount;
113133

114134
for (int i = 0; i != subc; ++i)
115-
{
135+
{
116136
evDsc->subs[i].handler(data);
117137
}
118138

loader_core/gw2al_api_impl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ typedef struct gw2al_event_dsc {
1919
gw2al_hashed_name name;
2020
gw2al_event_id id;
2121
unsigned int subCount;
22+
unsigned int activeSubCount;
2223
gw2al_event_subscriber* subs;
2324
} gw2al_event_dsc;
2425

0 commit comments

Comments
 (0)