|
Packit |
577717 |
/* $Id: global.c,v 1.11 2004/05/13 23:35:27 mikpe Exp $
|
|
Packit |
577717 |
* Library interface to global-mode performance counters.
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* Copyright (C) 1999-2004 Mikael Pettersson
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <stdlib.h>
|
|
Packit |
577717 |
#include <unistd.h>
|
|
Packit |
577717 |
#include <fcntl.h>
|
|
Packit |
577717 |
#include "libperfctr.h"
|
|
Packit |
577717 |
#include "marshal.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
struct gperfctr { /* XXX: kill this struct */
|
|
Packit |
577717 |
int fd;
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
struct gperfctr *gperfctr_open(void)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
struct gperfctr *gperfctr;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
gperfctr = malloc(sizeof(*gperfctr));
|
|
Packit |
577717 |
if( gperfctr ) {
|
|
Packit |
577717 |
gperfctr->fd = -1;
|
|
Packit |
577717 |
if( 1 || gperfctr->fd >= 0 ) {
|
|
Packit |
577717 |
if( perfctr_abi_check_fd(gperfctr->fd) >= 0 )
|
|
Packit |
577717 |
return gperfctr;
|
|
Packit |
577717 |
close(gperfctr->fd);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
free(gperfctr);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
return NULL;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
void gperfctr_close(struct gperfctr *gperfctr)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
close(gperfctr->fd);
|
|
Packit |
577717 |
free(gperfctr);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int gperfctr_control(const struct gperfctr *gperfctr,
|
|
Packit |
577717 |
struct gperfctr_cpu_control *arg)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return perfctr_sys_w(gperfctr->fd, GPERFCTR_CONTROL, arg,
|
|
Packit |
577717 |
&gperfctr_cpu_control_sdesc);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int gperfctr_read(const struct gperfctr *gperfctr, struct gperfctr_cpu_state *arg)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return perfctr_sys_wr(gperfctr->fd, GPERFCTR_READ, arg,
|
|
Packit |
577717 |
&gperfctr_cpu_state_only_cpu_sdesc,
|
|
Packit |
577717 |
&gperfctr_cpu_state_sdesc);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int gperfctr_stop(const struct gperfctr *gperfctr)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return _sys_perfctr(GPERFCTR_STOP, gperfctr->fd, 0);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int gperfctr_start(const struct gperfctr *gperfctr, unsigned int interval_usec)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return _sys_perfctr(GPERFCTR_START, gperfctr->fd, (void*)(long)interval_usec);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int gperfctr_info(const struct gperfctr *gperfctr, struct perfctr_info *info)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return perfctr_info(gperfctr->fd, info);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
struct perfctr_cpus_info *gperfctr_cpus_info(const struct gperfctr *gperfctr)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return perfctr_cpus_info(gperfctr->fd);
|
|
Packit |
577717 |
}
|