commands/top/sampler.h
changeset 0 7f656887cf89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commands/top/sampler.h	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,156 @@
+// sampler.h
+// 
+// Copyright (c) 1999 - 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+
+#ifndef __SAMPLER_H__
+#define __SAMPLER_H__
+
+#include <e32cmn.h>
+#ifndef __KERNEL_MODE__
+#include <e32std.h>
+#endif
+
+//Uncomment this line to generate debug logging of the profiler and sampler.
+//#define DEBUG_PROFILER(f) f
+#define DEBUG_PROFILER(f)
+
+/**
+ * The user device driver class for controlling the sampler.
+ */
+class RSampler : public RBusLogicalChannel
+	{
+	friend class DProfile;
+private:
+	enum TControl
+		{
+		EControlGetSegments,
+		EControlStartProfile,
+		EControlStopProfile,
+		EControlResetProfile,
+		EControlResetSegments,
+		EControlDrain,
+		EControlGetErrors
+		};
+	enum TRequest
+		{
+		ERequestRead
+		};
+	static inline TInt CancelRequest(TRequest aRequest);
+public:
+#ifndef __KERNEL_MODE__
+	/** Open a channel to the sampling device */
+	inline TInt Open();
+	/** Get the current non-XIP Code Segments*/
+	inline void GetSegments(TDes8& aData);
+	/** Start sampling */
+	inline void Start(TInt aRate);
+	/** Stop sampling */
+	inline void Stop();
+	/** Extract the sample data */
+	inline void Read(TDes8& aData,TRequestStatus& aStatus);
+	/** Cancel a read request */
+	inline void ReadCancel();
+	/** Extract any remaining sample data */
+	inline void Drain(TDes8& aData);
+	/** Get error report */
+	inline void GetErrors(TDes8& aData);
+	/** Reset the sampler for a new run */
+	inline void Reset(TBool aXIPOnly);
+	/** Initialise non-XIP segments for a new run */
+	inline void ResetSegments();
+#endif
+	};
+
+_LIT(KSamplerName,"topsampler");
+
+#ifndef __KERNEL_MODE__
+inline TInt RSampler::CancelRequest(TRequest aRequest)
+	{return 1<<aRequest;}
+
+inline TInt RSampler::Open()
+	{return DoCreate(KSamplerName,TVersion(1,0,0),KNullUnit,NULL,NULL);}
+
+/**
+ * Get the existing non-XIP Code Segments.
+ *
+ * @param aData	A descriptor to receive data. Returns as zero-length if all data 
+ * records are already transfered.
+ */
+inline void RSampler::GetSegments(TDes8& aData)
+	{DoControl(EControlGetSegments, &aData);}
+
+/**
+ * Start sampling at the requested rate. If currently sampling, this will just
+ * change the sample rate.
+ *
+ * @param aRate The sample rate in samples/second
+ */
+inline void RSampler::Start(TInt aRate)
+	{DoControl(EControlStartProfile, reinterpret_cast<TAny*>(aRate));}
+
+/**
+ * Stop sampling. If currently sampling, any outstanding read request will be completed
+ * with data remaining in the buffer.
+ */
+inline void RSampler::Stop()
+	{DoControl(EControlStopProfile);}
+
+/**
+ * Reset the sampler. All sample data is discarded and history is removed, preparing the
+ * sampler for a new run. The sampler must be stopped before it can be reset.
+ *
+ * @param aXIPOnly True if the profiler runs in XIPOnly mode.
+ */
+inline void RSampler::Reset(TBool aXIPOnly)
+	{DoControl(EControlResetProfile,(TAny*)aXIPOnly);}
+
+/**
+* Reset non-XIP code segments, preparing the sampler for a new run
+*/
+inline void RSampler::ResetSegments()
+	{DoControl(EControlResetSegments);}
+
+/**
+ * Extract the sample data from the device. This will complete when the device's buffer is
+ * full, when the provided descriptor is full, or when the sampler is stopped.
+ *
+ * @param aData		A descriptor to receive the sample data
+ * @param aStatus	A request status used to signal when this request is completed
+ */
+inline void RSampler::Read(TDes8& aData,TRequestStatus& aStatus)
+	{DoRequest(ERequestRead,aStatus,&aData);}
+
+/**
+ * Cancel the outstanding read request
+ */
+inline void RSampler::ReadCancel()
+	{DoCancel(CancelRequest(ERequestRead));}
+
+/**
+ * Extract any remaining sample data from the device buffer. When the buffer is
+ * empty, the descriptor will be empty on return.
+ *
+ * @param aData	A descriptor to receive the sample data
+ */
+inline void RSampler::Drain(TDes8& aData)
+	{DoControl(EControlDrain,&aData);}
+
+/**
+ * Get error report from the sampler.
+ *
+ * @param aData		A descriptor to receive error report
+ */
+inline void RSampler::GetErrors(TDes8& aData)
+	{DoControl(EControlGetErrors,&aData);}
+
+#endif
+
+#endif