keepalive/flextimer/server/engine/src/flextimercontainer.cpp
author hgs
Mon, 24 May 2010 20:51:35 +0300
changeset 32 5c4486441ae6
permissions -rw-r--r--
201021
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - Initial contribution
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Description:
hgs
parents:
diff changeset
    13
 * This class contains implementation of CFlexTimerContainer.
hgs
parents:
diff changeset
    14
 *
hgs
parents:
diff changeset
    15
 */
hgs
parents:
diff changeset
    16
hgs
parents:
diff changeset
    17
// System include files
hgs
parents:
diff changeset
    18
#include <hal.h>
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
// User include files
hgs
parents:
diff changeset
    21
#include "flextimercommon.h"
hgs
parents:
diff changeset
    22
#include "flextimercontainer.h"
hgs
parents:
diff changeset
    23
#include "flextimeritem.h"
hgs
parents:
diff changeset
    24
#include "mflextimerservicecb.h"
hgs
parents:
diff changeset
    25
#include "OstTraceDefinitions.h"
hgs
parents:
diff changeset
    26
#ifdef OST_TRACE_COMPILER_IN_USE
hgs
parents:
diff changeset
    27
#include "flextimercontainerTraces.h"
hgs
parents:
diff changeset
    28
#endif
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
// This literal is only used by __ASSERT_DEBUG macro. Therefore, to prevent 
hgs
parents:
diff changeset
    33
// unnacessary warnings, it is not compiled into release builds.
hgs
parents:
diff changeset
    34
#ifdef _DEBUG
hgs
parents:
diff changeset
    35
static const TInt KCBNullPointer = 1;
hgs
parents:
diff changeset
    36
_LIT( KCBNullPointerDescriptor, "FlexTimerService CB is NULL." );
hgs
parents:
diff changeset
    37
#endif
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    40
// NewL
hgs
parents:
diff changeset
    41
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    42
//
hgs
parents:
diff changeset
    43
CFlexTimerContainer* CFlexTimerContainer::NewL()
hgs
parents:
diff changeset
    44
    {
hgs
parents:
diff changeset
    45
    CFlexTimerContainer* self = new (ELeave) CFlexTimerContainer();
hgs
parents:
diff changeset
    46
    
hgs
parents:
diff changeset
    47
    OstTrace1( TRACE_INTERNAL,
hgs
parents:
diff changeset
    48
        CFLEXTIMERCONTAINER_NEWL,
hgs
parents:
diff changeset
    49
        "CFlexTimerContainer::NewL;this=%x",
hgs
parents:
diff changeset
    50
        ( TUint )self );
hgs
parents:
diff changeset
    51
    
hgs
parents:
diff changeset
    52
    return self;
hgs
parents:
diff changeset
    53
    }
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    56
// destructor
hgs
parents:
diff changeset
    57
// If the list is not empty when coming here something has already gone wrong.
hgs
parents:
diff changeset
    58
// Lets just delete the timers and forget Timeout() calling
hgs
parents:
diff changeset
    59
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    60
//
hgs
parents:
diff changeset
    61
CFlexTimerContainer::~CFlexTimerContainer()
hgs
parents:
diff changeset
    62
    {
hgs
parents:
diff changeset
    63
    CFlexTimerItem* item = NULL;
hgs
parents:
diff changeset
    64
    
hgs
parents:
diff changeset
    65
    OstTrace1(
hgs
parents:
diff changeset
    66
        TRACE_INTERNAL,
hgs
parents:
diff changeset
    67
        DUP1_CFLEXTIMERCONTAINER_CFLEXTIMERCONTAINER,
hgs
parents:
diff changeset
    68
        "CFlexTimerContainer::~CFlexTimerContainer;this=%x",
hgs
parents:
diff changeset
    69
        ( TUint )this );
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
    while ( !iTimerList.IsEmpty() )
hgs
parents:
diff changeset
    72
        {
hgs
parents:
diff changeset
    73
        item = iTimerList.First();
hgs
parents:
diff changeset
    74
        iTimerList.Remove( *item );
hgs
parents:
diff changeset
    75
        delete item;
hgs
parents:
diff changeset
    76
        }
hgs
parents:
diff changeset
    77
    }
