diff options
Diffstat (limited to 'src/kernel')
| -rw-r--r-- | src/kernel/cpumgr.C | 6 | ||||
| -rw-r--r-- | src/kernel/deferred.C | 10 |
2 files changed, 11 insertions, 5 deletions
diff --git a/src/kernel/cpumgr.C b/src/kernel/cpumgr.C index ba3b08356..44f61a173 100644 --- a/src/kernel/cpumgr.C +++ b/src/kernel/cpumgr.C @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2010,2014 */ +/* Contributors Listed Below - COPYRIGHT 2010,2014 */ +/* [+] International Business Machines Corp. */ +/* */ /* */ /* Licensed under the Apache License, Version 2.0 (the "License"); */ /* you may not use this file except in compliance with the License. */ @@ -293,7 +295,7 @@ void CpuManager::startSlaveCPU(cpu_t* cpu) }; SyncTimebase* deferred = new SyncTimebase(); - DeferredQueue::insert(deferred); + DeferredQueue::insert(deferred, true /* only if empty */); DeferredQueue::execute(); } diff --git a/src/kernel/deferred.C b/src/kernel/deferred.C index 8963226fc..af8a10189 100644 --- a/src/kernel/deferred.C +++ b/src/kernel/deferred.C @@ -60,10 +60,10 @@ DeferredQueue::~DeferredQueue() kassert(0 == iv_cpus_and_next); } -void DeferredQueue::insert(DeferredWork* i_work) +void DeferredQueue::insert(DeferredWork* i_work, bool i_onlyIfEmpty) { // Call singleton insert. - Singleton<DeferredQueue>::instance()._insert(i_work); + Singleton<DeferredQueue>::instance()._insert(i_work, i_onlyIfEmpty); } void DeferredQueue::execute() @@ -72,7 +72,7 @@ void DeferredQueue::execute() Singleton<DeferredQueue>::instance()._execute(); } -void DeferredQueue::_insert(DeferredWork* i_work) +void DeferredQueue::_insert(DeferredWork* i_work, bool i_onlyIfEmpty) { lock.lock(); @@ -81,6 +81,10 @@ void DeferredQueue::_insert(DeferredWork* i_work) { iv_cpus_and_next = reinterpret_cast<uint64_t>(i_work); } + else if (i_onlyIfEmpty) + { + delete i_work; + } else { // Follow linked list to last work item. |

