/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * The contents of this file are subject to the Netscape Public License * Version 1.0 (the "NPL"); you may not use this file except in * compliance with the NPL. You may obtain a copy of the NPL at * http://www.mozilla.org/NPL/ * * Software distributed under the NPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL * for the specific language governing rights and limitations under the * NPL. * * The Initial Developer of this code under the NPL is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All Rights * Reserved. */ #ifndef timing_h__ #define timing_h__ #include "prtypes.h" #include "prtime.h" PR_BEGIN_EXTERN_C /** * Write a timing message to the timing log module, using * printf() formatting. The message will be pre-pended with * thread and timing information. Do not use this function directly; * rather, use the TIMING_MSG() macro, below. *
* This is based on NSPR2.0 logging, so it is not necessary to * terminate messages with a newline. * * @fmtstr The printf()-style format string. */ PR_EXTERN(void) TimingWriteMessage(const char* fmtstr, ...); /** * Queries whether the timing log is currently enabled. * * @return PR_TRUE if the timing log is currently enabled. */ PR_EXTERN(PRBool) TimingIsEnabled(void); /** * Sets the timing log's state. * * @param enabled PR_TRUE to enable, PR_FALSE to * disable. */ PR_EXTERN(void) TimingSetEnabled(PRBool enabled); /** * Start a unique "clock" with the given name. If the clock already * exists, this call will not re-start it. * * @param clock A C-string name for the clock. */ PR_EXTERN(void) TimingStartClock(const char* clock); /** * Stop the "clock" with the given name, returning the elapsed * time in result. This destroys the clock. *
* If the clock has already been stopped, this call will have * no effect. * * @param result If successful, returns the time recorded on * the clock (in microseconds). * @param clock The C-string name of the clock to stop. * @return PR_TRUE if the clock exists, was running, * and was successfully stopped. */ PR_EXTERN(PRBool) TimingStopClock(PRTime* result, const char* clock); /** * Return PR_TRUE if the clock with the specified * name exists and is running. */ PR_EXTERN(PRBool) TimingIsClockRunning(const char* clock); /** * Convert an elapsed time into a human-readable string. * * @param time An elapsed PRTime value. * @param buffer The buffer to use for conversion. * @param size The size of buffer. * @return A pointer to buffer. */ PR_EXTERN(char*) TimingElapsedTimeToString(PRTime time, char* buffer, PRUint32 size); PR_END_EXTERN_C #if defined(NO_TIMING) #define TIMING_MESSAGE(args) ((void) 0) #define TIMING_STARTCLOCK_NAME(op, name) ((void) 0) #define TIMING_STOPCLOCK_NAME(op, name, cx, msg) ((void) 0) #define TIMING_STARTCLOCK_OBJECT(op, obj) ((void) 0) #define TIMING_STOPCLOCK_OBJECT(op, obj, cx, msg) ((void) 0) #else /* !defined(NO_TIMING) */ /** * Use this macro to log timing information. It uses the * "double-parens" hack to allow you to pass arbitrarily formatted * strings; e.g., * *
* TIMING_MESSAGE(("cache,%s,not found", url->address));
*
*/
#define TIMING_MESSAGE(args) TimingWriteMessage args
/**
* Use this macro to start a "clock" on an object using a pointer
* to the object; e.g.,
*
*
* TIMING_STARTCLOCK_OBJECT("http:request", URL_s);
*
*
* The clock should be uniquely identified by the op and
* obj parameters.
*
* @param op A C-string that is the "operation" that is being
* performed.
* @param obj A pointer to an object.
*/
#define TIMING_STARTCLOCK_OBJECT(op, obj) \
do {\
char buf[256];\
PR_snprintf(buf, sizeof(buf), "%s,%08x", op, obj);\
TimingStartClock(buf);\
} while (0)
/**
* Use this macro to stop a "clock" on an object and print out
* a message that indicates the total elapsed time on the clock;
* e.g.,
*
*
* TIMING_STOPCLOCK_OBJECT("http:request", URL_s, "ok");
*
*
* The op and obj parameters are used to
* identify the clock to stop.
*
* @param op A C-string that is the "operation" that is being
* performed.
* @param obj A pointer to an object.
* @param cx A pointer to the MWContext.
* @param msg A message to include in the log entry.
*/
#define TIMING_STOPCLOCK_OBJECT(op, obj, cx, msg) \
do {\
char buf[256];\
PR_snprintf(buf, sizeof(buf), "%s,%08x", op, obj);\
if (TimingIsClockRunning(buf)) {\
PRTime tmElapsed;\
PRUint32 nElapsed;\
TimingStopClock(&tmElapsed, buf);\
LL_L2UI(nElapsed, tmElapsed);\
TimingWriteMessage("clock,%s,%ld,%08x,%s",\
buf, nElapsed, cx, msg);\
}\
} while (0)
/**
* Use this macro to start a "clock" on a "named" operation; e.g.,
*
*
* TIMING_STARTCLOCK_NAME("http:request", "http://www.cnn.com");
*
*
* The clock should be uniquely identified by the op and
* name parameters.
*
* @param op A C-string identifying the operation that is being
* performed.
* @param name A C-string that is the name for the timer.
*/
#define TIMING_STARTCLOCK_NAME(op, name) \
do {\
char buf[256];\
PR_snprintf(buf, sizeof(buf), "%s,%.64s", op, name);\
TimingStartClock(buf);\
} while (0)
/**
* Use this macro to stop a "clock" on a "named operation" and print out
* a message that indicates the total elapsed time on the clock;
* e.g.,
*
*
* TIMING_STOPCLOCK_NAME("http:request", "http://www.cnn.com", "ok");
*
*
* The op and name parameters are used to
* identify the clock to stop.
*
* @param op A C-string that is the "operation" that is being
* performed.
* @param name A C-string that is the name for the timer.
* @param msg A message to include in the log entry.
*/
#define TIMING_STOPCLOCK_NAME(op, name, cx, msg) \
do {\
char buf[256];\
PR_snprintf(buf, sizeof(buf), "%s,%.64s", op, name);\
if (TimingIsClockRunning(buf)) {\
PRTime tmElapsed;\
PRUint32 nElapsed;\
TimingStopClock(&tmElapsed, buf);\
LL_L2UI(nElapsed, tmElapsed);\
TimingWriteMessage("clock,%s,%ld,%08x,%s",\
buf, nElapsed, cx, msg);\
}\
} while (0)
#endif /* !defined(NO_TIMING) */
#endif /* timing_h__ */