hgs
parents:
diff changeset
    78
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    79
// Make new timer and add it to list. On purpose do not make sanity checks. 
hgs
parents:
diff changeset
    80
// Invalid(in the past) timers are found later.
hgs
parents:
diff changeset
    81
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    82
//
hgs
parents:
diff changeset
    83
void CFlexTimerContainer::AddTimerL(
hgs
parents:
diff changeset
    84
    const TTimeIntervalMicroSeconds& aWinStartInterval,
hgs
parents:
diff changeset
    85
    const TTimeIntervalMicroSeconds& aWinEndInterval,
hgs
parents:
diff changeset
    86
    TBool aCancelAtSystemTimeChange,
hgs
parents:
diff changeset
    87
    const MFlexTimerServiceCB* aFlexTimerServiceCB )
hgs
parents:
diff changeset
    88
    {
hgs
parents:
diff changeset
    89
    OstTraceExt5( TRACE_INTERNAL,
hgs
parents:
diff changeset
    90
        CFLEXTIMERCONTAINER_ADDTIMERL,
hgs
parents:
diff changeset
    91
        "CFlexTimerContainer::AddTimerL;this=%x;"
hgs
parents:
diff changeset
    92
        "aWinStartInterval=%Ld;"
hgs
parents:
diff changeset
    93
        "aWinEndInterval=%Ld;"
hgs
parents:
diff changeset
    94
        "aCancelAtSystemTimeChange=%u;"
hgs
parents:
diff changeset
    95
        "aFlexTimerServiceCB=%x",
hgs
parents:
diff changeset
    96
        ( TUint )this,
hgs
parents:
diff changeset
    97
        aWinStartInterval.Int64(),
hgs
parents:
diff changeset
    98
        aWinEndInterval.Int64(),
hgs
parents:
diff changeset
    99
        aCancelAtSystemTimeChange,
hgs
parents:
diff changeset
   100
        ( TUint )aFlexTimerServiceCB );
hgs
parents:
diff changeset
   101
    
hgs
parents:
diff changeset
   102
    __ASSERT_DEBUG( aFlexTimerServiceCB,
hgs
parents:
diff changeset
   103
            User::Panic( KCBNullPointerDescriptor, KCBNullPointer ) );
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
    // Before creating new flextimer timeout item, the interval times are
hgs
parents:
diff changeset
   106
    // converted to absolute tick based time used by the engine.
hgs
parents:
diff changeset
   107
    TTime winAbsStart( IntervalToAbsoluteTime( aWinStartInterval ) );
hgs
parents:
diff changeset
   108
    TTime winAbsEnd( IntervalToAbsoluteTime( aWinEndInterval ) );
hgs
parents:
diff changeset
   109
    
hgs
parents:
diff changeset
   110
    CFlexTimerItem* newItem = CFlexTimerItem::NewL( winAbsStart,
hgs
parents:
diff changeset
   111
        winAbsEnd,
hgs
parents:
diff changeset
   112
        aCancelAtSystemTimeChange,
hgs
parents:
diff changeset
   113
        aFlexTimerServiceCB );
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
    iTimerList.AddLast( *newItem );
hgs
parents:
diff changeset
   116
    }
hgs
parents:
diff changeset
   117
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   118
// Loop through list and if timer containing same CB that is given as a
hgs
parents:
diff changeset
   119
// parameter is found, remove timer. If no timer found just return error code.
hgs
parents:
diff changeset
   120
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   121
//
hgs
parents:
diff changeset
   122
TInt CFlexTimerContainer::RemoveTimer(
hgs
parents:
diff changeset
   123
    const MFlexTimerServiceCB* aFlexTimerServiceCB )
