--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/property/t_race.cpp Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,176 @@
+// 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"
+
+_LIT(KPropSetGetRaceName, "RProperty::Set/Get() Race");
+
+CPropSetGetRace::CPropSetGetRace(TUid aCategory, TUint aKey) :
+ CTestProgram(KPropSetGetRaceName), iCategory(aCategory), iKey(aKey),
+ iBuf1(RProperty::KMaxPropertySize), iBuf2(RProperty::KMaxPropertySize)
+ {
+ }
+
+void CPropSetGetRace::Trublemaker(TDes8& aBuf)
+ {
+ RProperty prop;
+ TInt r = prop.Attach(iCategory, iKey, EOwnerThread);
+ TF_ERROR(r, r == KErrNone);
+ TBool attached = ETrue;
+ for(;;)
+ {
+ TBuf8<RProperty::KMaxPropertySize> buf;
+ if (attached)
+ {
+ r = prop.Set(aBuf);
+ TF_ERROR(r, r == KErrNone);
+ r = prop.Get(buf);
+ TF_ERROR(r, r == KErrNone);
+ }
+ else
+ {
+ r = prop.Set(iCategory, iKey, aBuf);
+ TF_ERROR(r, r == KErrNone);
+ r = prop.Get(iCategory, iKey, buf);
+ TF_ERROR(r, r == KErrNone);
+ }
+ TF_ERROR(KErrGeneral, !(buf.Compare(iBuf1) && buf.Compare(iBuf2)));
+ User::After(1);
+ attached = !attached;
+ }
+ }
+
+TInt CPropSetGetRace::TrublemakerThreadEntry(TAny* ptr)
+ {
+ CPropSetGetRace* prog = (CPropSetGetRace*) ptr;
+ prog->Trublemaker(prog->iBuf2);
+ return KErrNone;
+ }
+
+void CPropSetGetRace::Run(TUint aCount)
+ {
+ RProperty prop;
+
+ TInt r = prop.Define(iCategory, iKey, RProperty::EByteArray, KPassPolicy, KPassPolicy);
+ TF_ERROR(r, r == KErrNone);
+ r = prop.Attach(iCategory,iKey);
+ TF_ERROR(r, r == KErrNone);
+
+ TUint i;
+ for(i = 0; i < RProperty::KMaxPropertySize; ++i)
+ {
+ iBuf1[i] = '1';
+ iBuf2[i] = '2';
+ }
+
+ TRequestStatus status;
+ RThread thr;
+ r = thr.Create(KNullDesC, TrublemakerThreadEntry, 0x2000, NULL, this);
+ TF_ERROR(r, r == KErrNone);
+ thr.Logon(status);
+ thr.SetPriority(EPriorityMore);
+ thr.Resume();
+
+ TBool attached = ETrue;
+ for (i = 0; i < aCount; ++i)
+ {
+ TBuf8<RProperty::KMaxPropertySize> buf;
+ if (attached)
+ {
+ r = prop.Set(iBuf1);
+ TF_ERROR(r, r == KErrNone);
+ r = prop.Get(buf);
+ TF_ERROR(r, r == KErrNone);
+ }
+ else
+ {
+ r = prop.Set(iCategory, iKey, iBuf1);
+ TF_ERROR(r, r == KErrNone);
+ r = prop.Get(iCategory, iKey, buf);
+ TF_ERROR(r, r == KErrNone);
+ }
+ TF_ERROR(KErrGeneral, !(buf.Compare(iBuf1) && buf.Compare(iBuf2)));
+ attached = !attached;
+ }
+
+ thr.Kill(EExitKill);
+ thr.Close();
+
+ User::WaitForRequest(status);
+ TF_ERROR(status.Int(), status.Int() == EExitKill);
+
+ prop.Delete(iCategory, iKey);
+ prop.Close();
+ }
+
+
+_LIT(KPropCancelRaceName, "RProperty::Cancel() Race");
+
+CPropCancelRace::CPropCancelRace(TUid aCategory, TUint aKey) :
+ CTestProgram(KPropCancelRaceName), iCategory(aCategory), iKey(aKey)
+ {
+ }
+
+void CPropCancelRace::Trublemaker()
+ {
+ for(;;)
+ {
+ iProp.Cancel();
+ User::After(1);
+ }
+ }
+
+TInt CPropCancelRace::TrublemakerThreadEntry(TAny* ptr)
+ {
+ CPropCancelRace* prog = (CPropCancelRace*) ptr;
+ prog->Trublemaker();
+ return KErrNone;
+ }
+
+void CPropCancelRace::Run(TUint aCount)
+ {
+ TInt r = iProp.Define(iCategory, iKey, RProperty::EInt, KPassPolicy, KPassPolicy);
+ TF_ERROR(r, r == KErrNone);
+ r = iProp.Attach(iCategory,iKey);
+ TF_ERROR(r, r == KErrNone);
+
+ TRequestStatus thrStatus;
+ RThread thr;
+ r = thr.Create(KNullDesC, TrublemakerThreadEntry, 0x2000, NULL, this);
+ TF_ERROR(r, r == KErrNone);
+ thr.Logon(thrStatus);
+ thr.SetPriority(EPriorityMore);
+ thr.Resume();
+
+ for (TUint i = 0; i < aCount; ++i)
+ {
+ TRequestStatus status;
+ iProp.Subscribe(status);
+ TInt st = status.Int();
+ TF_ERROR(st, (st == KRequestPending) || (st == KErrCancel));
+ iProp.Set(1);
+ User::WaitForRequest(status);
+ st = status.Int();
+ TF_ERROR(st, (st == KErrNone) || (st == KErrCancel));
+ }
+
+ thr.Kill(EExitKill);
+ User::WaitForRequest(thrStatus);
+ TF_ERROR(thrStatus.Int(), thrStatus.Int() == EExitKill);
+ thr.Close();
+
+ iProp.Delete(iCategory, iKey);
+ iProp.Close();
+ }