50 //We reserve space for two preallocated activities that may start concurrently on the CPR |
50 //We reserve space for two preallocated activities that may start concurrently on the CPR |
51 //node: destroy and data client stop. |
51 //node: destroy and data client stop. |
52 static const TUint KDefaultMaxPreallocatedActivityCount = 2; |
52 static const TUint KDefaultMaxPreallocatedActivityCount = 2; |
53 static const TUint KMaxPreallocatedActivitySize = sizeof(MeshMachine::CNodeRetryParallelActivity) + sizeof(MeshMachine::APreallocatedOriginators<4>); |
53 static const TUint KMaxPreallocatedActivitySize = sizeof(MeshMachine::CNodeRetryParallelActivity) + sizeof(MeshMachine::APreallocatedOriginators<4>); |
54 static const TUint KDummyCPRPreallocatedActivityBufferSize = KDefaultMaxPreallocatedActivityCount * KMaxPreallocatedActivitySize; |
54 static const TUint KDummyCPRPreallocatedActivityBufferSize = KDefaultMaxPreallocatedActivityCount * KMaxPreallocatedActivitySize; |
55 |
55 static const TUint KDestroyDelay = 3; |
|
56 static const TUint KMillion = 1000000; |
56 //-================================================ |
57 //-================================================ |
57 // |
58 // |
58 // States and Transitions |
59 // States and Transitions |
59 // |
60 // |
60 //-================================================ |
61 //-================================================ |
|
62 CDelayTimer* CDelayTimer::NewL( Messages::RNodeInterface* aSender, const Messages::TNodeId& aRecipient, const Messages::TNodeSignal::TMessageId& aMessageId ) |
|
63 { |
|
64 CDelayTimer* timer = new(ELeave) CDelayTimer( aSender, aRecipient, aMessageId ); |
|
65 CleanupStack::PushL( timer ); |
|
66 timer->ConstructL(); |
|
67 CleanupStack::Pop(); |
|
68 return timer; |
|
69 } |
|
70 |
|
71 CDelayTimer::~CDelayTimer() |
|
72 { |
|
73 Cancel(); |
|
74 } |
|
75 |
|
76 CDelayTimer::CDelayTimer( Messages::RNodeInterface* aSender, const Messages::TNodeId& aRecipient, const Messages::TNodeSignal::TMessageId& aMessageId ) : |
|
77 CTimer( EPriorityStandard ), |
|
78 iSender(aSender), |
|
79 iRecipient(aRecipient), |
|
80 iMessageId(aMessageId) |
|
81 { |
|
82 CActiveScheduler::Add( this ); |
|
83 } |
|
84 |
|
85 void CDelayTimer::ConstructL() |
|
86 { |
|
87 CTimer::ConstructL(); |
|
88 } |
|
89 |
|
90 void CDelayTimer::RunL() |
|
91 { |
|
92 CDelayTimer::TDelayMessage msg(iMessageId); |
|
93 Messages::RClientInterface::OpenPostMessageClose(iSender->RecipientId() , iRecipient, msg ); |
|
94 delete this; |
|
95 } |
|
96 |
|
97 void CDelayTimer::Start( TInt aIntervalInSecs ) |
|
98 { |
|
99 After( TTimeIntervalMicroSeconds32( aIntervalInSecs * KMillion ) ); |
|
100 } |
|
101 |
|
102 CDelayTimer::TDelayMessage::TDelayMessage() |
|
103 { |
|
104 } |
|
105 |
|
106 CDelayTimer::TDelayMessage::TDelayMessage(const TNodeSignal::TMessageId& aMessageId) |
|
107 : TSignatureBase(aMessageId) |
|
108 { |
|
109 } |
|
110 |
|
111 |
61 namespace DummyCPRStates |
112 namespace DummyCPRStates |
62 { |
113 { |
63 DEFINE_SMELEMENT(TSetClientAsIncoming, NetStateMachine::MStateTransition, DummyCPRStates::TContext) |
114 DEFINE_SMELEMENT(TSetClientAsIncoming, NetStateMachine::MStateTransition, DummyCPRStates::TContext) |
64 void TSetClientAsIncoming::DoL() |
115 void TSetClientAsIncoming::DoL() |
65 { |
116 { |
84 __ASSERT_DEBUG(commsBinderReq.iValue == TSubConnOpen::EWaitForIncoming, User::Panic(KSpecAssert_ESockTestdmyprcn, 1)); |
135 __ASSERT_DEBUG(commsBinderReq.iValue == TSubConnOpen::EWaitForIncoming, User::Panic(KSpecAssert_ESockTestdmyprcn, 1)); |
85 commsBinderReq.iValue = TSubConnOpen::ECreateNew; |
136 commsBinderReq.iValue = TSubConnOpen::ECreateNew; |
86 PRStates::TCreateDataClient createSCPR(iContext); |
137 PRStates::TCreateDataClient createSCPR(iContext); |
87 createSCPR.DoL(); |
138 createSCPR.DoL(); |
88 } |
139 } |
|
140 |
|
141 DEFINE_SMELEMENT(TThreeSecDelayAndPostToSelf, NetStateMachine::MStateTransition, DummyCPRStates::TContext) |
|
142 void TThreeSecDelayAndPostToSelf::DoL() |
|
143 { |
|
144 CDelayTimer* delay = CDelayTimer::NewL(iContext.Node().ControlProvider(), iContext.NodeId(), iContext.iMessage.MessageId() ); |
|
145 delay->Start(KDestroyDelay); |
|
146 } |
89 |
147 |
90 DEFINE_SMELEMENT(TAwaitingStart, NetStateMachine::MState, DummyCPRStates::TContext) |
148 DEFINE_SMELEMENT(TAwaitingStart, NetStateMachine::MState, DummyCPRStates::TContext) |
91 TBool TAwaitingStart::Accept() |
149 TBool TAwaitingStart::Accept() |
92 { |
150 { |
93 const TLayerSelectionInfo* selectionInfo = static_cast<const TLayerSelectionInfo*>( |
151 const TLayerSelectionInfo* selectionInfo = static_cast<const TLayerSelectionInfo*>( |
99 { |
157 { |
100 return ETrue; |
158 return ETrue; |
101 } |
159 } |
102 return EFalse; |
160 return EFalse; |
103 } |
161 } |
|
162 |
|
163 DEFINE_SMELEMENT(TAwaitingDestroy, NetStateMachine::MState, DummyCPRStates::TContext) |
|
164 TBool TAwaitingDestroy::Accept() |
|
165 { |
|
166 const TLayerSelectionInfo* selectionInfo = static_cast<const TLayerSelectionInfo*>( |
|
167 iContext.Node().AccessPointConfig().FindExtension(TLayerSelectionInfo::TypeId())); |
|
168 ASSERT(selectionInfo); // should always be there |
|
169 |
|
170 if (iContext.iMessage.IsMessage<TEChild::TDestroy>() && |
|
171 TCprConfigModifier::Is(selectionInfo->CprConfig(), TCprConfigModifier::ECPRWaitOnThreeSecDestroy) |
|
172 && iContext.iNode.CountActivities(ECFActivityDummyCprDestroy) == 0 ) // only accept the first destroy which will subsequently be reposted to self after 3 second |
|
173 { |
|
174 static_cast<ESock::CMMCommsProviderBase&>(iContext.iNode).MarkMeForDeletion(); |
|
175 return ETrue; |
|
176 } |
|
177 return EFalse; |
|
178 } |
|
179 |
104 } |
180 } |
105 |
181 |
106 //-================================================ |
182 //-================================================ |
107 // |
183 // |
108 // Activities |
184 // Activities |
136 LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TRaiseError<KErrAbort>) |
212 LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TRaiseError<KErrAbort>) |
137 NODEACTIVITY_END() |
213 NODEACTIVITY_END() |
138 } |
214 } |
139 |
215 |
140 // Activity Map For test-code ridden cpr |
216 // Activity Map For test-code ridden cpr |
|
217 namespace DummyCprDestroyActivity |
|
218 { |
|
219 DECLARE_DEFINE_NODEACTIVITY(ECFActivityDummyCprDestroy, DummyCprDestroy, TEChild::TDestroy) |
|
220 FIRST_NODEACTIVITY_ENTRY(DummyCPRStates::TAwaitingDestroy, MeshMachine::TNoTag) |
|
221 NODEACTIVITY_ENTRY(KNoTag, DummyCPRStates::TThreeSecDelayAndPostToSelf, MeshMachine::TAwaitingMessageState<Messages::TEChild::TLeft>, MeshMachine::TTag<PRStates::KContinue>) |
|
222 LAST_NODEACTIVITY_ENTRY(PRStates::KContinue, MeshMachine::TDoNothing) |
|
223 NODEACTIVITY_END() |
|
224 } |
|
225 |
|
226 // Activity Map |
141 namespace DummyCPRStates |
227 namespace DummyCPRStates |
142 { |
228 { |
143 DECLARE_DEFINE_ACTIVITY_MAP(stateMap) |
229 DECLARE_DEFINE_ACTIVITY_MAP(stateMap) |
144 ACTIVITY_MAP_ENTRY(DummyCprBinderRequestActivity, DummyCprBinderRequest) |
230 ACTIVITY_MAP_ENTRY(DummyCprBinderRequestActivity, DummyCprBinderRequest) |
145 ACTIVITY_MAP_ENTRY(DummyCprStartActivity, DummyCPrStart) |
231 ACTIVITY_MAP_ENTRY(DummyCprStartActivity, DummyCPrStart) |
|
232 ACTIVITY_MAP_ENTRY(DummyCprDestroyActivity, DummyCprDestroy) |
146 ACTIVITY_MAP_END_BASE(MobilityCprActivities, mobilityCprActivities) |
233 ACTIVITY_MAP_END_BASE(MobilityCprActivities, mobilityCprActivities) |
147 } |
234 } |
|
235 |
148 |
236 |
149 // Activity Map For vanilla cpr |
237 // Activity Map For vanilla cpr |
150 namespace VanillaDummyCPRStates |
238 namespace VanillaDummyCPRStates |
151 { |
239 { |
152 DECLARE_DEFINE_ACTIVITY_MAP(stateMap) |
240 DECLARE_DEFINE_ACTIVITY_MAP(stateMap) |