hgs
parents:
diff changeset
   124
    {
hgs
parents:
diff changeset
   125
    OstTraceExt2( TRACE_INTERNAL,
hgs
parents:
diff changeset
   126
        CFLEXTIMERCONTAINER_REMOVETIMER,
hgs
parents:
diff changeset
   127
        "CFlexTimerContainer::RemoveTimer;this=%x;aFlexTimerServiceCB=%x",
hgs
parents:
diff changeset
   128
        ( TUint )this,
hgs
parents:
diff changeset
   129
        ( TUint )aFlexTimerServiceCB );
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
    __ASSERT_DEBUG( aFlexTimerServiceCB,
hgs
parents:
diff changeset
   132
        User::Panic( KCBNullPointerDescriptor, KCBNullPointer ) );
hgs
parents:
diff changeset
   133
    
hgs
parents:
diff changeset
   134
    TSglQueIter<CFlexTimerItem> listIter( iTimerList );
hgs
parents:
diff changeset
   135
    CFlexTimerItem* item = NULL;
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
    listIter.SetToFirst();
hgs
parents:
diff changeset
   138
    // Iter++ makes iterator to point to next element if one exists.
hgs
parents:
diff changeset
   139
    // Otherwise NULL.
hgs
parents:
diff changeset
   140
    while ( (item = listIter++) != NULL )
hgs
parents:
diff changeset
   141
        {
hgs
parents:
diff changeset
   142
        if ( item->GetCB() == aFlexTimerServiceCB )
hgs
parents:
diff changeset
   143
            {
hgs
parents:
diff changeset
   144
            iTimerList.Remove( *item );
hgs
parents:
diff changeset
   145
            delete item;
hgs
parents:
diff changeset
   146
            return KErrNone;
hgs
parents:
diff changeset
   147
            }
hgs
parents:
diff changeset
   148
        }
hgs
parents:
diff changeset
   149
    return KErrNotFound;
hgs
parents:
diff changeset
   150
    }
hgs
parents:
diff changeset
   151
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   152
// Loop through timers and find time/timer that must expire next
hgs
parents:
diff changeset
   153
// Calculate time left to that moment and return it. 
hgs
parents:
diff changeset
   154
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   155
//
hgs
parents:
diff changeset
   156
TBool CFlexTimerContainer::GetNextTimeout(
hgs
parents:
diff changeset
   157
    TTimeIntervalMicroSeconds& aNextTimeoutDelay )
hgs
parents:
diff changeset
   158
    {
hgs
parents:
diff changeset
   159
    TSglQueIter<CFlexTimerItem> listIter( iTimerList );
hgs
parents:
diff changeset
   160
    TTime currentAbsoluteTime( 0 );
hgs
parents:
diff changeset
   161
    CFlexTimerItem* item = NULL;
hgs
parents:
diff changeset
   162
    TTime tempTime( 0 );
hgs
parents:
diff changeset
   163
    TTime nextTimeout( 0 );
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
    GetCurrentTime( currentAbsoluteTime );
hgs
parents:
diff changeset
   166
    // Take first item as a reference value.
hgs
parents:
diff changeset
   167
    listIter.SetToFirst();
hgs
parents:
diff changeset
   168
    item = listIter++;
hgs
parents:
diff changeset
   169
    if ( item )
hgs
parents:
diff changeset
   170
        {
hgs
parents:
diff changeset
   171
        item->GetMaxAbsoluteTime( nextTimeout );
hgs
parents:
diff changeset
   172
        }
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
    // Find the timer that needs to expire next, and set nextTimeout to the
hgs
parents:
diff changeset
   175
    // time, when the timer needs to expire.
hgs
parents:
diff changeset
   176
    while ( (item = listIter++) != NULL )
hgs
parents:
diff changeset
   177
        {
hgs
parents:
diff changeset
   178
        item->GetMaxAbsoluteTime( tempTime );
hgs
parents:
diff changeset
   179
        if ( tempTime < nextTimeout )
hgs
parents:
diff changeset
   180
            {
hgs
parents:
diff changeset
   181
            nextTimeout = tempTime;
hgs
parents:
diff changeset
   182
            }
hgs
parents:
diff changeset
   183
        }
hgs
parents:
diff changeset
   184
    // Calculate difference between now -> min timeout time. If in past,
hgs
parents:
diff changeset
   185
    // return zero interval
hgs
parents:
diff changeset
   186
    aNextTimeoutDelay = nextTimeout.MicroSecondsFrom( currentAbsoluteTime );
hgs
parents:
diff changeset
   187
    if ( aNextTimeoutDelay < TTimeIntervalMicroSeconds( 0 ) )
hgs
parents:
diff changeset
   188
        {
hgs
parents:
diff changeset
   189
        aNextTimeoutDelay = 0;
hgs
parents:
diff changeset
   190
        }
hgs
parents:
diff changeset
   191
    
hgs
parents:
diff changeset
   192
    OstTraceExt2( TRACE_INTERNAL,
hgs
parents:
diff changeset
   193
        CFLEXTIMERCONTAINER_GETNEXTTIMEOUT,
hgs
parents:
diff changeset
   194
        "CFlexTimerContainer::GetNextTimeout;this=%x;aNextTimeoutDelay=%Ld",
hgs
parents:
diff changeset
   195
        ( TUint )this,
hgs
parents:
diff changeset
   196
        aNextTimeoutDelay.Int64() );
hgs
parents:
diff changeset
   197
    
hgs
parents:
diff changeset
   198
    return !iTimerList.IsEmpty();
hgs
parents:
diff changeset
   199
    }
