CPC_COUNT_USR_EVENTS(3CPC) CPU Performance Counters Library Functions
NAME
cpc_count_usr_events, cpc_count_sys_events - enable and disable
performance counters
SYNOPSIS
cc [
flag... ]
file... -lcpc [
library... ]
#include <libcpc.h>
int cpc_count_usr_events(
int enable);
int cpc_count_sys_events(
int enable);
DESCRIPTION
In certain applications, it can be useful to explicitly enable and
disable performance counters at different times so that the
performance of a critical algorithm can be examined. The
cpc_count_usr_events() function can be used to control whether events
are counted on behalf of the application running in user mode, while
cpc_count_sys_events() can be used to control whether events are
counted on behalf of the application while it is running in the
kernel, without otherwise disturbing the binding of events to the
invoking LWP. If the
enable argument is non-zero, counting of events
is enabled, otherwise they are disabled.
RETURN VALUES
Upon successful completion,
cpc_count_usr_events() and
cpc_count_sys_events() return
0. Otherwise, the functions return
-1 and set
errno to indicate the error.
ERRORS
The
cpc_count_usr_events() and
cpc_count_sys_events() functions will
fail if:
EAGAIN The associated performance counter context has been
invalidated by another process.
EINVAL No performance counter context has been created, or an
attempt was made to enable system events while delivering
counter overflow signals.
EXAMPLES
Example 1: Use cpc_count_usr_events() to minimize code needed by
application.
In this example, the routine
cpc_count_usr_events() is used to
minimize the amount of code that needs to be added to the
application. The
cputrack(1) command can be used in conjunction with
these interfaces to provide event programming, sampling, and
reporting facilities.
If the application is instrumented in this way and then started by
cputrack with the
nouser flag set in the event specification,
counting of user events will only be enabled around the critical code
section of interest. If the program is run normally, no harm will
ensue.
int have_counters = 0;
int
main(int argc, char *argv[])
{
if (cpc_version(CPC_VER_CURRENT) == CPC_VER_CURRENT &&
cpc_getcpuver() != -1 && cpc_access() == 0)
have_counters = 1;
/* ... other application code */
if (have_counters)
(void)
cpc_count_usr_events(1);
/* ==> Code to be measured goes here <== */
if (have_counters)
(void) cpc_count_usr_events(0);
/* ... other application code */
}
ATTRIBUTES
See
attributes(7) for descriptions of the following attributes:
+--------------------+-----------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+--------------------+-----------------+
|MT-Level | MT-Safe |
+--------------------+-----------------+
|Interface Stability | Obsolete |
+--------------------+-----------------+
SEE ALSO
cputrack(1),
cpc(3CPC),
cpc_access(3CPC),
cpc_bind_event(3CPC),
cpc_enable(3CPC),
cpc_getcpuver(3CPC),
cpc_pctx_bind_event(3CPC),
cpc_version(3CPC),
libcpc(3LIB),
attributes(7)NOTES
The
cpc_count_usr_events() and
cpc_count_sys_events() functions exist
for binary compatibility only. Source containing these functions will
not compile. These functions are obsolete and might be removed in a
future release. Applications should use
cpc_enable(3CPC) instead.
March 28, 2005 CPC_COUNT_USR_EVENTS(3CPC)