commsfwsupport/commselements/meshmachine/src/mm_activities.cpp
changeset 79 cf589eb1e31e
parent 40 34fc115b8742
equal deleted inserted replaced
75:a365cb779476 79:cf589eb1e31e
    33 
    33 
    34 using namespace MeshMachine;
    34 using namespace MeshMachine;
    35 using namespace Messages;
    35 using namespace Messages;
    36 using namespace Elements;
    36 using namespace Elements;
    37 using namespace NetStateMachine;
    37 using namespace NetStateMachine;
    38 
       
    39 //-=========================================================
       
    40 //
       
    41 //Panics
       
    42 //
       
    43 //-=========================================================
       
    44 _LIT (KMMActivityPanic,"MMActivityPanic");
       
    45 enum
       
    46 	{
       
    47 	EPanicCorruptedContext = 1,
       
    48 	EPanicNoPreallocatedSpace = 2,
       
    49 	EPanicOutOfActivities = 3,
       
    50 	EPanicOutOfBounds
       
    51 	};
       
    52 
    38 
    53 //-=========================================================
    39 //-=========================================================
    54 //
    40 //
    55 //TNodeActivityIter
    41 //TNodeActivityIter
    56 //
    42 //
   554     static const TInt iSize = sizeof(TUint32) * 8;
   540     static const TInt iSize = sizeof(TUint32) * 8;
   555     static const TUint32 iSizeMask = iSize - 1;
   541     static const TUint32 iSizeMask = iSize - 1;
   556     static const TUint32 iFull = ~0;
   542     static const TUint32 iFull = ~0;
   557     static const TInt iCount = (SIZE + iSizeMask) / iSize;
   543     static const TInt iCount = (SIZE + iSizeMask) / iSize;
   558     TBitmap();
   544     TBitmap();
   559     void SetBit(TUint aBitNum);
   545     void SetBitL(TUint aBitNum);
   560     TInt GetFreeBit() const;
   546     TInt GetFreeBit() const;
   561 
   547 
   562 private:
   548 private:
   563     TUint32 iBits[iCount];
   549     TUint32 iBits[iCount];
   564 };
   550 };
   571         iBits[i] = 0;
   557         iBits[i] = 0;
   572         }
   558         }
   573 }
   559 }
   574 
   560 
   575 template<TInt SIZE>
   561 template<TInt SIZE>
   576 void TBitmap<SIZE>::SetBit(TUint aBitNum)
   562 void TBitmap<SIZE>::SetBitL(TUint aBitNum)
   577     {
   563     {
   578     const TInt index = aBitNum / iSize;
   564     const TInt index = aBitNum / iSize;
   579 	__ASSERT_ALWAYS(index < iCount,User::Panic(KMMActivityPanic,EPanicOutOfBounds));
   565 	User::LeaveIfError(index < iCount ? KErrNone : KErrOverflow);
   580 
   566 
   581     iBits[index] |= 1 << (aBitNum & iSizeMask);
   567     iBits[index] |= 1 << (aBitNum & iSizeMask);
   582     }
   568     }
   583 
   569 
   584 template<TInt SIZE>
   570 template<TInt SIZE>
   610 //
   596 //
   611 //CNodeParallelActivityBase
   597 //CNodeParallelActivityBase
   612 //
   598 //
   613 //-=========================================================
   599 //-=========================================================
   614 
   600 
       
   601 EXPORT_C TUint CNodeParallelActivityBase::GetNextActivityCountL( const TNodeActivity& aActivitySig, const AMMNodeBase& aNode )
       
   602     {
       
   603     return DoGetNextActivityCountL(aActivitySig, aNode);
       
   604     }
       
   605 
       
   606 EXPORT_C TUint CNodeParallelActivityBase::GetNextActivityCount( const TNodeActivity& aActivitySig, const AMMNodeBase& aNode )
       
   607     {
       
   608     // Version for infallible activities
       
   609 	TUint nextActivity(0);
       
   610     TRAPD(err,nextActivity = DoGetNextActivityCountL(aActivitySig, aNode));
       
   611 	__ASSERT_ALWAYS(err == KErrNone,User::Panic(KMMActivityPanic,EPanicOutOfActivities));
       
   612 	return nextActivity;
       
   613     }
   615 
   614 
   616 // For custom activities to implement New
   615 // For custom activities to implement New
   617 EXPORT_C TUint CNodeParallelActivityBase::GetNextActivityCount( const TNodeActivity& aActivitySig, const AMMNodeBase& aNode )
   616 TUint CNodeParallelActivityBase::DoGetNextActivityCountL( const TNodeActivity& aActivitySig, const AMMNodeBase& aNode )
   618 	{
   617 	{
   619 	TInt c = 1;
   618 	TInt c = 1;
   620 	
   619 	
   621 	const RPointerArray<CNodeActivityBase>& activities = aNode.Activities();
   620 	const RPointerArray<CNodeActivityBase>& activities = aNode.Activities();
   622 	
   621 	
   626 		{
   625 		{
   627 		TInt16 id = activities[i]->ActivityId();
   626 		TInt16 id = activities[i]->ActivityId();
   628 		if ((id&0xff) == aActivitySig.iId)
   627 		if ((id&0xff) == aActivitySig.iId)
   629 			{
   628 			{
   630 			TInt8 uniqueid = id >> 8;
   629 			TInt8 uniqueid = id >> 8;
   631 			activityids.SetBit(uniqueid);
   630 			activityids.SetBitL(uniqueid);
   632 			}
   631 			}
   633 		}
   632 		}
   634 	c = activityids.GetFreeBit();
   633 	c = activityids.GetFreeBit();
   635 	
   634 	
   636 	__ASSERT_ALWAYS(c>=0,User::Panic(KMMActivityPanic,EPanicOutOfActivities));
   635 	User::LeaveIfError( c>=0 ? KErrNone : KErrOverflow);
   637     return c;
   636     return c;
   638 	}
   637 	}
   639 
   638 
   640 EXPORT_C CNodeActivityBase* CNodeParallelActivityBase::NewL( const TNodeActivity& aActivitySig, AMMNodeBase& aNode )
   639 EXPORT_C CNodeActivityBase* CNodeParallelActivityBase::NewL( const TNodeActivity& aActivitySig, AMMNodeBase& aNode )
   641     {
   640     {