/*
*
* Copyright (c) 2008 Google, Inc.
* Contributed by Arun Sharma <arun.sharma@google.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* Python Bindings for perfmon.
*/
%module perfmon_int
%{
#include <unistd.h>
#define SWIG
#include <perfmon/pfmlib.h>
#include <perfmon/perf_event.h>
#include <perfmon/pfmlib_perf_event.h>
static PyObject *libpfm_err;
%}
%include "typemaps.i"
%include "carrays.i"
%include "cstring.i"
%include <stdint.i>
/* Convert libpfm errors into exceptions */
%typemap(out) os_err_t {
if (result == -1) {
PyErr_SetFromErrno(PyExc_OSError);
SWIG_fail;
}
resultobj = SWIG_From_int((int)(result));
};
%typemap(out) pfm_err_t {
if (result != PFM_SUCCESS) {
PyObject *obj = Py_BuildValue("(i,s)", result,
pfm_strerror(result));
PyErr_SetObject(libpfm_err, obj);
SWIG_fail;
} else {
PyErr_Clear();
}
resultobj = SWIG_From_int((int)(result));
}
/* Generic return structures via pointer output arguments */
%define ptr_argout(T)
%typemap(argout) T* output {
if (!PyTuple_Check($result)) {
PyObject *x = $result;
$result = PyTuple_New(1);
PyTuple_SET_ITEM($result, 0, x);
}
PyObject *o = SWIG_NewPointerObj((void *)$1, $descriptor, 0);
$result = SWIG_AppendOutput($result, o);
}
%typemap(in, numinputs=0) T* output {
$1 = (T*) malloc(sizeof(T));
memset($1, 0, sizeof(T));
}
%extend T {
~T() {
free(self);
}
}
%enddef
ptr_argout(pfm_pmu_info_t);
ptr_argout(pfm_event_info_t);
ptr_argout(pfm_event_attr_info_t);
%typedef int pid_t;
/* Kernel interface */
%include <perfmon/perf_event.h>
ptr_argout(perf_event_attr_t);
/* Library interface */
/* We never set the const char * members. So no memory leak */
#pragma SWIG nowarn=451
%include <perfmon/pfmlib.h>
/* OS specific library interface */
extern pfm_err_t pfm_get_perf_event_encoding(const char *str,
int dfl_plm,
perf_event_attr_t *output,
char **fstr,
int *idx);
%init %{
libpfm_err = PyErr_NewException("perfmon.libpfmError", NULL, NULL);
PyDict_SetItemString(d, "libpfmError", libpfm_err);
%}