1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Context.c. Python interfaces for perf script. 4 * 5 * Copyright (C) 2010 Tom Zanussi <tzanussi@gmail.com> 6 */ 7 8 #include <Python.h> 9 #include "../../../perf.h" 10 #include "../../../util/trace-event.h" 11 12 #if PY_MAJOR_VERSION < 3 13 #define _PyCapsule_GetPointer(arg1, arg2) \ 14 PyCObject_AsVoidPtr(arg1) 15 16 PyMODINIT_FUNC initperf_trace_context(void); 17 #else 18 #define _PyCapsule_GetPointer(arg1, arg2) \ 19 PyCapsule_GetPointer((arg1), (arg2)) 20 21 PyMODINIT_FUNC PyInit_perf_trace_context(void); 22 #endif 23 24 static PyObject *perf_trace_context_common_pc(PyObject *obj, PyObject *args) 25 { 26 static struct scripting_context *scripting_context; 27 PyObject *context; 28 int retval; 29 30 if (!PyArg_ParseTuple(args, "O", &context)) 31 return NULL; 32 33 scripting_context = _PyCapsule_GetPointer(context, NULL); 34 retval = common_pc(scripting_context); 35 36 return Py_BuildValue("i", retval); 37 } 38 39 static PyObject *perf_trace_context_common_flags(PyObject *obj, 40 PyObject *args) 41 { 42 static struct scripting_context *scripting_context; 43 PyObject *context; 44 int retval; 45 46 if (!PyArg_ParseTuple(args, "O", &context)) 47 return NULL; 48 49 scripting_context = _PyCapsule_GetPointer(context, NULL); 50 retval = common_flags(scripting_context); 51 52 return Py_BuildValue("i", retval); 53 } 54 55 static PyObject *perf_trace_context_common_lock_depth(PyObject *obj, 56 PyObject *args) 57 { 58 static struct scripting_context *scripting_context; 59 PyObject *context; 60 int retval; 61 62 if (!PyArg_ParseTuple(args, "O", &context)) 63 return NULL; 64 65 scripting_context = _PyCapsule_GetPointer(context, NULL); 66 retval = common_lock_depth(scripting_context); 67 68 return Py_BuildValue("i", retval); 69 } 70 71 static PyMethodDef ContextMethods[] = { 72 { "common_pc", perf_trace_context_common_pc, METH_VARARGS, 73 "Get the common preempt count event field value."}, 74 { "common_flags", perf_trace_context_common_flags, METH_VARARGS, 75 "Get the common flags event field value."}, 76 { "common_lock_depth", perf_trace_context_common_lock_depth, 77 METH_VARARGS, "Get the common lock depth event field value."}, 78 { NULL, NULL, 0, NULL} 79 }; 80 81 #if PY_MAJOR_VERSION < 3 82 PyMODINIT_FUNC initperf_trace_context(void) 83 { 84 (void) Py_InitModule("perf_trace_context", ContextMethods); 85 } 86 #else 87 PyMODINIT_FUNC PyInit_perf_trace_context(void) 88 { 89 static struct PyModuleDef moduledef = { 90 PyModuleDef_HEAD_INIT, 91 "perf_trace_context", /* m_name */ 92 "", /* m_doc */ 93 -1, /* m_size */ 94 ContextMethods, /* m_methods */ 95 NULL, /* m_reload */ 96 NULL, /* m_traverse */ 97 NULL, /* m_clear */ 98 NULL, /* m_free */ 99 }; 100 return PyModule_Create(&moduledef); 101 } 102 #endif 103