| 294 | } |
| 295 | |
| 296 | void Scheduler::unschedule(std::string_view key, void* target) |
| 297 | { |
| 298 | // explicit handle nil arguments when removing an object |
| 299 | if (target == nullptr || key.empty()) |
| 300 | { |
| 301 | return; |
| 302 | } |
| 303 | |
| 304 | auto timerIt = _timersMap.find(target); |
| 305 | if (timerIt != _timersMap.end()) |
| 306 | { |
| 307 | auto& timerHandle = timerIt->second; |
| 308 | for (int i = 0; i < timerHandle.timers.size(); ++i) |
| 309 | { |
| 310 | TimerTargetCallback* timer = dynamic_cast<TimerTargetCallback*>(timerHandle.timers[i]); |
| 311 | |
| 312 | if (timer && key == timer->getKey()) |
| 313 | { |
| 314 | if (timer == timerHandle.currentTimer && (!timer->isAborted())) |
| 315 | { |
| 316 | timer->retain(); |
| 317 | timer->setAborted(); |
| 318 | } |
| 319 | |
| 320 | timerHandle.timers.erase(i); |
| 321 | |
| 322 | // update timerIndex in case we are in tick:, looping over the actions |
| 323 | if (timerHandle.timerIndex >= i) |
| 324 | { |
| 325 | timerHandle.timerIndex--; |
| 326 | } |
| 327 | |
| 328 | if (timerHandle.timers.empty()) |
| 329 | { |
| 330 | if (_currentTarget == &timerHandle) |
| 331 | { |
| 332 | _currentTargetSalvaged = true; |
| 333 | } |
| 334 | else |
| 335 | { |
| 336 | _timersMap.erase(timerIt); |
| 337 | } |
| 338 | } |
| 339 | |
| 340 | return; |
| 341 | } |
| 342 | } |
| 343 | } |
| 344 | } |
| 345 | |
| 346 | void Scheduler::priorityIn(axstd::pod_vector<SchedHandle*>& list, |
| 347 | const ccSchedulerFunc& callback, |