diff -r 000000000000 -r a41df078684a kerneltest/e32test/property/t_broadcast.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/property/t_broadcast.cpp Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,169 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include "t_property.h" + +class CPropBroadcastSlave : public CBase + { +public: + static TInt LoopThreadEntry(TAny*); + + CPropBroadcastSlave(CPropBroadcast* aProg, TUid aCategory, TUint aMasterKey, TUint aSlaveKey); + void Create(TThreadPriority); + void Delete(); + void Loop(); + + CPropBroadcast* iProg; + TUid iCategory; + TUint iMasterKey; + TUint iSlaveKey; + + RProperty iProp; + RThread iThread; + TRequestStatus iStatus; + + CPropBroadcastSlave* iNext; + }; + + + +CPropBroadcastSlave::CPropBroadcastSlave(CPropBroadcast* aProg, TUid aCategory, TUint aMasterKey, TUint aSlaveKey) : + iProg(aProg), iCategory(aCategory), iMasterKey(aMasterKey), iSlaveKey(aSlaveKey) + { + } + +void CPropBroadcastSlave::Create(TThreadPriority aPrio) + { + TInt r = iProp.Define(iCategory, iSlaveKey, RProperty::EInt, KPassPolicy, KPassPolicy); + TF_ERROR_PROG(iProg, r, r == KErrNone); + r = iProp.Attach(iCategory, iSlaveKey); + TF_ERROR_PROG(iProg, r, r == KErrNone); + + r = iThread.Create(KNullDesC, LoopThreadEntry, 0x2000, NULL, this); + TF_ERROR_PROG(iProg, r, r == KErrNone); + iThread.Logon(iStatus); + iThread.SetPriority(aPrio); + iThread.Resume(); + } + +void CPropBroadcastSlave::Delete() + { + iThread.Kill(EExitKill); + iThread.Close(); + User::WaitForRequest(iStatus); + TF_ERROR_PROG(iProg, iStatus.Int(), iStatus.Int() == EExitKill); + + TInt r = iProp.Delete(iCategory, iSlaveKey); + TF_ERROR_PROG(iProg, r, r == KErrNone); + iProp.Close(); + + delete this; + } + +TInt CPropBroadcastSlave::LoopThreadEntry(TAny* ptr) + { + CPropBroadcastSlave* self = (CPropBroadcastSlave*) ptr; + self->Loop(); + return KErrNone; + } + +void CPropBroadcastSlave::Loop() + { + RProperty mProp; + TInt r = mProp.Attach(iCategory, iMasterKey, EOwnerThread); + TF_ERROR_PROG(iProg, r, r == KErrNone); + + RProperty sProp; + r = sProp.Attach(iCategory, iSlaveKey, EOwnerThread); + TF_ERROR_PROG(iProg, r, r == KErrNone); + + TInt value = 1; + for(;;) + { + TRequestStatus status; + mProp.Subscribe(status); + + r = sProp.Set(value); + TF_ERROR_PROG(iProg, r, r == KErrNone); + + User::WaitForRequest(status); + + r = mProp.Get(value); + TF_ERROR_PROG(iProg, r, r == KErrNone); + } + } + +_LIT(KPropBroadcastName, "RProperty Broadcast"); + +CPropBroadcast::CPropBroadcast(TUid aCategory, TUint aMasterKey, + TUint aSlaveKeySlot, TUint aSlaveCount, TUint aFirstHighPriority) : + CTestProgram(KPropBroadcastName), iCategory(aCategory), iMasterKey(aMasterKey), + iSlaveKeySlot(aSlaveKeySlot), iSlaveCount(aSlaveCount), iFirstHighPriority(aFirstHighPriority) + { + } + + +void CPropBroadcast::Run(TUint aCount) + { + RProperty mProp; + TInt r = mProp.Define(iCategory, iMasterKey, RProperty::EInt, KPassPolicy, KPassPolicy); + TF_ERROR(r, r == KErrNone); + r = mProp.Attach(iCategory, iMasterKey); + TF_ERROR(r, r == KErrNone); + + for (TUint j = 0; j < iSlaveCount; ++j) + { + CPropBroadcastSlave* slave = new CPropBroadcastSlave(this, iCategory, iMasterKey, iSlaveKeySlot + j); + slave->Create((j < iFirstHighPriority) ? EPriorityLess : EPriorityMore); + + slave->iNext = iSlaveList; + iSlaveList = slave; + } + + for (TUint i = 1; i < aCount; ++i) + { + CPropBroadcastSlave* slave = iSlaveList; + while (slave) + { + TRequestStatus status; + slave->iProp.Subscribe(status); + TInt value; + r = slave->iProp.Get(value); + TF_ERROR(r, r == KErrNone); + if (value == (TInt) i) + { + slave->iProp.Cancel(); + } + User::WaitForRequest(status); + TF_ERROR(status.Int(), (status.Int() == KErrCancel) || (status.Int() == KErrNone)); + r = slave->iProp.Get(value); + TF_ERROR(r, r == KErrNone); + TF_ERROR(value, value == (TInt) i); + slave = slave->iNext; + } + mProp.Set(i + 1); + } + + for (;;) + { + CPropBroadcastSlave* slave = iSlaveList; + if (slave == NULL) break; + iSlaveList = slave->iNext; + slave->Delete(); + } + + mProp.Delete(iCategory, iMasterKey); + mProp.Close(); + }