summaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/cpumgr.C6
-rw-r--r--src/kernel/deferred.C10
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.
OpenPOWER on IntegriCloud