| author | Slion |
| Thu, 07 Jan 2010 01:56:11 +0100 | |
| branch | anywhere |
| changeset 26 | 01da090338f9 |
| parent 0 | a41df078684a |
| permissions | -rw-r--r-- |
// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of the License "Eclipse Public License v1.0" // which accompanies this distribution, and is available // at the URL "http://www.eclipse.org/legal/epl-v10.html". // // Initial Contributors: // Nokia Corporation - initial contribution. // // Contributors: // // Description: // #include <plat_priv.h> #include "mm.h" #include "mmu.h" #include "mcleanup.h" // // TMemoryCleanup // static TDfc CleanupDfc(TMemoryCleanup::Cleanup, NULL, 2); static TMemoryCleanup* CleanupList = 0; #ifdef __SMP__ static TSpinLock CleanupLock(TSpinLock::EOrderEventHandlerList); #endif void TMemoryCleanup::Init2() { CleanupDfc.SetDfcQ(K::SvMsgQ); } void TMemoryCleanup::Add(TMemoryCleanupCallback aCallback, TAny* aArg) { __SPIN_LOCK_IRQ(CleanupLock); if(iCallback) { // already queued... __NK_ASSERT_DEBUG(iCallback==aCallback); __SPIN_UNLOCK_IRQ(CleanupLock); } else { iCallback = aCallback; iArg = aArg; iNext = CleanupList; CleanupList = this; __SPIN_UNLOCK_IRQ(CleanupLock); CleanupDfc.Enque(); } } void TMemoryCleanup::Cleanup(TAny* /*aDummy*/) { for(;;) { __SPIN_LOCK_IRQ(CleanupLock); TMemoryCleanup* c = CleanupList; if(!c) { __SPIN_UNLOCK_IRQ(CleanupLock); return; } CleanupList = c->iNext; TMemoryCleanupCallback fn = c->iCallback; TAny* arg = c->iArg; c->iCallback = 0; __SPIN_UNLOCK_IRQ(CleanupLock); (*fn)(arg); } }