|
Packit |
577717 |
/*
|
|
Packit |
577717 |
|
|
Packit |
577717 |
* Copyright (c) 2008 Google, Inc.
|
|
Packit |
577717 |
* Contributed by Arun Sharma <arun.sharma@google.com>
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
Packit |
577717 |
* copy of this software and associated documentation files (the "Software"),
|
|
Packit |
577717 |
* to deal in the Software without restriction, including without limitation
|
|
Packit |
577717 |
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
Packit |
577717 |
* and/or sell copies of the Software, and to permit persons to whom the
|
|
Packit |
577717 |
* Software is furnished to do so, subject to the following conditions:
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* The above copyright notice and this permission notice shall be included
|
|
Packit |
577717 |
* in all copies or substantial portions of the Software.
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
Packit |
577717 |
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
Packit |
577717 |
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
Packit |
577717 |
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
Packit |
577717 |
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
Packit |
577717 |
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
Packit |
577717 |
* OTHER DEALINGS IN THE SOFTWARE.
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* Python Bindings for perfmon.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
%module perfmon_int
|
|
Packit |
577717 |
%{
|
|
Packit |
577717 |
#include <perfmon/perfmon.h>
|
|
Packit |
577717 |
#include <perfmon/pfmlib.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static PyObject *libpfm_err;
|
|
Packit |
577717 |
%}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
%include "carrays.i"
|
|
Packit |
577717 |
%include "cstring.i"
|
|
Packit |
577717 |
%include <stdint.i>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Some typemaps for corner cases SWIG can't handle */
|
|
Packit |
577717 |
/* Convert from Python --> C */
|
|
Packit |
577717 |
%typemap(memberin) pfmlib_event_t[ANY] {
|
|
Packit |
577717 |
int i;
|
|
Packit |
577717 |
for (i = 0; i < $1_dim0; i++) {
|
|
Packit |
577717 |
$1[i] = $input[i];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
%typemap(out) pfmlib_event_t[ANY] {
|
|
Packit |
577717 |
int len, i;
|
|
Packit |
577717 |
len = $1_dim0;
|
|
Packit |
577717 |
$result = PyList_New(len);
|
|
Packit |
577717 |
for (i = 0; i < len; i++) {
|
|
Packit |
577717 |
PyObject *o = SWIG_NewPointerObj(SWIG_as_voidptr(&$1[i]),
|
|
Packit |
577717 |
SWIGTYPE_p_pfmlib_event_t, 0 | 0 );
|
|
Packit |
577717 |
PyList_SetItem($result, i, o);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Convert from Python --> C */
|
|
Packit |
577717 |
%typemap(memberin) pfmlib_reg_t[ANY] {
|
|
Packit |
577717 |
int i;
|
|
Packit |
577717 |
for (i = 0; i < $1_dim0; i++) {
|
|
Packit |
577717 |
$1[i] = $input[i];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
%typemap(out) pfmlib_reg_t[ANY] {
|
|
Packit |
577717 |
int len, i;
|
|
Packit |
577717 |
len = $1_dim0;
|
|
Packit |
577717 |
$result = PyList_New(len);
|
|
Packit |
577717 |
for (i = 0; i < len; i++) {
|
|
Packit |
577717 |
PyObject *o = SWIG_NewPointerObj(SWIG_as_voidptr(&$1[i]),
|
|
Packit |
577717 |
SWIGTYPE_p_pfmlib_reg_t, 0 | 0 );
|
|
Packit |
577717 |
PyList_SetItem($result, i, o);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Convert libpfm errors into exceptions */
|
|
Packit |
577717 |
%typemap(out) os_err_t {
|
|
Packit |
577717 |
if (result == -1) {
|
|
Packit |
577717 |
PyErr_SetFromErrno(PyExc_OSError);
|
|
Packit |
577717 |
SWIG_fail;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
resultobj = SWIG_From_int((int)(result));
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
%typemap(out) pfm_err_t {
|
|
Packit |
577717 |
if (result != PFMLIB_SUCCESS) {
|
|
Packit |
577717 |
PyObject *obj = Py_BuildValue("(i,s)", result,
|
|
Packit |
577717 |
pfm_strerror(result));
|
|
Packit |
577717 |
PyErr_SetObject(libpfm_err, obj);
|
|
Packit |
577717 |
SWIG_fail;
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
PyErr_Clear();
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
resultobj = SWIG_From_int((int)(result));
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Convert libpfm errors into exceptions */
|
|
Packit |
577717 |
%typemap(out) os_err_t {
|
|
Packit |
577717 |
if (result == -1) {
|
|
Packit |
577717 |
PyErr_SetFromErrno(PyExc_OSError);
|
|
Packit |
577717 |
SWIG_fail;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
resultobj = SWIG_From_int((int)(result));
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
%typemap(out) pfm_err_t {
|
|
Packit |
577717 |
if (result != PFMLIB_SUCCESS) {
|
|
Packit |
577717 |
PyObject *obj = Py_BuildValue("(i,s)", result,
|
|
Packit |
577717 |
pfm_strerror(result));
|
|
Packit |
577717 |
PyErr_SetObject(libpfm_err, obj);
|
|
Packit |
577717 |
SWIG_fail;
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
PyErr_Clear();
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
resultobj = SWIG_From_int((int)(result));
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
%cstring_output_maxsize(char *name, size_t maxlen)
|
|
Packit |
577717 |
%cstring_output_maxsize(char *name, int maxlen)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
%extend pfmlib_regmask_t {
|
|
Packit |
577717 |
unsigned int weight() {
|
|
Packit |
577717 |
unsigned int w = 0;
|
|
Packit |
577717 |
pfm_regmask_weight($self, &w);
|
|
Packit |
577717 |
return w;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Kernel interface */
|
|
Packit |
577717 |
%include <perfmon/perfmon.h>
|
|
Packit |
577717 |
%array_class(pfarg_pmc_t, pmc)
|
|
Packit |
577717 |
%array_class(pfarg_pmd_t, pmd)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Library interface */
|
|
Packit |
577717 |
%include <perfmon/pfmlib.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
%extend pfarg_ctx_t {
|
|
Packit |
577717 |
void zero() {
|
|
Packit |
577717 |
memset(self, 0, sizeof(self));
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
%extend pfarg_load_t {
|
|
Packit |
577717 |
void zero() {
|
|
Packit |
577717 |
memset(self, 0, sizeof(self));
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
%init %{
|
|
Packit |
577717 |
libpfm_err = PyErr_NewException("perfmon.libpfmError", NULL, NULL);
|
|
Packit |
577717 |
PyDict_SetItemString(d, "libpfmError", libpfm_err);
|
|
Packit |
577717 |
%}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
%inline %{
|
|
Packit |
577717 |
/* Helper functions to avoid pointer classes */
|
|
Packit |
577717 |
int pfm_py_get_pmu_type(void) {
|
|
Packit |
577717 |
int tmp = -1;
|
|
Packit |
577717 |
pfm_get_pmu_type(&tmp);
|
|
Packit |
577717 |
return tmp;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
unsigned int pfm_py_get_hw_counter_width(void) {
|
|
Packit |
577717 |
unsigned int tmp = 0;
|
|
Packit |
577717 |
pfm_get_hw_counter_width(&tmp);
|
|
Packit |
577717 |
return tmp;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
unsigned int pfm_py_get_num_events(void) {
|
|
Packit |
577717 |
unsigned int tmp = 0;
|
|
Packit |
577717 |
pfm_get_num_events(&tmp);
|
|
Packit |
577717 |
return tmp;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int pfm_py_get_event_code(int idx) {
|
|
Packit |
577717 |
int tmp = 0;
|
|
Packit |
577717 |
pfm_get_event_code(idx, &tmp);
|
|
Packit |
577717 |
return tmp;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
unsigned int pfm_py_get_num_event_masks(int idx) {
|
|
Packit |
577717 |
unsigned int tmp = 0;
|
|
Packit |
577717 |
pfm_get_num_event_masks(idx, &tmp);
|
|
Packit |
577717 |
return tmp;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
unsigned int pfm_py_get_event_mask_code(int idx, int i) {
|
|
Packit |
577717 |
unsigned int tmp = 0;
|
|
Packit |
577717 |
pfm_get_event_mask_code(idx, i, &tmp);
|
|
Packit |
577717 |
return tmp;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define PFMON_MAX_EVTNAME_LEN 128
|
|
Packit |
577717 |
|
|
Packit |
577717 |
PyObject *pfm_py_get_event_name(int idx) {
|
|
Packit |
577717 |
char name[PFMON_MAX_EVTNAME_LEN];
|
|
Packit |
577717 |
|
|
Packit |
577717 |
pfm_get_event_name(idx, name, PFMON_MAX_EVTNAME_LEN);
|
|
Packit |
577717 |
return PyString_FromString(name);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
PyObject *pfm_py_get_event_mask_name(int idx, int i) {
|
|
Packit |
577717 |
char name[PFMON_MAX_EVTNAME_LEN];
|
|
Packit |
577717 |
|
|
Packit |
577717 |
pfm_get_event_mask_name(idx, i, name, PFMON_MAX_EVTNAME_LEN);
|
|
Packit |
577717 |
return PyString_FromString(name);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
PyObject *pfm_py_get_event_description(int idx) {
|
|
Packit |
577717 |
char *desc;
|
|
Packit |
577717 |
PyObject *ret;
|
|
Packit |
577717 |
pfm_get_event_description(idx, &desc);
|
|
Packit |
577717 |
ret = PyString_FromString(desc);
|
|
Packit |
577717 |
free(desc);
|
|
Packit |
577717 |
return ret;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
PyObject *pfm_py_get_event_mask_description(int idx, int i) {
|
|
Packit |
577717 |
char *desc;
|
|
Packit |
577717 |
PyObject *ret;
|
|
Packit |
577717 |
pfm_get_event_mask_description(idx, i, &desc);
|
|
Packit |
577717 |
ret = PyString_FromString(desc);
|
|
Packit |
577717 |
free(desc);
|
|
Packit |
577717 |
return ret;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
%}
|