diff -r 000000000000 -r dd21522fd290 webengine/osswebengine/WebCore/platform/symbian/SharedTimerSymbian.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/osswebengine/WebCore/platform/symbian/SharedTimerSymbian.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,121 @@ +/* +* Copyright (c) 2006 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 "config.h" +#include "SharedTimer.h" +#include +#include +#include + +static TInt64 remainingMicro = 0; +static bool shutdownInProgress = false; + +namespace WebCore { + +static CPeriodic* sharedTimer; +static void (*sharedTimerFiredFunction)(); + +void setSharedTimerFiredFunction(void (*f)()) + { + ASSERT(!sharedTimerFiredFunction || sharedTimerFiredFunction == f); + + sharedTimerFiredFunction = f; + } + +static TInt timerFired( TAny* /*aPtr*/ ) + { + if (shutdownInProgress) + { + return KErrNone; + } + if( remainingMicro == 0 ) + { + sharedTimerFiredFunction(); + } + else + { + setSharedTimerFireTime( -1 ); + } + return KErrNone; + } + +void setSharedTimerFireTime(double fireTime) + { + if (shutdownInProgress) + { + return; + } + ASSERT(sharedTimerFiredFunction); + + if (sharedTimer) + { + sharedTimer->Cancel(); + delete sharedTimer; + sharedTimer = NULL; + } + if (fireTime != -1) + remainingMicro = 0; + + sharedTimer = CPeriodic::New( CActive::EPriorityStandard ); + if( sharedTimer ) + { + TInt64 interval( remainingMicro ); + if( remainingMicro == 0 ) + { + // fireTime comes in second resolution + TTime fireDate( TTime(fireTime * 1000000 ).Int64() ); + + TTime time; + time.HomeTime(); + interval = fireDate.Int64() - time.Int64(); + } + interval = interval < 0 ? 0 : interval; + // + TInt t; + if (interval<(TInt)(KMaxTInt32)) + { + t = interval; + remainingMicro = 0; + } + else + { + t = KMaxTInt32; + remainingMicro = interval - KMaxTInt32; + } + sharedTimer->Start( t, 0, timerFired); + } + } + +void stopSharedTimer() + { + if (sharedTimer) + { + sharedTimer->Cancel(); + delete sharedTimer; + sharedTimer = NULL; + } + remainingMicro = 0; + } + +void shutdownSharedTimer() + { + shutdownInProgress = true; + stopSharedTimer(); + } + +}