18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Context.c. Python interfaces for perf script. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2010 Tom Zanussi <tzanussi@gmail.com> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <Python.h> 98c2ecf20Sopenharmony_ci#include "../../../util/trace-event.h" 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#if PY_MAJOR_VERSION < 3 128c2ecf20Sopenharmony_ci#define _PyCapsule_GetPointer(arg1, arg2) \ 138c2ecf20Sopenharmony_ci PyCObject_AsVoidPtr(arg1) 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ciPyMODINIT_FUNC initperf_trace_context(void); 168c2ecf20Sopenharmony_ci#else 178c2ecf20Sopenharmony_ci#define _PyCapsule_GetPointer(arg1, arg2) \ 188c2ecf20Sopenharmony_ci PyCapsule_GetPointer((arg1), (arg2)) 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ciPyMODINIT_FUNC PyInit_perf_trace_context(void); 218c2ecf20Sopenharmony_ci#endif 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_cistatic PyObject *perf_trace_context_common_pc(PyObject *obj, PyObject *args) 248c2ecf20Sopenharmony_ci{ 258c2ecf20Sopenharmony_ci static struct scripting_context *scripting_context; 268c2ecf20Sopenharmony_ci PyObject *context; 278c2ecf20Sopenharmony_ci int retval; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci if (!PyArg_ParseTuple(args, "O", &context)) 308c2ecf20Sopenharmony_ci return NULL; 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci scripting_context = _PyCapsule_GetPointer(context, NULL); 338c2ecf20Sopenharmony_ci retval = common_pc(scripting_context); 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci return Py_BuildValue("i", retval); 368c2ecf20Sopenharmony_ci} 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_cistatic PyObject *perf_trace_context_common_flags(PyObject *obj, 398c2ecf20Sopenharmony_ci PyObject *args) 408c2ecf20Sopenharmony_ci{ 418c2ecf20Sopenharmony_ci static struct scripting_context *scripting_context; 428c2ecf20Sopenharmony_ci PyObject *context; 438c2ecf20Sopenharmony_ci int retval; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci if (!PyArg_ParseTuple(args, "O", &context)) 468c2ecf20Sopenharmony_ci return NULL; 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci scripting_context = _PyCapsule_GetPointer(context, NULL); 498c2ecf20Sopenharmony_ci retval = common_flags(scripting_context); 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci return Py_BuildValue("i", retval); 528c2ecf20Sopenharmony_ci} 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_cistatic PyObject *perf_trace_context_common_lock_depth(PyObject *obj, 558c2ecf20Sopenharmony_ci PyObject *args) 568c2ecf20Sopenharmony_ci{ 578c2ecf20Sopenharmony_ci static struct scripting_context *scripting_context; 588c2ecf20Sopenharmony_ci PyObject *context; 598c2ecf20Sopenharmony_ci int retval; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci if (!PyArg_ParseTuple(args, "O", &context)) 628c2ecf20Sopenharmony_ci return NULL; 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci scripting_context = _PyCapsule_GetPointer(context, NULL); 658c2ecf20Sopenharmony_ci retval = common_lock_depth(scripting_context); 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci return Py_BuildValue("i", retval); 688c2ecf20Sopenharmony_ci} 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_cistatic PyMethodDef ContextMethods[] = { 718c2ecf20Sopenharmony_ci { "common_pc", perf_trace_context_common_pc, METH_VARARGS, 728c2ecf20Sopenharmony_ci "Get the common preempt count event field value."}, 738c2ecf20Sopenharmony_ci { "common_flags", perf_trace_context_common_flags, METH_VARARGS, 748c2ecf20Sopenharmony_ci "Get the common flags event field value."}, 758c2ecf20Sopenharmony_ci { "common_lock_depth", perf_trace_context_common_lock_depth, 768c2ecf20Sopenharmony_ci METH_VARARGS, "Get the common lock depth event field value."}, 778c2ecf20Sopenharmony_ci { NULL, NULL, 0, NULL} 788c2ecf20Sopenharmony_ci}; 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci#if PY_MAJOR_VERSION < 3 818c2ecf20Sopenharmony_ciPyMODINIT_FUNC initperf_trace_context(void) 828c2ecf20Sopenharmony_ci{ 838c2ecf20Sopenharmony_ci (void) Py_InitModule("perf_trace_context", ContextMethods); 848c2ecf20Sopenharmony_ci} 858c2ecf20Sopenharmony_ci#else 868c2ecf20Sopenharmony_ciPyMODINIT_FUNC PyInit_perf_trace_context(void) 878c2ecf20Sopenharmony_ci{ 888c2ecf20Sopenharmony_ci static struct PyModuleDef moduledef = { 898c2ecf20Sopenharmony_ci PyModuleDef_HEAD_INIT, 908c2ecf20Sopenharmony_ci "perf_trace_context", /* m_name */ 918c2ecf20Sopenharmony_ci "", /* m_doc */ 928c2ecf20Sopenharmony_ci -1, /* m_size */ 938c2ecf20Sopenharmony_ci ContextMethods, /* m_methods */ 948c2ecf20Sopenharmony_ci NULL, /* m_reload */ 958c2ecf20Sopenharmony_ci NULL, /* m_traverse */ 968c2ecf20Sopenharmony_ci NULL, /* m_clear */ 978c2ecf20Sopenharmony_ci NULL, /* m_free */ 988c2ecf20Sopenharmony_ci }; 998c2ecf20Sopenharmony_ci return PyModule_Create(&moduledef); 1008c2ecf20Sopenharmony_ci} 1018c2ecf20Sopenharmony_ci#endif 102