hgs
parents:
diff changeset
   200
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   201
// Excecute selected algorithms and finally fire all timers in candidate list.
hgs
parents:
diff changeset
   202
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   203
//
hgs
parents:
diff changeset
   204
void CFlexTimerContainer::FireTimers( TFlexTimerAlgorithm aAlgorithmToBeUsed )
hgs
parents:
diff changeset
   205
    {
hgs
parents:
diff changeset
   206
    OstTraceExt2( TRACE_INTERNAL,
hgs
parents:
diff changeset
   207
        CFLEXTIMERCONTAINER_FIRETIMERS,
hgs
parents:
diff changeset
   208
        "CFlexTimerContainer::FireTimers;this=%x;aAlgorithmToBeUsed=%x",
hgs
parents:
diff changeset
   209
        ( TUint )this,
hgs
parents:
diff changeset
   210
        ( TUint )aAlgorithmToBeUsed );
hgs
parents:
diff changeset
   211
hgs
parents:
diff changeset
   212
    TSglQue<CFlexTimerItem> candidateList( _FOFF( CFlexTimerItem, iLink ) );
hgs
parents:
diff changeset
   213
hgs
parents:
diff changeset
   214
    TTime currentAbsoluteTime( 0 );
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
    GetCurrentTime( currentAbsoluteTime );
hgs
parents:
diff changeset
   217
    
hgs
parents:
diff changeset
   218
    // Simple algorithm is always executed
hgs
parents:
diff changeset
   219
    SimpleAlgorithm( candidateList, currentAbsoluteTime );
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
    if ( EFlexTimerAlgorithmLatestPossible == aAlgorithmToBeUsed )
hgs
parents:
diff changeset
   222
        {
hgs
parents:
diff changeset
   223
        LatestPossibleAlgorithm( candidateList );
hgs
parents:
diff changeset
   224
        }
hgs
parents:
diff changeset
   225
    ExpireTimers( candidateList );
hgs
parents:
diff changeset
   226
    }
hgs
parents:
diff changeset
   227
hgs
parents:
diff changeset
   228
//
hgs
parents:
diff changeset
   229
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   230
// Loop through timer list, call abort to timer if it is abortable.
hgs
parents:
diff changeset
   231
// Then remove timer from list and delete it.
hgs
parents:
diff changeset
   232
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   233
//
hgs
parents:
diff changeset
   234
