diff -r 000000000000 -r 96e5fb8b040d kerneltest/e32utils/profiler/profiler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32utils/profiler/profiler.h Thu Dec 17 09:24:54 2009 +0200 @@ -0,0 +1,142 @@ +// Copyright (c) 1998-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: +// e32utils\profiler\profiler.h +// +// WARNING: This file contains some APIs which are internal and are subject +// to change without notice. Such APIs should therefore not be used +// outside the Kernel and Hardware Services package. +// + +#ifndef __PROFILER__ +#define __PROFILER__ + +#include + + +_LIT(KProfilerName,"Profiler"); + +/** +The Profiler class provides a functional interface to the sampling profiler.

+The engine must already be running for this interface to work, this can be +achieved by executing PROFILER.EXE. The control methods are all static, and +require no other context. + +@internalTechnology +*/ +class Profiler : private RSessionBase + { +public: + enum TState {EStart, EStop, EClose, EUnload}; +public: + /** Start the sampler */ + static inline TInt Start(); + /** Stop the sampler */ + static inline TInt Stop(); + /** Release the sample trace file */ + static inline TInt Close(); + /** Unload the profile engine from memory */ + static inline TInt Unload(); +// + /** Issue a control request to the engine */ + static inline TInt Control(TState aRequest); +private: + inline Profiler(); + }; + +inline Profiler::Profiler() + {} + +inline TInt Profiler::Control(TState aRequest) +// +// Connect to the profiler engine, and issue the control request if successful +// + { + Profiler p; + TInt r = p.CreateSession(KProfilerName, TVersion(), 0); + if (r == KErrNone) + { + p.SendReceive(aRequest); + p.RSessionBase::Close(); + } + return r; + } + +inline TInt Profiler::Start() + {return Control(EStart);} + +inline TInt Profiler::Stop() + {return Control(EStop);} + +inline TInt Profiler::Close() + {return Control(EClose);} + +inline TInt Profiler::Unload() + {return Control(EUnload);} + + + +/* + * This is an internal interface to the profiling engine which allows + * an additional control DLL to be loaded, replacing the profiler's + * default console UI + */ + +/** +Implementation class providing access to the profiler engine + +@internalTechnology +*/ +class MProfilerEngine + { +public: + virtual TInt Control(Profiler::TState aCommand) =0; + virtual Profiler::TState State() const =0; + }; + +/** +The interface that the extra controller must implement to access the profiler. + +@internalTechnology +*/ +class MProfilerController + { +public: + /** Release the controller from the profiler. This is invoked when the profiler is unloading. */ + virtual void Release() =0; + /** Ask the profiler to change state */ + inline TInt Control(Profiler::TState aCommand) const; + /* Query the profiler state */ + inline Profiler::TState GetState() const; +protected: + inline MProfilerController(MProfilerEngine& aEngine); +private: + MProfilerEngine& iEngine; + }; + +/** The signature of ordinal 1 in the controller DLL */ +typedef MProfilerController* (*TProfilerControllerFactoryL)(TInt aPriority, MProfilerEngine& aEngine); + +/** The second UID required by the controller DLL */ +const TUid KUidProfilerKeys={0x1000945c}; + + +inline MProfilerController::MProfilerController(MProfilerEngine& aEngine) + :iEngine(aEngine) + {} +inline TInt MProfilerController::Control(Profiler::TState aCommand) const + {return iEngine.Control(aCommand);} +inline Profiler::TState MProfilerController::GetState() const + {return iEngine.State();} + +#endif