equal
deleted
inserted
replaced
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 { |