void CFlexTimerContainer::AbortTimersDueToTimeChange( TInt aReason )
hgs
parents:
diff changeset
   235
    {
hgs
parents:
diff changeset
   236
    OstTraceExt2( TRACE_INTERNAL,
hgs
parents:
diff changeset
   237
        CFLEXTIMERCONTAINER_ABORTTIMERSDUETOTIMECHANGE,
hgs
parents:
diff changeset
   238
        "CFlexTimerContainer::AbortTimersDueToTimeChange;this=%x;aReason=%d",
hgs
parents:
diff changeset
   239
        ( TUint )this,
hgs
parents:
diff changeset
   240
        aReason );
hgs
parents:
diff changeset
   241
hgs
parents:
diff changeset
   242
    TSglQueIter<CFlexTimerItem> listIter( iTimerList );
hgs
parents:
diff changeset
   243
    CFlexTimerItem* item = NULL;
hgs
parents:
diff changeset
   244
    listIter.SetToFirst();
hgs
parents:
diff changeset
   245
    
hgs
parents:
diff changeset
   246
    // Go through all timers and check if the timer has 
hgs
parents:
diff changeset
   247
    // AbortAtSystemTimeChange flag set, if so, abort the timer.
hgs
parents:
diff changeset
   248
    while ( (item = listIter++) != NULL )
hgs
parents:
diff changeset
   249
        {
hgs
parents:
diff changeset
   250
        if ( item->IsAbortedAtSystemTimeChange() )
hgs
parents:
diff changeset
   251
            {
hgs
parents:
diff changeset
   252
            item->GetCB()->Abort( aReason );
hgs
parents:
diff changeset
   253
            iTimerList.Remove( *item );
hgs
parents:
diff changeset
   254
            delete item;
hgs
parents:
diff changeset
   255
            }
hgs
parents:
diff changeset
   256
        }
hgs
parents:
diff changeset
   257
    }
hgs
parents:
diff changeset
   258
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   259
// Constructor for CFlexTimerContainer
hgs
parents:
diff changeset
   260
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   261
//
hgs
parents:
diff changeset
   262
CFlexTimerContainer::CFlexTimerContainer() :
hgs
parents:
diff changeset
   263
    iTimerList( _FOFF( CFlexTimerItem, iLink ) ),
hgs
parents:
diff changeset
   264
    iLastTicks( 0 ),
hgs
parents:
diff changeset
   265
    iCurrentAbsoluteTime( 0 )    
hgs
parents:
diff changeset
   266
    {
hgs
parents:
diff changeset
   267
    OstTrace1( TRACE_INTERNAL,
hgs
parents:
diff changeset
   268
        CFLEXTIMERCONTAINER_CFLEXTIMERCONTAINER,
hgs
parents:
diff changeset
   269
        "CFlexTimerContainer::CFlexTimerContainer;this=%x",
hgs
parents:
diff changeset
   270
        ( TUint )this );
hgs
parents:
diff changeset
   271
    TInt err;
hgs
parents:
diff changeset
   272
    
hgs
parents:
diff changeset
   273
    // Get system tick length for converting tics to microseconds.
hgs
parents:
diff changeset
   274
    err = HAL::Get( HAL::ESystemTickPeriod, iTickPeriod );
hgs
parents:
diff changeset
   275
    
hgs
parents:
diff changeset
   276
    __ASSERT_ALWAYS(
hgs
parents:
diff changeset
   277
        err == KErrNone,
hgs
parents:
diff changeset
   278
        User::Panic(
hgs
parents:
diff changeset
   279
            KFlexTimerContainerPanicCat,
hgs
parents:
diff changeset
   280
            static_cast <TInt> ( EFlexTimerContainerNoTickPeriod ) ) );
hgs
parents:
diff changeset
   281
    }
hgs
parents:
diff changeset
   282
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   283
// Loops through timer list and moves all timers that can be fired to
hgs
parents:
diff changeset
   284
// candidate list. Can be fired means that minimum time is reached. Note that
hgs
parents:
diff changeset
   285
// if we are late for some reason (very likely if someone has win size zero),
hgs
parents:
diff changeset
   286
// candidate list can now contain timers that are late (max time passed).
hgs
parents:
diff changeset
   287
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   288
//
hgs
parents:
diff changeset
   289
void CFlexTimerContainer::SimpleAlgorithm(
hgs
parents:
diff changeset
   290
    TSglQue<CFlexTimerItem>& aCandidateList,
hgs
parents:
diff changeset
   291
    TTime& aCurrentTime )
