void cleanNotifier(void* notifier_pointer, int32_t *status) { { std::lock_guard<priority_recursive_mutex> sync(notifierMutex); Notifier* notifier = (Notifier*)notifier_pointer; // remove from list and delete if (notifier->prev) notifier->prev->next = notifier->next; if (notifier->next) notifier->next->prev = notifier->prev; if (notifiers == notifier) notifiers = notifier->next; delete notifier; } if (notifierRefCount.fetch_sub(1) == 1) { std::lock_guard<priority_mutex> sync(notifierInterruptMutex); // if this was the last notifier, clean up alarm and manager if (notifierAlarm) { notifierAlarm->writeEnable(false, status); delete notifierAlarm; notifierAlarm = nullptr; } if (notifierManager) { notifierManager->disable(status); delete notifierManager; notifierManager = nullptr; } closestTrigger = UINT64_MAX; } }
void HAL_CleanNotifier(HAL_NotifierHandle notifierHandle, int32_t* status) { { std::lock_guard<priority_recursive_mutex> sync(notifierMutex); auto notifier = notifierHandles.Get(notifierHandle); if (!notifier) return; // remove from list if (notifier->prev) notifier->prev->next = notifier->next; if (notifier->next) notifier->next->prev = notifier->prev; if (notifiers == notifier) notifiers = notifier->next; notifierHandles.Free(notifierHandle); if (notifier->threaded) { NotifierThreadOwner* owner = static_cast<NotifierThreadOwner*>(notifier->param); delete owner; } } if (notifierRefCount.fetch_sub(1) == 1) { std::lock_guard<priority_mutex> sync(notifierInterruptMutex); // if this was the last notifier, clean up alarm and manager if (notifierAlarm) { notifierAlarm->writeEnable(false, status); notifierAlarm = nullptr; } if (notifierManager) { notifierManager->disable(status); notifierManager = nullptr; } closestTrigger = UINT64_MAX; } }
inline void thread_pool::execute(delegate_type e) { if (fc_.fetch_sub(1, ::std::memory_order_relaxed) <= 0) { spawn_thread(); } // else do nothing { ::std::lock_guard<decltype(cm_)> l(cm_); delegates_.emplace_back(::std::move(e)); } cv_.notify_one(); }