/* * * Copyright (c) 2008 Google, Inc. * Contributed by Arun Sharma * * 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 #define SWIG #include #include #include static PyObject *libpfm_err; %} %include "typemaps.i" %include "carrays.i" %include "cstring.i" %include /* 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 ptr_argout(perf_event_attr_t); /* Library interface */ /* We never set the const char * members. So no memory leak */ #pragma SWIG nowarn=451 %include /* 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); %}