hgs
parents:
diff changeset
   292
    {
hgs
parents:
diff changeset
   293
    OstTraceExt3( TRACE_INTERNAL,
hgs
parents:
diff changeset
   294
        CFLEXTIMERCONTAINER_SIMPLEALGORITHM,
hgs
parents:
diff changeset
   295
        "CFlexTimerContainer::SimpleAlgorithm;"
hgs
parents:
diff changeset
   296
        "this=%x;aCandidateList=%x;aCurrentTime=%Ld;",
hgs
parents:
diff changeset
   297
        ( TUint )this,
hgs
parents:
diff changeset
   298
        ( TUint )&aCandidateList,
hgs
parents:
diff changeset
   299
        aCurrentTime.Int64() );
hgs
parents:
diff changeset
   300
hgs
parents:
diff changeset
   301
    TSglQueIter<CFlexTimerItem> listIter( iTimerList );
hgs
parents:
diff changeset
   302
    CFlexTimerItem* item = NULL;
hgs
parents:
diff changeset
   303
    TTime minTime( 0 );
hgs
parents:
diff changeset
   304
hgs
parents:
diff changeset
   305
    listIter.SetToFirst();
hgs
parents:
diff changeset
   306
    // Iter++ makes iterator to point to next element if one exists.
hgs
parents:
diff changeset
   307
    // Otherwise NULL.
hgs
parents:
diff changeset
   308
    while ( (item = listIter++) != NULL )
hgs
parents:
diff changeset
   309
        {
hgs
parents:
diff changeset
   310
        item->GetMinAbsoluteTime( minTime );
hgs
parents:
diff changeset
   311
        if ( minTime <= aCurrentTime )
hgs
parents:
diff changeset
   312
            {
hgs
parents:
diff changeset
   313
            OstTraceExt2( TRACE_INTERNAL,
hgs
parents:
diff changeset
   314
                DUP1_CFLEXTIMERCONTAINER_SIMPLEALGORITHM,
hgs
parents:
diff changeset
   315
                "CFlexTimerContainer::SimpleAlgorithm - Adding item;"
hgs
parents:
diff changeset
   316
                "this=%x;item=%x",
hgs
parents:
diff changeset
   317
                ( TUint )this,
hgs
parents:
diff changeset
   318
                ( TUint )item );
hgs
parents:
diff changeset
   319
            // Remove from candidate list needs to be done before the
hgs
parents:
diff changeset
   320
            // item is added to back to iTimerList, because the lists
hgs
parents:
diff changeset
   321
            // use the same iLink member.
hgs
parents:
diff changeset
   322
            iTimerList.Remove( *item );
hgs
parents:
diff changeset
   323
            
hgs
parents:
diff changeset
   324
            // This timer can be timeouted, add it to timeout candidate list.
hgs
parents:
diff changeset
   325
            // The list is called candidate list, because the content of the
hgs
parents:
diff changeset
   326
            // list may be pruned by passing it to other algorithms for furher
hgs
parents:
diff changeset
   327
            // prosessing.
hgs
parents:
diff changeset
   328
            aCandidateList.AddLast( *item );
hgs
parents:
diff changeset
   329
            }
hgs
parents:
diff changeset
   330
        }
hgs
parents:
diff changeset
   331
    }
hgs
parents:
diff changeset
   332
hgs
parents:
diff changeset
   333
//
hgs
parents:
diff changeset
   334
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   335
// Loops through dropped list and candidate list and find timers where:
hgs
parents:
diff changeset
   336
// dropped timers right side of the window is earlier than candidate timers
hgs
parents:
diff changeset
   337
// right side of the window i.e. Candidate can be fired later with dropped
hgs
parents:
diff changeset
   338
// timer, without additional timer firings
hgs
parents:
diff changeset
   339
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   340
//
hgs
parents:
diff changeset
   341
void CFlexTimerContainer::LatestPossibleAlgorithm(
hgs
parents:
diff changeset
   342
    TSglQue<CFlexTimerItem>& aCandidateList )
