@@ -43,7 +43,6 @@ static ACTIVE_TRIGGER *psAddedTriggers = NULL;
43
43
44
44
/** The trigger which is currently firing */
45
45
static ACTIVE_TRIGGER * psFiringTrigger = NULL ;
46
- static BOOL triggerChanged ;
47
46
static UDWORD updateTime ;
48
47
49
48
/** The currently allocated contexts */
@@ -98,6 +97,15 @@ static void eventAddTrigger(ACTIVE_TRIGGER *psTrigger);
98
97
// Free up a trigger
99
98
static void eventFreeTrigger (ACTIVE_TRIGGER * psTrigger );
100
99
100
+ // Remove triggers marked for deletion
101
+ static void eventPruneList (ACTIVE_TRIGGER * * psList );
102
+ static void eventPruneLists (void )
103
+ {
104
+ eventPruneList (& psTrigList );
105
+ eventPruneList (& psCallbackList );
106
+ eventPruneList (& psAddedTriggers );
107
+ }
108
+
101
109
//resets the event timer - updateTime
102
110
void eventTimeReset (UDWORD initTime )
103
111
{
@@ -834,10 +842,8 @@ static BOOL eventInitTrigger(ACTIVE_TRIGGER **ppsTrigger, SCRIPT_CONTEXT *psCont
834
842
TRIGGER_DATA * psTrigData ;
835
843
UDWORD testTime ;
836
844
837
- ASSERT ( event < psContext -> psCode -> numEvents ,
838
- "eventAddTrigger: Event out of range" );
839
- ASSERT ( trigger < psContext -> psCode -> numTriggers ,
840
- "eventAddTrigger: Trigger out of range" );
845
+ ASSERT ( event < psContext -> psCode -> numEvents , "Event out of range" );
846
+ ASSERT ( trigger < psContext -> psCode -> numTriggers , "Trigger out of range" );
841
847
if (trigger == -1 )
842
848
{
843
849
return false;
@@ -861,6 +867,7 @@ static BOOL eventInitTrigger(ACTIVE_TRIGGER **ppsTrigger, SCRIPT_CONTEXT *psCont
861
867
psNewTrig -> type = (SWORD )psTrigData -> type ;
862
868
psNewTrig -> event = (UWORD )event ;
863
869
psNewTrig -> offset = 0 ;
870
+ psNewTrig -> deactivated = false;
864
871
865
872
* ppsTrigger = psNewTrig ;
866
873
@@ -897,6 +904,7 @@ BOOL eventLoadTrigger(UDWORD time, SCRIPT_CONTEXT *psContext,
897
904
psNewTrig -> type = (SWORD )type ;
898
905
psNewTrig -> event = (UWORD )event ;
899
906
psNewTrig -> offset = (UWORD )offset ;
907
+ psNewTrig -> deactivated = false;
900
908
901
909
eventAddTrigger (psNewTrig );
902
910
@@ -947,13 +955,14 @@ BOOL eventAddPauseTrigger(SCRIPT_CONTEXT *psContext, UDWORD event, UDWORD offset
947
955
psNewTrig -> type = TR_PAUSE ;
948
956
psNewTrig -> event = (UWORD )event ;
949
957
psNewTrig -> offset = (UWORD )offset ;
958
+ psNewTrig -> deactivated = false;
950
959
951
960
// store the new trigger
952
961
psNewTrig -> psNext = psAddedTriggers ;
953
962
psAddedTriggers = psNewTrig ;
954
963
955
- // tell the event system the trigger has been changed
956
- triggerChanged = true;
964
+ // mark the trigger for deletion
965
+ psFiringTrigger -> deactivated = true;
957
966
958
967
return true;
959
968
}
@@ -1041,23 +1050,22 @@ void eventFireCallbackTrigger(TRIGGER_TYPE callback)
1041
1050
psPrev -> psNext = psNext ;
1042
1051
}
1043
1052
1044
- triggerChanged = false;
1045
1053
psFiringTrigger = psCurr ;
1046
- if (!interpRunScript (psCurr -> psContext , IRT_EVENT , psCurr -> event , psCurr -> offset )) // this could set triggerChanged
1054
+ if (!interpRunScript (psCurr -> psContext , IRT_EVENT , psCurr -> event , psCurr -> offset )) // this could set psCurr->deactivated
1047
1055
{
1048
1056
ASSERT (false, "eventFireCallbackTrigger: event %s: code failed" ,
1049
1057
eventGetEventID (psCurr -> psContext -> psCode , psCurr -> event ));
1050
1058
}
1051
- if (triggerChanged )
1059
+ if (psCurr -> deactivated )
1052
1060
{
1053
1061
// don't need to add the trigger again - just free it
1054
1062
eventFreeTrigger (psCurr );
1055
1063
}
1056
1064
else
1057
1065
{
1058
1066
// make sure the trigger goes back into the system
1059
- psFiringTrigger -> psNext = psAddedTriggers ;
1060
- psAddedTriggers = psFiringTrigger ;
1067
+ psCurr -> psNext = psAddedTriggers ;
1068
+ psAddedTriggers = psCurr ;
1061
1069
}
1062
1070
}
1063
1071
else
@@ -1071,6 +1079,9 @@ void eventFireCallbackTrigger(TRIGGER_TYPE callback)
1071
1079
}
1072
1080
}
1073
1081
1082
+ // Delete marked triggers now
1083
+ eventPruneLists ();
1084
+
1074
1085
// Now add all the new triggers
1075
1086
for (psCurr = psAddedTriggers ; psCurr ; psCurr = psNext )
1076
1087
{
@@ -1089,7 +1100,7 @@ static BOOL eventFireTrigger(ACTIVE_TRIGGER *psTrigger)
1089
1100
INTERP_VAL sResult ;
1090
1101
1091
1102
fired = false;
1092
-
1103
+ psFiringTrigger = psTrigger ;
1093
1104
1094
1105
// If this is a code trigger see if it fires
1095
1106
if (psTrigger -> type == TR_CODE )
@@ -1154,15 +1165,10 @@ void eventProcessTriggers(UDWORD currTime)
1154
1165
psCurr = psTrigList ;
1155
1166
psTrigList = psTrigList -> psNext ;
1156
1167
1157
- // Store the trigger so that I can tell if the event changes
1158
- // the trigger assigned to it
1159
- psFiringTrigger = psCurr ;
1160
- triggerChanged = false;
1161
-
1162
1168
// Run the trigger
1163
- if (eventFireTrigger (psCurr )) // This might set triggerChanged
1169
+ if (eventFireTrigger (psCurr )) // This might mark the trigger for deletion
1164
1170
{
1165
- if (triggerChanged || psCurr -> type == TR_WAIT )
1171
+ if (psCurr -> deactivated || psCurr -> type == TR_WAIT )
1166
1172
{
1167
1173
// remove the trigger
1168
1174
eventFreeTrigger (psCurr );
@@ -1195,6 +1201,9 @@ void eventProcessTriggers(UDWORD currTime)
1195
1201
}
1196
1202
}
1197
1203
1204
+ // Delete marked triggers now
1205
+ eventPruneLists ();
1206
+
1198
1207
// Now add all the new triggers
1199
1208
for (psCurr = psAddedTriggers ; psCurr ; psCurr = psNext )
1200
1209
{
@@ -1205,56 +1214,56 @@ void eventProcessTriggers(UDWORD currTime)
1205
1214
psAddedTriggers = NULL ;
1206
1215
}
1207
1216
1208
-
1209
- // remove a trigger from a list
1210
- static void eventRemoveTriggerFromList (ACTIVE_TRIGGER * * ppsList ,
1211
- SCRIPT_CONTEXT * psContext ,
1212
- SDWORD event , SDWORD * pTrigger )
1217
+ // remove all marked triggers
1218
+ static void eventPruneList (ACTIVE_TRIGGER * * ppsList )
1213
1219
{
1214
- ACTIVE_TRIGGER * psCurr , * psPrev = NULL ;
1220
+ ACTIVE_TRIGGER * * ppsCurr = ppsList , * psTemp ;
1215
1221
1216
- if (((* ppsList ) != NULL ) &&
1217
- (* ppsList )-> event == event &&
1218
- (* ppsList )-> psContext == psContext )
1222
+ while (* ppsCurr )
1219
1223
{
1220
- if ((* ppsList )-> type == TR_PAUSE )
1224
+ if ((* ppsCurr )-> deactivated )
1221
1225
{
1222
- // pause trigger, don't remove it,
1223
- // just note the type for when the pause finishes
1224
- (* ppsList )-> trigger = (SWORD )* pTrigger ;
1225
- * pTrigger = -1 ;
1226
+ psTemp = (* ppsCurr )-> psNext ;
1227
+ free (* ppsCurr );
1228
+ * ppsCurr = psTemp ;
1226
1229
}
1227
1230
else
1228
1231
{
1229
- psCurr = * ppsList ;
1230
- * ppsList = (* ppsList )-> psNext ;
1231
- free (psCurr );
1232
+ ppsCurr = & (* ppsCurr )-> psNext ;
1232
1233
}
1233
1234
}
1234
- else
1235
+ }
1236
+
1237
+ // Mark a trigger for removal from a list
1238
+ static void eventMarkTriggerInList (ACTIVE_TRIGGER * * ppsList ,
1239
+ SCRIPT_CONTEXT * psContext ,
1240
+ SDWORD event , SDWORD * pTrigger )
1241
+ {
1242
+ ACTIVE_TRIGGER * * ppsCurr ;
1243
+
1244
+ for (ppsCurr = ppsList ;; ppsCurr = & (* ppsCurr )-> psNext )
1235
1245
{
1236
- for (psCurr = * ppsList ; psCurr ; psCurr = psCurr -> psNext )
1237
- {
1238
- if (psCurr -> event == event &&
1239
- psCurr -> psContext == psContext )
1240
- {
1241
- break ;
1242
- }
1243
- psPrev = psCurr ;
1244
- }
1245
- if (psCurr && psCurr -> type == TR_PAUSE )
1246
+ if (!(* ppsCurr ))
1246
1247
{
1247
- // pause trigger, don't remove it,
1248
- // just note the type for when the pause finishes
1249
- psCurr -> trigger = (SWORD )* pTrigger ;
1250
- * pTrigger = -1 ;
1248
+ return ;
1251
1249
}
1252
- else if (psCurr )
1250
+ else if ((* ppsCurr )-> event == event &&
1251
+ (* ppsCurr )-> psContext == psContext )
1253
1252
{
1254
- psPrev -> psNext = psCurr -> psNext ;
1255
- free (psCurr );
1253
+ break ;
1256
1254
}
1257
1255
}
1256
+ if ((* ppsCurr )-> type == TR_PAUSE )
1257
+ {
1258
+ // pause trigger, don't remove it,
1259
+ // just note the type for when the pause finishes
1260
+ (* ppsCurr )-> trigger = (SWORD )* pTrigger ;
1261
+ * pTrigger = -1 ;
1262
+ }
1263
+ else
1264
+ {
1265
+ (* ppsCurr )-> deactivated = true;
1266
+ }
1258
1267
}
1259
1268
1260
1269
@@ -1281,14 +1290,14 @@ BOOL eventSetTrigger(void)
1281
1290
psContext = psFiringTrigger -> psContext ;
1282
1291
if (psFiringTrigger -> event == event )
1283
1292
{
1284
- triggerChanged = true;
1293
+ psFiringTrigger -> deactivated = true;
1285
1294
}
1286
1295
else
1287
1296
{
1288
- // Remove any old trigger from the list
1289
- eventRemoveTriggerFromList (& psTrigList , psContext , event , & trigger );
1290
- eventRemoveTriggerFromList (& psCallbackList , psContext , event , & trigger );
1291
- eventRemoveTriggerFromList (& psAddedTriggers , psContext , event , & trigger );
1297
+ // Mark the old trigger in the lists
1298
+ eventMarkTriggerInList (& psTrigList , psContext , event , & trigger );
1299
+ eventMarkTriggerInList (& psCallbackList , psContext , event , & trigger );
1300
+ eventMarkTriggerInList (& psAddedTriggers , psContext , event , & trigger );
1292
1301
}
1293
1302
1294
1303
// Create a new trigger if necessary
0 commit comments