perf scripting python: Assign perf_script_context
authorAdrian Hunter <adrian.hunter@intel.com>
Sun, 30 May 2021 19:23:00 +0000 (22:23 +0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 1 Jun 2021 13:03:33 +0000 (10:03 -0300)
The scripting_context pointer itself does not change and nor does it need
to. Put it directly into the script as a variable at the start so it does
not have to be passed on each call into the script.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: https://lore.kernel.org/r/20210530192308.7382-6-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/scripts/python/Perf-Trace-Util/Context.c
tools/perf/util/scripting-engines/trace-event-python.c

index 7cef02d..26a45ae 100644 (file)
@@ -91,6 +91,12 @@ PyMODINIT_FUNC PyInit_perf_trace_context(void)
                NULL,                   /* m_clear */
                NULL,                   /* m_free */
        };
-       return PyModule_Create(&moduledef);
+       PyObject *mod;
+
+       mod = PyModule_Create(&moduledef);
+       /* Add perf_script_context to the module so it can be imported */
+       PyObject_SetAttrString(mod, "perf_script_context", Py_None);
+
+       return mod;
 }
 #endif
index 02d134b..164d2f4 100644 (file)
@@ -1599,6 +1599,31 @@ static void python_process_stat_interval(u64 tstamp)
        Py_DECREF(t);
 }
 
+static int perf_script_context_init(void)
+{
+       PyObject *perf_script_context;
+       PyObject *perf_trace_context;
+       PyObject *dict;
+       int ret;
+
+       perf_trace_context = PyImport_AddModule("perf_trace_context");
+       if (!perf_trace_context)
+               return -1;
+       dict = PyModule_GetDict(perf_trace_context);
+       if (!dict)
+               return -1;
+
+       perf_script_context = _PyCapsule_New(scripting_context, NULL, NULL);
+       if (!perf_script_context)
+               return -1;
+
+       ret = PyDict_SetItemString(dict, "perf_script_context", perf_script_context);
+       if (!ret)
+               ret = PyDict_SetItemString(main_dict, "perf_script_context", perf_script_context);
+       Py_DECREF(perf_script_context);
+       return ret;
+}
+
 static int run_start_sub(void)
 {
        main_module = PyImport_AddModule("__main__");
@@ -1611,6 +1636,9 @@ static int run_start_sub(void)
                goto error;
        Py_INCREF(main_dict);
 
+       if (perf_script_context_init())
+               goto error;
+
        try_call_object("trace_begin", NULL);
 
        return 0;