hgs
parents:
diff changeset
   343
    {   
hgs
parents:
diff changeset
   344
    TSglQueIter<CFlexTimerItem> listIter( iTimerList );
hgs
parents:
diff changeset
   345
    TSglQueIter<CFlexTimerItem> candidateListIter( aCandidateList );
hgs
parents:
diff changeset
   346
    CFlexTimerItem* droppedItem = NULL;
hgs
parents:
diff changeset
   347
    CFlexTimerItem* candidateItem = NULL;
hgs
parents:
diff changeset
   348
    TTime droppedMaxTime( 0 );
hgs
parents:
diff changeset
   349
    TTime candidateMaxTime( 0 );
hgs
parents:
diff changeset
   350
    
hgs
parents:
diff changeset
   351
    OstTraceExt2( TRACE_INTERNAL,
hgs
parents:
diff changeset
   352
        CFLEXTIMERCONTAINER_LATESTPOSSIBLEALGORITHM,
hgs
parents:
diff changeset
   353
        "CFlexTimerContainer::LatestPossibleAlgorithm;"
hgs
parents:
diff changeset
   354
        "this=%x;aCandidateList=%x",
hgs
parents:
diff changeset
   355
        ( TUint )this,
hgs
parents:
diff changeset
   356
        ( TUint )&aCandidateList );
hgs
parents:
diff changeset
   357
    
hgs
parents:
diff changeset
   358
    listIter.SetToFirst();
hgs
parents:
diff changeset
   359
    candidateListIter.SetToFirst();
hgs
parents:
diff changeset
   360
            
hgs
parents:
diff changeset
   361
    droppedItem = listIter++;
hgs
parents:
diff changeset
   362
    
hgs
parents:
diff changeset
   363
    if ( droppedItem != NULL )
hgs
parents:
diff changeset
   364
        {
hgs
parents:
diff changeset
   365
        // Initiliaze next dropped timeout time to some value.
hgs
parents:
diff changeset
   366
        droppedItem->GetMaxAbsoluteTime( droppedMaxTime );
hgs
parents:
diff changeset
   367
hgs
parents:
diff changeset
   368
        // Loop through dropped timers and find the dropped timer that will have
hgs
parents:
diff changeset
   369
        // shortest time to its timeout.
hgs
parents:
diff changeset
   370
        while ( (droppedItem = listIter++) != NULL )
hgs
parents:
diff changeset
   371
            {
hgs
parents:
diff changeset
   372
            droppedItem->GetMaxAbsoluteTime( candidateMaxTime );
hgs
parents:
diff changeset
   373
            if ( droppedMaxTime > candidateMaxTime )
hgs
parents:
diff changeset
   374
                {
hgs
parents:
diff changeset
   375
                droppedMaxTime = candidateMaxTime;
hgs
parents:
diff changeset
   376
                }
hgs
parents:
diff changeset
   377
            }
hgs
parents:
diff changeset
   378
hgs
parents:
diff changeset
   379
        // Loop through candidate timers
hgs
parents:
diff changeset
   380
        while ( (candidateItem = candidateListIter++) != NULL )
hgs
parents:
diff changeset
   381
            {
hgs
parents:
diff changeset
   382
            candidateItem->GetMaxAbsoluteTime( candidateMaxTime );
hgs
parents:
diff changeset
   383
            // If candidate can be fired together with dropped timer ->
hgs
parents:
diff changeset
   384
            // don't fire candidate yet.
hgs
parents:
diff changeset
   385
            if ( droppedMaxTime <= candidateMaxTime )
hgs
parents:
diff changeset
   386
                {
hgs
parents:
diff changeset
   387
                OstTraceExt2( TRACE_INTERNAL,
hgs
parents:
diff changeset
   388
                    DUP1_CFLEXTIMERCONTAINER_LATESTPOSSIBLEALGORITHM,
hgs
parents:
diff changeset
   389
                    "CFlexTimerContainer::LatestPossibleAlgorithm -"
hgs
parents:
diff changeset
   390
                    " Removing item;this=%x;candidateItem=%x",
hgs
parents:
diff changeset
   391
                    ( TUint )this,
hgs
parents:
diff changeset
   392
                    ( TUint )candidateItem );
hgs
parents:
diff changeset
   393
hgs
parents:
diff changeset
   394
                // Remove from candidate list needs to be done before the
hgs
parents:
diff changeset
   395
                // item is added to back to iTimerList, because the lists
hgs
parents:
diff changeset
   396
                // use the same iLink member.
hgs
parents:
diff changeset
   397
                aCandidateList.Remove( *candidateItem );
hgs
parents:
diff changeset
   398
                // Add to first so we don't handle this again.
hgs
parents:
diff changeset
   399
                iTimerList.AddFirst( *candidateItem );
hgs
parents:
diff changeset
   400
                }
hgs
parents:
diff changeset
   401
            }
hgs
parents:
diff changeset
   402
        }
hgs
parents:
diff changeset
   403
    }
