1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/kernelhwsrv/kerneltest/e32test/property/t_broadcast.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,169 @@
1.4 +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
1.5 +// All rights reserved.
1.6 +// This component and the accompanying materials are made available
1.7 +// under the terms of the License "Eclipse Public License v1.0"
1.8 +// which accompanies this distribution, and is available
1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.10 +//
1.11 +// Initial Contributors:
1.12 +// Nokia Corporation - initial contribution.
1.13 +//
1.14 +// Contributors:
1.15 +//
1.16 +// Description:
1.17 +//
1.18 +
1.19 +#include "t_property.h"
1.20 +
1.21 +class CPropBroadcastSlave : public CBase
1.22 + {
1.23 +public:
1.24 + static TInt LoopThreadEntry(TAny*);
1.25 +
1.26 + CPropBroadcastSlave(CPropBroadcast* aProg, TUid aCategory, TUint aMasterKey, TUint aSlaveKey);
1.27 + void Create(TThreadPriority);
1.28 + void Delete();
1.29 + void Loop();
1.30 +
1.31 + CPropBroadcast* iProg;
1.32 + TUid iCategory;
1.33 + TUint iMasterKey;
1.34 + TUint iSlaveKey;
1.35 +
1.36 + RProperty iProp;
1.37 + RThread iThread;
1.38 + TRequestStatus iStatus;
1.39 +
1.40 + CPropBroadcastSlave* iNext;
1.41 + };
1.42 +
1.43 +
1.44 +
1.45 +CPropBroadcastSlave::CPropBroadcastSlave(CPropBroadcast* aProg, TUid aCategory, TUint aMasterKey, TUint aSlaveKey) :
1.46 + iProg(aProg), iCategory(aCategory), iMasterKey(aMasterKey), iSlaveKey(aSlaveKey)
1.47 + {
1.48 + }
1.49 +
1.50 +void CPropBroadcastSlave::Create(TThreadPriority aPrio)
1.51 + {
1.52 + TInt r = iProp.Define(iCategory, iSlaveKey, RProperty::EInt, KPassPolicy, KPassPolicy);
1.53 + TF_ERROR_PROG(iProg, r, r == KErrNone);
1.54 + r = iProp.Attach(iCategory, iSlaveKey);
1.55 + TF_ERROR_PROG(iProg, r, r == KErrNone);
1.56 +
1.57 + r = iThread.Create(KNullDesC, LoopThreadEntry, 0x2000, NULL, this);
1.58 + TF_ERROR_PROG(iProg, r, r == KErrNone);
1.59 + iThread.Logon(iStatus);
1.60 + iThread.SetPriority(aPrio);
1.61 + iThread.Resume();
1.62 + }
1.63 +
1.64 +void CPropBroadcastSlave::Delete()
1.65 + {
1.66 + iThread.Kill(EExitKill);
1.67 + iThread.Close();
1.68 + User::WaitForRequest(iStatus);
1.69 + TF_ERROR_PROG(iProg, iStatus.Int(), iStatus.Int() == EExitKill);
1.70 +
1.71 + TInt r = iProp.Delete(iCategory, iSlaveKey);
1.72 + TF_ERROR_PROG(iProg, r, r == KErrNone);
1.73 + iProp.Close();
1.74 +
1.75 + delete this;
1.76 + }
1.77 +
1.78 +TInt CPropBroadcastSlave::LoopThreadEntry(TAny* ptr)
1.79 + {
1.80 + CPropBroadcastSlave* self = (CPropBroadcastSlave*) ptr;
1.81 + self->Loop();
1.82 + return KErrNone;
1.83 + }
1.84 +
1.85 +void CPropBroadcastSlave::Loop()
1.86 + {
1.87 + RProperty mProp;
1.88 + TInt r = mProp.Attach(iCategory, iMasterKey, EOwnerThread);
1.89 + TF_ERROR_PROG(iProg, r, r == KErrNone);
1.90 +
1.91 + RProperty sProp;
1.92 + r = sProp.Attach(iCategory, iSlaveKey, EOwnerThread);
1.93 + TF_ERROR_PROG(iProg, r, r == KErrNone);
1.94 +
1.95 + TInt value = 1;
1.96 + for(;;)
1.97 + {
1.98 + TRequestStatus status;
1.99 + mProp.Subscribe(status);
1.100 +
1.101 + r = sProp.Set(value);
1.102 + TF_ERROR_PROG(iProg, r, r == KErrNone);
1.103 +
1.104 + User::WaitForRequest(status);
1.105 +
1.106 + r = mProp.Get(value);
1.107 + TF_ERROR_PROG(iProg, r, r == KErrNone);
1.108 + }
1.109 + }
1.110 +
1.111 +_LIT(KPropBroadcastName, "RProperty Broadcast");
1.112 +
1.113 +CPropBroadcast::CPropBroadcast(TUid aCategory, TUint aMasterKey,
1.114 + TUint aSlaveKeySlot, TUint aSlaveCount, TUint aFirstHighPriority) :
1.115 + CTestProgram(KPropBroadcastName), iCategory(aCategory), iMasterKey(aMasterKey),
1.116 + iSlaveKeySlot(aSlaveKeySlot), iSlaveCount(aSlaveCount), iFirstHighPriority(aFirstHighPriority)
1.117 + {
1.118 + }
1.119 +
1.120 +
1.121 +void CPropBroadcast::Run(TUint aCount)
1.122 + {
1.123 + RProperty mProp;
1.124 + TInt r = mProp.Define(iCategory, iMasterKey, RProperty::EInt, KPassPolicy, KPassPolicy);
1.125 + TF_ERROR(r, r == KErrNone);
1.126 + r = mProp.Attach(iCategory, iMasterKey);
1.127 + TF_ERROR(r, r == KErrNone);
1.128 +
1.129 + for (TUint j = 0; j < iSlaveCount; ++j)
1.130 + {
1.131 + CPropBroadcastSlave* slave = new CPropBroadcastSlave(this, iCategory, iMasterKey, iSlaveKeySlot + j);
1.132 + slave->Create((j < iFirstHighPriority) ? EPriorityLess : EPriorityMore);
1.133 +
1.134 + slave->iNext = iSlaveList;
1.135 + iSlaveList = slave;
1.136 + }
1.137 +
1.138 + for (TUint i = 1; i < aCount; ++i)
1.139 + {
1.140 + CPropBroadcastSlave* slave = iSlaveList;
1.141 + while (slave)
1.142 + {
1.143 + TRequestStatus status;
1.144 + slave->iProp.Subscribe(status);
1.145 + TInt value;
1.146 + r = slave->iProp.Get(value);
1.147 + TF_ERROR(r, r == KErrNone);
1.148 + if (value == (TInt) i)
1.149 + {
1.150 + slave->iProp.Cancel();
1.151 + }
1.152 + User::WaitForRequest(status);
1.153 + TF_ERROR(status.Int(), (status.Int() == KErrCancel) || (status.Int() == KErrNone));
1.154 + r = slave->iProp.Get(value);
1.155 + TF_ERROR(r, r == KErrNone);
1.156 + TF_ERROR(value, value == (TInt) i);
1.157 + slave = slave->iNext;
1.158 + }
1.159 + mProp.Set(i + 1);
1.160 + }
1.161 +
1.162 + for (;;)
1.163 + {
1.164 + CPropBroadcastSlave* slave = iSlaveList;
1.165 + if (slave == NULL) break;
1.166 + iSlaveList = slave->iNext;
1.167 + slave->Delete();
1.168 + }
1.169 +
1.170 + mProp.Delete(iCategory, iMasterKey);
1.171 + mProp.Close();
1.172 + }