@@ -37,7 +37,8 @@ void CSheduler::Destroy()
37
37
for (const auto & item : Items)
38
38
Log (item.Object ->shedule_Name ().c_str ());
39
39
}
40
- #endif // DEBUG
40
+ #endif
41
+
41
42
ItemsRT.clear ();
42
43
Items.clear ();
43
44
ItemsProcessed.clear ();
@@ -101,48 +102,43 @@ void CSheduler::internal_Registration()
101
102
Registration.clear ();
102
103
}
103
104
104
- void CSheduler::internal_Register (ISheduled* O , BOOL RT )
105
+ void CSheduler::internal_Register (ISheduled* object , BOOL realTime )
105
106
{
106
- VERIFY (!O->GetSchedulerData ().b_locked );
107
- if (RT)
107
+ VERIFY (!object->GetSchedulerData ().b_locked );
108
+
109
+ // Fill item structure
110
+ Item item;
111
+ item.dwTimeForExecute = Device.dwTimeGlobal ;
112
+ item.dwTimeOfLastExecute = Device.dwTimeGlobal ;
113
+ item.scheduled_name = object->shedule_Name ();
114
+ item.Object = object;
115
+
116
+ if (realTime)
108
117
{
109
- // Fill item structure
110
- Item TNext;
111
- TNext.dwTimeForExecute = Device.dwTimeGlobal ;
112
- TNext.dwTimeOfLastExecute = Device.dwTimeGlobal ;
113
- TNext.Object = O;
114
- TNext.scheduled_name = O->shedule_Name ();
115
- O->GetSchedulerData ().b_RT = TRUE ;
116
-
117
- ItemsRT.push_back (TNext);
118
+ object->GetSchedulerData ().b_RT = TRUE ;
119
+ ItemsRT.emplace_back (std::move (item));
118
120
}
119
121
else
120
122
{
121
- // Fill item structure
122
- Item TNext;
123
- TNext.dwTimeForExecute = Device.dwTimeGlobal ;
124
- TNext.dwTimeOfLastExecute = Device.dwTimeGlobal ;
125
- TNext.Object = O;
126
- TNext.scheduled_name = O->shedule_Name ();
127
- O->GetSchedulerData ().b_RT = FALSE ;
123
+ object->GetSchedulerData ().b_RT = FALSE ;
128
124
129
125
// Insert into priority Queue
130
- Push (TNext );
126
+ Push (item );
131
127
}
132
128
}
133
129
134
- bool CSheduler::internal_Unregister (ISheduled* O , BOOL RT , bool warn_on_not_found)
130
+ bool CSheduler::internal_Unregister (ISheduled* object , BOOL realTime , bool warn_on_not_found)
135
131
{
136
132
// the object may be already dead
137
- // VERIFY (!O->shedule.b_locked) ;
138
- if (RT )
133
+ // VERIFY (!O->shedule.b_locked);
134
+ if (realTime )
139
135
{
140
136
for (u32 i = 0 ; i < ItemsRT.size (); i++)
141
137
{
142
- if (ItemsRT[i].Object == O )
138
+ if (ItemsRT[i].Object == object )
143
139
{
144
140
#ifdef DEBUG_SCHEDULER
145
- Msg (" SCHEDULER: internal unregister [%s][%x][%s]" , " unknown" , O , " true" );
141
+ Msg (" SCHEDULER: internal unregister [%s][%x][%s]" , " unknown" , object , " true" );
146
142
#endif
147
143
ItemsRT.erase (ItemsRT.begin () + i);
148
144
return true ;
@@ -153,20 +149,20 @@ bool CSheduler::internal_Unregister(ISheduled* O, BOOL RT, bool warn_on_not_foun
153
149
{
154
150
for (auto & item : Items)
155
151
{
156
- if (item.Object == O )
152
+ if (item.Object == object )
157
153
{
158
154
#ifdef DEBUG_SCHEDULER
159
- Msg (" SCHEDULER: internal unregister [%s][%x][%s]" , item.scheduled_name .c_str (), O , " false" );
155
+ Msg (" SCHEDULER: internal unregister [%s][%x][%s]" , item.scheduled_name .c_str (), object , " false" );
160
156
#endif
161
157
item.Object = nullptr ;
162
158
return true ;
163
159
}
164
160
}
165
161
}
166
- if (m_current_step_obj == O )
162
+ if (m_current_step_obj == object )
167
163
{
168
164
#ifdef DEBUG_SCHEDULER
169
- Msg (" SCHEDULER: internal unregister (self unregistering) [%x][%s]" , O , " false" );
165
+ Msg (" SCHEDULER: internal unregister (self unregistering) [%x][%s]" , object , " false" );
170
166
#endif
171
167
172
168
m_current_step_obj = nullptr ;
@@ -175,8 +171,8 @@ bool CSheduler::internal_Unregister(ISheduled* O, BOOL RT, bool warn_on_not_foun
175
171
176
172
#ifdef DEBUG
177
173
if (warn_on_not_found)
178
- Msg (" ! scheduled object %s tries to unregister but is not registered" , O ->shedule_Name ().c_str ());
179
- #endif // DEBUG
174
+ Msg (" ! scheduled object %s tries to unregister but is not registered" , object ->shedule_Name ().c_str ());
175
+ #endif
180
176
181
177
return false ;
182
178
}
@@ -303,9 +299,9 @@ void CSheduler::EnsureOrder(ISheduled* Before, ISheduled* After)
303
299
}
304
300
}
305
301
306
- void CSheduler::Push (Item& I )
302
+ void CSheduler::Push (Item& item )
307
303
{
308
- Items.push_back (I );
304
+ Items.emplace_back ( std::move (item) );
309
305
std::push_heap (Items.begin (), Items.end ());
310
306
}
311
307
@@ -320,42 +316,37 @@ void CSheduler::ProcessStep()
320
316
// Normal priority
321
317
const u32 dwTime = Device.dwTimeGlobal ;
322
318
CTimer eTimer;
319
+
323
320
for (int i = 0 ; !Items.empty () && Top ().dwTimeForExecute < dwTime; ++i)
324
321
{
325
- const u32 delta_ms = dwTime - Top ().dwTimeForExecute ;
326
-
327
322
// Update
328
323
Item item = Top ();
329
- #ifdef DEBUG_SCHEDULER
330
- Msg (" SCHEDULER: process step [%s][%x][false]" , item.scheduled_name .c_str (), item.Object );
331
- #endif
332
- u32 Elapsed = dwTime - item.dwTimeOfLastExecute ;
333
324
334
- const bool condition = nullptr == item.Object || !item.Object ->shedule_Needed ();
335
- if (condition)
325
+ if (!item.Object || !item.Object ->shedule_Needed ())
336
326
{
337
- // Erase element
338
327
#ifdef DEBUG_SCHEDULER
339
328
Msg (" SCHEDULER: process unregister [%s][%x][%s]" , item.scheduled_name .c_str (), item.Object , " false" );
340
329
#endif
341
- // if (T.Object)
342
- // Msg ("0x%08x UNREGISTERS because shedule_Needed() returned false",T.Object);
343
- // else
344
- // Msg ("UNREGISTERS unknown object");
330
+ // Erase element
345
331
Pop ();
346
332
continue ;
347
333
}
348
334
335
+ #ifdef DEBUG_SCHEDULER
336
+ Msg (" SCHEDULER: process step [%s][%x][false]" , item.scheduled_name .c_str (), item.Object );
337
+ #endif
338
+
349
339
// Insert into priority Queue
350
340
Pop ();
351
341
352
- // Real update call
353
- // Msg ("------- %d:",Device.dwFrame);
342
+ u32 Elapsed = dwTime - item.dwTimeOfLastExecute ;
343
+
344
+ // Real update call
345
+ // Msg("------- %d:", Device.dwFrame);
354
346
#ifdef DEBUG
355
347
item.Object ->GetSchedulerData ().dbg_startframe = Device.dwFrame ;
356
348
eTimer.Start ();
357
- // LPCSTR _obj_name = T.Object->shedule_Name().c_str();
358
- #endif // DEBUG
349
+ #endif
359
350
360
351
// Calc next update interval
361
352
const u32 dwMin = _max (u32 (30 ), item.Object ->GetSchedulerData ().t_min );
@@ -365,7 +356,7 @@ void CSheduler::ProcessStep()
365
356
clamp (dwUpdate, u32 (_max (dwMin, u32 (20 ))), dwMax);
366
357
367
358
m_current_step_obj = item.Object ;
368
- // try {
359
+
369
360
item.Object ->shedule_Update (
370
361
clampr (Elapsed, u32 (1 ), u32 (_max (u32 (item.Object ->GetSchedulerData ().t_max ), u32 (1000 )))));
371
362
if (!m_current_step_obj)
@@ -376,40 +367,28 @@ void CSheduler::ProcessStep()
376
367
#endif
377
368
continue ;
378
369
}
379
- // } catch (...) {
380
- #ifdef DEBUG
381
- // Msg ("! xrSheduler: object '%s' raised an exception", _obj_name);
382
- // throw ;
383
- #endif // DEBUG
384
- // }
385
- m_current_step_obj = nullptr ;
386
370
387
- #ifdef DEBUG
388
- // u32 execTime = eTimer.GetElapsed_ms ();
389
- #endif // DEBUG
371
+ m_current_step_obj = nullptr ;
390
372
391
373
// Fill item structure
392
- Item TNext;
393
- TNext.dwTimeForExecute = dwTime + dwUpdate;
394
- TNext.dwTimeOfLastExecute = dwTime;
395
- TNext.Object = item.Object ;
396
- TNext.scheduled_name = item.Object ->shedule_Name ();
397
- ItemsProcessed.push_back (TNext);
374
+ item.dwTimeForExecute = dwTime + dwUpdate;
375
+ item.dwTimeOfLastExecute = dwTime;
376
+ ItemsProcessed.emplace_back (std::move (item));
377
+
378
+ #if 0 //def DEBUG
379
+ auto itemName = item.Object->shedule_Name().c_str();
380
+ const u32 delta_ms = dwTime - item.dwTimeForExecute;
381
+ const u32 execTime = eTimer.GetElapsed_ms();
382
+ VERIFY3(item.Object->dbg_update_shedule == item.Object->dbg_startframe,
383
+ "Broken sequence of calls to 'shedule_Update'", itemName);
398
384
399
- #ifdef DEBUG
400
- // u32 execTime = eTimer.GetElapsed_ms ();
401
- // VERIFY3 (T.Object->dbg_update_shedule == T.Object->dbg_startframe, "Broken sequence of calls to
402
- // 'shedule_Update'", _obj_name );
403
385
if (delta_ms > 3 * dwUpdate)
404
- {
405
- // Msg ("! xrSheduler: failed to shedule object [%s] (%dms)", _obj_name, delta_ms );
406
- }
407
- // if (execTime> 15) {
408
- // Msg ("* xrSheduler: too much time consumed by object [%s] (%dms)", _obj_name, execTime );
409
- // }
410
- #endif // DEBUG
386
+ Msg("! xrSheduler: failed to shedule object [%s] (%dms)", itemName, delta_ms);
387
+
388
+ if (execTime > 15)
389
+ Msg("* xrSheduler: too much time consumed by object [%s] (%dms)", itemName, execTime);
390
+ #endif
411
391
412
- //
413
392
if (i % 3 != 3 - 1 )
414
393
continue ;
415
394
@@ -431,16 +410,7 @@ void CSheduler::ProcessStep()
431
410
// always try to decrease target
432
411
psShedulerTarget -= psShedulerReaction;
433
412
}
434
- /*
435
- void CSheduler::Switch ()
436
- {
437
- if (fibered)
438
- {
439
- fibered = FALSE;
440
- SwitchToFiber (fiber_main);
441
- }
442
- }
443
- */
413
+
444
414
void CSheduler::Update ()
445
415
{
446
416
// Initialize
0 commit comments