hgs
parents:
diff changeset
   404
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   405
// Loops through candidate list and calls timeout to all timers.
hgs
parents:
diff changeset
   406
// Then removes timer from list and deletes it. 
hgs
parents:
diff changeset
   407
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   408
//
hgs
parents:
diff changeset
   409
void CFlexTimerContainer::ExpireTimers(
hgs
parents:
diff changeset
   410
    TSglQue<CFlexTimerItem>& aCandidateList )
hgs
parents:
diff changeset
   411
    {
hgs
parents:
diff changeset
   412
    OstTraceExt2( TRACE_INTERNAL,
hgs
parents:
diff changeset
   413
        CFLEXTIMERCONTAINER_EXPIRETIMERS,
hgs
parents:
diff changeset
   414
        "CFlexTimerContainer::ExpireTimers;this=%x;candidateList=%x",
hgs
parents:
diff changeset
   415
        ( TUint )this,
hgs
parents:
diff changeset
   416
        ( TUint )&aCandidateList );
hgs
parents:
diff changeset
   417
hgs
parents:
diff changeset
   418
    TSglQueIter<CFlexTimerItem> candidateListIter( aCandidateList );
hgs
parents:
diff changeset
   419
    CFlexTimerItem* item = NULL;
hgs
parents:
diff changeset
   420
hgs
parents:
diff changeset
   421
    candidateListIter.SetToFirst();
hgs
parents:
diff changeset
   422
    // Iter++ makes iterator to point to next element if one exists.
hgs
parents:
diff changeset
   423
    // Otherwise NULL.
hgs
parents:
diff changeset
   424
    while ( (item = candidateListIter++) != NULL )
hgs
parents:
diff changeset
   425
        {
hgs
parents:
diff changeset
   426
        item->GetCB()->Timeout();
hgs
parents:
diff changeset
   427
        aCandidateList.Remove( *item );
hgs
parents:
diff changeset
   428
        delete item;
hgs
parents:
diff changeset
   429
        }
hgs
parents:
diff changeset
   430
    }
hgs
parents:
diff changeset
   431
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   432
// Get current time return current time in FlexTimer engine time base. This
hgs
parents:
diff changeset
   433
// time base is begins from the first call to GetCurrentTime and it is base on
hgs
parents:
diff changeset
   434
// system ticks.
hgs
parents:
diff changeset
   435
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   436
//
hgs
parents:
diff changeset
   437
void CFlexTimerContainer::GetCurrentTime( TTime& aAbsoluteTime )
hgs
parents:
diff changeset
   438
    {
hgs
parents:
diff changeset
   439
    TUint32 currentTicks = User::TickCount();
hgs
parents:
diff changeset
   440
hgs
parents:
diff changeset
   441
    // Accumulate current absolute time with the time passed since last
hgs
parents:
diff changeset
   442
    // update. Both currentTicks and iLastTicks are unsigned int types, thus
hgs
parents:
diff changeset
   443
    // "currentTicks - iLastTicks" will handle also the case currentTicks
hgs
parents:
diff changeset
   444
    // overflows.
hgs
parents:
diff changeset
   445
    iCurrentAbsoluteTime += TicksToAbsoluteTime( currentTicks
hgs
parents:
diff changeset
   446
            - iLastTicks );
hgs
parents:
diff changeset
   447
        
hgs
parents:
diff changeset
   448
    iLastTicks = currentTicks;
hgs
parents:
diff changeset
   449
    
hgs
parents:
diff changeset
   450
    // N.B. Even though the time is is returned as TTime, this time has own
hgs
parents:
diff changeset
   451
    // time base. (See function description)
hgs
parents:
diff changeset
   452
    aAbsoluteTime = iCurrentAbsoluteTime;
hgs
parents:
diff changeset
   453
    }
hgs
parents:
diff changeset
   454
hgs
parents:
diff changeset
   455
hgs
parents:
diff changeset
   456
hgs
parents:
diff changeset
   457
hgs
parents:
diff changeset
   458
hgs
parents:
diff changeset
   459