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