1d2a6e165SVignesh Balasubramanian /*
2d2a6e165SVignesh Balasubramanian * ompdModule.c
3d2a6e165SVignesh Balasubramanian */
4d2a6e165SVignesh Balasubramanian
5d2a6e165SVignesh Balasubramanian //===----------------------------------------------------------------------===//
6d2a6e165SVignesh Balasubramanian //
7d2a6e165SVignesh Balasubramanian // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
8d2a6e165SVignesh Balasubramanian // See https://llvm.org/LICENSE.txt for license information.
9d2a6e165SVignesh Balasubramanian // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
10d2a6e165SVignesh Balasubramanian //
11d2a6e165SVignesh Balasubramanian //===----------------------------------------------------------------------===//
12d2a6e165SVignesh Balasubramanian
13d2a6e165SVignesh Balasubramanian #include <Python.h>
14d2a6e165SVignesh Balasubramanian #include <omp-tools.h>
15d2a6e165SVignesh Balasubramanian // #include <ompd.h>
16d2a6e165SVignesh Balasubramanian #include <dlfcn.h>
17d2a6e165SVignesh Balasubramanian #include <errno.h>
18d2a6e165SVignesh Balasubramanian #include <pthread.h>
19d2a6e165SVignesh Balasubramanian #include <stdio.h>
20d2a6e165SVignesh Balasubramanian #include <stdlib.h>
21d2a6e165SVignesh Balasubramanian #include <string.h>
22d2a6e165SVignesh Balasubramanian
23d2a6e165SVignesh Balasubramanian void *ompd_library;
24d2a6e165SVignesh Balasubramanian
25d2a6e165SVignesh Balasubramanian #define OMPD_WEAK_ATTR __attribute__((weak))
26d2a6e165SVignesh Balasubramanian
27d2a6e165SVignesh Balasubramanian struct _ompd_aspace_cont {
28d2a6e165SVignesh Balasubramanian int id;
29d2a6e165SVignesh Balasubramanian };
30d2a6e165SVignesh Balasubramanian struct _ompd_thread_cont {
31d2a6e165SVignesh Balasubramanian int id;
32d2a6e165SVignesh Balasubramanian };
33d2a6e165SVignesh Balasubramanian ompd_address_space_context_t acontext = {42};
34d2a6e165SVignesh Balasubramanian
35d2a6e165SVignesh Balasubramanian PyObject *pModule;
36d2a6e165SVignesh Balasubramanian
37d2a6e165SVignesh Balasubramanian ompd_rc_t _print(const char *str, int category);
38d2a6e165SVignesh Balasubramanian
39d2a6e165SVignesh Balasubramanian // NOTE: implement functions to check parameters of OMPD API functions for
40d2a6e165SVignesh Balasubramanian // correctness
ompd_get_api_version(ompd_word_t * addr)41d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t ompd_get_api_version(ompd_word_t *addr) {
42d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_get_api_version)(ompd_word_t *) = NULL;
43d2a6e165SVignesh Balasubramanian if (!my_get_api_version) {
44d2a6e165SVignesh Balasubramanian my_get_api_version = dlsym(ompd_library, "ompd_get_api_version");
45d2a6e165SVignesh Balasubramanian if (dlerror()) {
46d2a6e165SVignesh Balasubramanian return ompd_rc_error;
47d2a6e165SVignesh Balasubramanian }
48d2a6e165SVignesh Balasubramanian }
49d2a6e165SVignesh Balasubramanian return my_get_api_version(addr);
50d2a6e165SVignesh Balasubramanian }
51d2a6e165SVignesh Balasubramanian
ompd_get_version_string(const char ** string)52d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t ompd_get_version_string(const char **string) {
53d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_get_version_string)(const char **) = NULL;
54d2a6e165SVignesh Balasubramanian if (!my_get_version_string) {
55d2a6e165SVignesh Balasubramanian my_get_version_string = dlsym(ompd_library, "ompd_get_version_string");
56d2a6e165SVignesh Balasubramanian if (dlerror()) {
57d2a6e165SVignesh Balasubramanian return ompd_rc_error;
58d2a6e165SVignesh Balasubramanian }
59d2a6e165SVignesh Balasubramanian }
60d2a6e165SVignesh Balasubramanian return my_get_version_string(string);
61d2a6e165SVignesh Balasubramanian }
62d2a6e165SVignesh Balasubramanian
ompd_finalize(void)63d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t ompd_finalize(void) {
64d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_ompd_finalize)(void) = NULL;
65d2a6e165SVignesh Balasubramanian if (!my_ompd_finalize) {
66d2a6e165SVignesh Balasubramanian my_ompd_finalize = dlsym(ompd_library, "ompd_finalize");
67d2a6e165SVignesh Balasubramanian if (dlerror()) {
68d2a6e165SVignesh Balasubramanian return ompd_rc_error;
69d2a6e165SVignesh Balasubramanian }
70d2a6e165SVignesh Balasubramanian }
71d2a6e165SVignesh Balasubramanian return my_ompd_finalize();
72d2a6e165SVignesh Balasubramanian }
73d2a6e165SVignesh Balasubramanian
74d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t
ompd_process_initialize(ompd_address_space_context_t * context,ompd_address_space_handle_t ** handle)75d2a6e165SVignesh Balasubramanian ompd_process_initialize(ompd_address_space_context_t *context,
76d2a6e165SVignesh Balasubramanian ompd_address_space_handle_t **handle) {
77d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_ompd_process_initialize)(
78d2a6e165SVignesh Balasubramanian ompd_address_space_context_t *, ompd_address_space_handle_t **) = NULL;
79d2a6e165SVignesh Balasubramanian if (!my_ompd_process_initialize) {
80d2a6e165SVignesh Balasubramanian my_ompd_process_initialize = dlsym(ompd_library, "ompd_process_initialize");
81d2a6e165SVignesh Balasubramanian if (dlerror()) {
82d2a6e165SVignesh Balasubramanian return ompd_rc_error;
83d2a6e165SVignesh Balasubramanian }
84d2a6e165SVignesh Balasubramanian }
85d2a6e165SVignesh Balasubramanian return my_ompd_process_initialize(context, handle);
86d2a6e165SVignesh Balasubramanian }
87d2a6e165SVignesh Balasubramanian
ompd_get_omp_version(ompd_address_space_handle_t * address_space,ompd_word_t * omp_version)88d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t ompd_get_omp_version(
89d2a6e165SVignesh Balasubramanian ompd_address_space_handle_t *address_space, ompd_word_t *omp_version) {
90d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_ompd_get_omp_version)(ompd_address_space_handle_t *,
91d2a6e165SVignesh Balasubramanian ompd_word_t *) = NULL;
92d2a6e165SVignesh Balasubramanian if (!my_ompd_get_omp_version) {
93d2a6e165SVignesh Balasubramanian my_ompd_get_omp_version = dlsym(ompd_library, "ompd_get_omp_version");
94d2a6e165SVignesh Balasubramanian if (dlerror()) {
95d2a6e165SVignesh Balasubramanian return ompd_rc_error;
96d2a6e165SVignesh Balasubramanian }
97d2a6e165SVignesh Balasubramanian }
98d2a6e165SVignesh Balasubramanian return my_ompd_get_omp_version(address_space, omp_version);
99d2a6e165SVignesh Balasubramanian }
100d2a6e165SVignesh Balasubramanian
ompd_get_omp_version_string(ompd_address_space_handle_t * address_space,const char ** string)101d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t ompd_get_omp_version_string(
102d2a6e165SVignesh Balasubramanian ompd_address_space_handle_t *address_space, const char **string) {
103d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_ompd_get_omp_version_string)(
104d2a6e165SVignesh Balasubramanian ompd_address_space_handle_t *, const char **) = NULL;
105d2a6e165SVignesh Balasubramanian if (!my_ompd_get_omp_version_string) {
106d2a6e165SVignesh Balasubramanian my_ompd_get_omp_version_string =
107d2a6e165SVignesh Balasubramanian dlsym(ompd_library, "ompd_get_omp_version_string");
108d2a6e165SVignesh Balasubramanian if (dlerror()) {
109d2a6e165SVignesh Balasubramanian return ompd_rc_error;
110d2a6e165SVignesh Balasubramanian }
111d2a6e165SVignesh Balasubramanian }
112d2a6e165SVignesh Balasubramanian return my_ompd_get_omp_version_string(address_space, string);
113d2a6e165SVignesh Balasubramanian }
114d2a6e165SVignesh Balasubramanian
ompd_get_thread_handle(ompd_address_space_handle_t * handle,ompd_thread_id_t kind,ompd_size_t tidSize,const void * tid,ompd_thread_handle_t ** threadHandle)115d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t ompd_get_thread_handle(
116d2a6e165SVignesh Balasubramanian ompd_address_space_handle_t *handle, ompd_thread_id_t kind,
117d2a6e165SVignesh Balasubramanian ompd_size_t tidSize, const void *tid, ompd_thread_handle_t **threadHandle) {
118d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_get_thread_handle)(
119d2a6e165SVignesh Balasubramanian ompd_address_space_handle_t *, ompd_thread_id_t, ompd_size_t,
120d2a6e165SVignesh Balasubramanian const void *, ompd_thread_handle_t **) = NULL;
121d2a6e165SVignesh Balasubramanian if (!my_get_thread_handle) {
122d2a6e165SVignesh Balasubramanian my_get_thread_handle = dlsym(ompd_library, "ompd_get_thread_handle");
123d2a6e165SVignesh Balasubramanian if (dlerror()) {
124d2a6e165SVignesh Balasubramanian return ompd_rc_error;
125d2a6e165SVignesh Balasubramanian }
126d2a6e165SVignesh Balasubramanian }
127d2a6e165SVignesh Balasubramanian return my_get_thread_handle(handle, kind, tidSize, tid, threadHandle);
128d2a6e165SVignesh Balasubramanian }
129d2a6e165SVignesh Balasubramanian
ompd_get_thread_in_parallel(ompd_parallel_handle_t * parallelHandle,int threadNum,ompd_thread_handle_t ** threadHandle)130d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t ompd_get_thread_in_parallel(
131d2a6e165SVignesh Balasubramanian ompd_parallel_handle_t *parallelHandle, int threadNum,
132d2a6e165SVignesh Balasubramanian ompd_thread_handle_t **threadHandle) {
133d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_get_thread_in_parallel)(ompd_parallel_handle_t *, int,
134d2a6e165SVignesh Balasubramanian ompd_thread_handle_t **) = NULL;
135d2a6e165SVignesh Balasubramanian if (!my_get_thread_in_parallel) {
136d2a6e165SVignesh Balasubramanian my_get_thread_in_parallel =
137d2a6e165SVignesh Balasubramanian dlsym(ompd_library, "ompd_get_thread_in_parallel");
138d2a6e165SVignesh Balasubramanian if (dlerror()) {
139d2a6e165SVignesh Balasubramanian return ompd_rc_error;
140d2a6e165SVignesh Balasubramanian }
141d2a6e165SVignesh Balasubramanian }
142d2a6e165SVignesh Balasubramanian return my_get_thread_in_parallel(parallelHandle, threadNum, threadHandle);
143d2a6e165SVignesh Balasubramanian }
144d2a6e165SVignesh Balasubramanian
ompd_thread_handle_compare(ompd_thread_handle_t * thread_handle1,ompd_thread_handle_t * thread_handle2,int * cmp_value)145d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t ompd_thread_handle_compare(
146d2a6e165SVignesh Balasubramanian ompd_thread_handle_t *thread_handle1, ompd_thread_handle_t *thread_handle2,
147d2a6e165SVignesh Balasubramanian int *cmp_value) {
148d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_thread_handle_compare)(
149d2a6e165SVignesh Balasubramanian ompd_thread_handle_t *, ompd_thread_handle_t *, int *) = NULL;
150d2a6e165SVignesh Balasubramanian if (!my_thread_handle_compare) {
151d2a6e165SVignesh Balasubramanian my_thread_handle_compare =
152d2a6e165SVignesh Balasubramanian dlsym(ompd_library, "ompd_thread_handle_compare");
153d2a6e165SVignesh Balasubramanian if (dlerror()) {
154d2a6e165SVignesh Balasubramanian return ompd_rc_error;
155d2a6e165SVignesh Balasubramanian }
156d2a6e165SVignesh Balasubramanian }
157d2a6e165SVignesh Balasubramanian return my_thread_handle_compare(thread_handle1, thread_handle2, cmp_value);
158d2a6e165SVignesh Balasubramanian }
159d2a6e165SVignesh Balasubramanian
160d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t
ompd_get_curr_parallel_handle(ompd_thread_handle_t * threadHandle,ompd_parallel_handle_t ** parallelHandle)161d2a6e165SVignesh Balasubramanian ompd_get_curr_parallel_handle(ompd_thread_handle_t *threadHandle,
162d2a6e165SVignesh Balasubramanian ompd_parallel_handle_t **parallelHandle) {
163d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_get_current_parallel_handle)(
164d2a6e165SVignesh Balasubramanian ompd_thread_handle_t *, ompd_parallel_handle_t **) = NULL;
165d2a6e165SVignesh Balasubramanian if (!my_get_current_parallel_handle) {
166d2a6e165SVignesh Balasubramanian my_get_current_parallel_handle =
167d2a6e165SVignesh Balasubramanian dlsym(ompd_library, "ompd_get_curr_parallel_handle");
168d2a6e165SVignesh Balasubramanian if (dlerror()) {
169d2a6e165SVignesh Balasubramanian return ompd_rc_error;
170d2a6e165SVignesh Balasubramanian }
171d2a6e165SVignesh Balasubramanian }
172d2a6e165SVignesh Balasubramanian return my_get_current_parallel_handle(threadHandle, parallelHandle);
173d2a6e165SVignesh Balasubramanian }
174d2a6e165SVignesh Balasubramanian
ompd_parallel_handle_compare(ompd_parallel_handle_t * parallel_handle_1,ompd_parallel_handle_t * parallel_handle_2,int * cmp_value)175d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t ompd_parallel_handle_compare(
176d2a6e165SVignesh Balasubramanian ompd_parallel_handle_t *parallel_handle_1,
177d2a6e165SVignesh Balasubramanian ompd_parallel_handle_t *parallel_handle_2, int *cmp_value) {
178d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_parallel_handle_compare)(
179d2a6e165SVignesh Balasubramanian ompd_parallel_handle_t *, ompd_parallel_handle_t *, int *) = NULL;
180d2a6e165SVignesh Balasubramanian if (!my_parallel_handle_compare) {
181d2a6e165SVignesh Balasubramanian my_parallel_handle_compare =
182d2a6e165SVignesh Balasubramanian dlsym(ompd_library, "ompd_parallel_handle_compare");
183d2a6e165SVignesh Balasubramanian if (dlerror()) {
184d2a6e165SVignesh Balasubramanian return ompd_rc_error;
185d2a6e165SVignesh Balasubramanian }
186d2a6e165SVignesh Balasubramanian }
187d2a6e165SVignesh Balasubramanian return my_parallel_handle_compare(parallel_handle_1, parallel_handle_2,
188d2a6e165SVignesh Balasubramanian cmp_value);
189d2a6e165SVignesh Balasubramanian }
190d2a6e165SVignesh Balasubramanian
191d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t
ompd_get_enclosing_parallel_handle(ompd_parallel_handle_t * parallelHandle,ompd_parallel_handle_t ** enclosing)192d2a6e165SVignesh Balasubramanian ompd_get_enclosing_parallel_handle(ompd_parallel_handle_t *parallelHandle,
193d2a6e165SVignesh Balasubramanian ompd_parallel_handle_t **enclosing) {
194d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_get_enclosing_parallel_handle)(
195d2a6e165SVignesh Balasubramanian ompd_parallel_handle_t *, ompd_parallel_handle_t **) = NULL;
196d2a6e165SVignesh Balasubramanian if (!my_get_enclosing_parallel_handle) {
197d2a6e165SVignesh Balasubramanian my_get_enclosing_parallel_handle =
198d2a6e165SVignesh Balasubramanian dlsym(ompd_library, "ompd_get_enclosing_parallel_handle");
199d2a6e165SVignesh Balasubramanian if (dlerror()) {
200d2a6e165SVignesh Balasubramanian return ompd_rc_error;
201d2a6e165SVignesh Balasubramanian }
202d2a6e165SVignesh Balasubramanian }
203d2a6e165SVignesh Balasubramanian return my_get_enclosing_parallel_handle(parallelHandle, enclosing);
204d2a6e165SVignesh Balasubramanian }
205d2a6e165SVignesh Balasubramanian
206d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t
ompd_get_task_parallel_handle(ompd_task_handle_t * taskHandle,ompd_parallel_handle_t ** taskParallelHandle)207d2a6e165SVignesh Balasubramanian ompd_get_task_parallel_handle(ompd_task_handle_t *taskHandle,
208d2a6e165SVignesh Balasubramanian ompd_parallel_handle_t **taskParallelHandle) {
209d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_get_task_parallel_handle)(
210d2a6e165SVignesh Balasubramanian ompd_task_handle_t *, ompd_parallel_handle_t **) = NULL;
211d2a6e165SVignesh Balasubramanian if (!my_get_task_parallel_handle) {
212d2a6e165SVignesh Balasubramanian my_get_task_parallel_handle =
213d2a6e165SVignesh Balasubramanian dlsym(ompd_library, "ompd_get_task_parallel_handle");
214d2a6e165SVignesh Balasubramanian if (dlerror()) {
215d2a6e165SVignesh Balasubramanian return ompd_rc_error;
216d2a6e165SVignesh Balasubramanian }
217d2a6e165SVignesh Balasubramanian }
218d2a6e165SVignesh Balasubramanian return my_get_task_parallel_handle(taskHandle, taskParallelHandle);
219d2a6e165SVignesh Balasubramanian }
220d2a6e165SVignesh Balasubramanian
ompd_get_curr_task_handle(ompd_thread_handle_t * threadHandle,ompd_task_handle_t ** taskHandle)221d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t ompd_get_curr_task_handle(
222d2a6e165SVignesh Balasubramanian ompd_thread_handle_t *threadHandle, ompd_task_handle_t **taskHandle) {
223d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_get_current_task_handle)(ompd_thread_handle_t *,
224d2a6e165SVignesh Balasubramanian ompd_task_handle_t **) = NULL;
225d2a6e165SVignesh Balasubramanian if (!my_get_current_task_handle) {
226d2a6e165SVignesh Balasubramanian my_get_current_task_handle =
227d2a6e165SVignesh Balasubramanian dlsym(ompd_library, "ompd_get_curr_task_handle");
228d2a6e165SVignesh Balasubramanian if (dlerror()) {
229d2a6e165SVignesh Balasubramanian return ompd_rc_error;
230d2a6e165SVignesh Balasubramanian }
231d2a6e165SVignesh Balasubramanian }
232d2a6e165SVignesh Balasubramanian return my_get_current_task_handle(threadHandle, taskHandle);
233d2a6e165SVignesh Balasubramanian }
234d2a6e165SVignesh Balasubramanian
ompd_get_generating_task_handle(ompd_task_handle_t * taskHandle,ompd_task_handle_t ** generating)235d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t ompd_get_generating_task_handle(
236d2a6e165SVignesh Balasubramanian ompd_task_handle_t *taskHandle, ompd_task_handle_t **generating) {
237d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_get_generating_task_handle)(
238d2a6e165SVignesh Balasubramanian ompd_task_handle_t *, ompd_task_handle_t **) = NULL;
239d2a6e165SVignesh Balasubramanian if (!my_get_generating_task_handle) {
240d2a6e165SVignesh Balasubramanian my_get_generating_task_handle =
241d2a6e165SVignesh Balasubramanian dlsym(ompd_library, "ompd_get_generating_task_handle");
242d2a6e165SVignesh Balasubramanian if (dlerror()) {
243d2a6e165SVignesh Balasubramanian return ompd_rc_error;
244d2a6e165SVignesh Balasubramanian }
245d2a6e165SVignesh Balasubramanian }
246d2a6e165SVignesh Balasubramanian return my_get_generating_task_handle(taskHandle, generating);
247d2a6e165SVignesh Balasubramanian }
248d2a6e165SVignesh Balasubramanian
ompd_get_scheduling_task_handle(ompd_task_handle_t * taskHandle,ompd_task_handle_t ** scheduling)249d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t ompd_get_scheduling_task_handle(
250d2a6e165SVignesh Balasubramanian ompd_task_handle_t *taskHandle, ompd_task_handle_t **scheduling) {
251d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_get_scheduling_task_handle)(
252d2a6e165SVignesh Balasubramanian ompd_task_handle_t *, ompd_task_handle_t **) = NULL;
253d2a6e165SVignesh Balasubramanian if (!my_get_scheduling_task_handle) {
254d2a6e165SVignesh Balasubramanian my_get_scheduling_task_handle =
255d2a6e165SVignesh Balasubramanian dlsym(ompd_library, "ompd_get_scheduling_task_handle");
256d2a6e165SVignesh Balasubramanian if (dlerror()) {
257d2a6e165SVignesh Balasubramanian return ompd_rc_error;
258d2a6e165SVignesh Balasubramanian }
259d2a6e165SVignesh Balasubramanian }
260d2a6e165SVignesh Balasubramanian return my_get_scheduling_task_handle(taskHandle, scheduling);
261d2a6e165SVignesh Balasubramanian }
262d2a6e165SVignesh Balasubramanian
263d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t
ompd_get_task_in_parallel(ompd_parallel_handle_t * parallelHandle,int threadNum,ompd_task_handle_t ** taskHandle)264d2a6e165SVignesh Balasubramanian ompd_get_task_in_parallel(ompd_parallel_handle_t *parallelHandle, int threadNum,
265d2a6e165SVignesh Balasubramanian ompd_task_handle_t **taskHandle) {
266d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_get_task_in_parallel)(ompd_parallel_handle_t *, int,
267d2a6e165SVignesh Balasubramanian ompd_task_handle_t **) = NULL;
268d2a6e165SVignesh Balasubramanian if (!my_get_task_in_parallel) {
269d2a6e165SVignesh Balasubramanian my_get_task_in_parallel = dlsym(ompd_library, "ompd_get_task_in_parallel");
270d2a6e165SVignesh Balasubramanian if (dlerror()) {
271d2a6e165SVignesh Balasubramanian return ompd_rc_error;
272d2a6e165SVignesh Balasubramanian }
273d2a6e165SVignesh Balasubramanian }
274d2a6e165SVignesh Balasubramanian return my_get_task_in_parallel(parallelHandle, threadNum, taskHandle);
275d2a6e165SVignesh Balasubramanian }
276d2a6e165SVignesh Balasubramanian
ompd_get_task_frame(ompd_task_handle_t * taskHandle,ompd_frame_info_t * exitFrame,ompd_frame_info_t * enterFrame)277d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t ompd_get_task_frame(ompd_task_handle_t *taskHandle,
278d2a6e165SVignesh Balasubramanian ompd_frame_info_t *exitFrame,
279d2a6e165SVignesh Balasubramanian ompd_frame_info_t *enterFrame) {
280d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_get_task_frame)(
281d2a6e165SVignesh Balasubramanian ompd_task_handle_t *, ompd_frame_info_t *, ompd_frame_info_t *) = NULL;
282d2a6e165SVignesh Balasubramanian if (!my_get_task_frame) {
283d2a6e165SVignesh Balasubramanian my_get_task_frame = dlsym(ompd_library, "ompd_get_task_frame");
284d2a6e165SVignesh Balasubramanian if (dlerror()) {
285d2a6e165SVignesh Balasubramanian return ompd_rc_error;
286d2a6e165SVignesh Balasubramanian }
287d2a6e165SVignesh Balasubramanian }
288d2a6e165SVignesh Balasubramanian return my_get_task_frame(taskHandle, exitFrame, enterFrame);
289d2a6e165SVignesh Balasubramanian }
290d2a6e165SVignesh Balasubramanian
ompd_get_icv_from_scope(void * handle,ompd_scope_t scope,ompd_icv_id_t icvId,ompd_word_t * icvValue)291d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t ompd_get_icv_from_scope(void *handle,
292d2a6e165SVignesh Balasubramanian ompd_scope_t scope,
293d2a6e165SVignesh Balasubramanian ompd_icv_id_t icvId,
294d2a6e165SVignesh Balasubramanian ompd_word_t *icvValue) {
295d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_get_icv_from_scope)(void *, ompd_scope_t, ompd_icv_id_t,
296d2a6e165SVignesh Balasubramanian ompd_word_t *) = NULL;
297d2a6e165SVignesh Balasubramanian if (!my_get_icv_from_scope) {
298d2a6e165SVignesh Balasubramanian my_get_icv_from_scope = dlsym(ompd_library, "ompd_get_icv_from_scope");
299d2a6e165SVignesh Balasubramanian if (dlerror()) {
300d2a6e165SVignesh Balasubramanian return ompd_rc_error;
301d2a6e165SVignesh Balasubramanian }
302d2a6e165SVignesh Balasubramanian }
303d2a6e165SVignesh Balasubramanian return my_get_icv_from_scope(handle, scope, icvId, icvValue);
304d2a6e165SVignesh Balasubramanian }
305d2a6e165SVignesh Balasubramanian
306d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t
ompd_enumerate_icvs(ompd_address_space_handle_t * handle,ompd_icv_id_t current,ompd_icv_id_t * next,const char ** nextIcvName,ompd_scope_t * nextScope,int * more)307d2a6e165SVignesh Balasubramanian ompd_enumerate_icvs(ompd_address_space_handle_t *handle, ompd_icv_id_t current,
308d2a6e165SVignesh Balasubramanian ompd_icv_id_t *next, const char **nextIcvName,
309d2a6e165SVignesh Balasubramanian ompd_scope_t *nextScope, int *more) {
310d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_enumerate_icvs)(
311d2a6e165SVignesh Balasubramanian ompd_address_space_handle_t *, ompd_icv_id_t, ompd_icv_id_t *,
312d2a6e165SVignesh Balasubramanian const char **, ompd_scope_t *, int *) = NULL;
313d2a6e165SVignesh Balasubramanian if (!my_enumerate_icvs) {
314d2a6e165SVignesh Balasubramanian my_enumerate_icvs = dlsym(ompd_library, "ompd_enumerate_icvs");
315d2a6e165SVignesh Balasubramanian if (dlerror()) {
316d2a6e165SVignesh Balasubramanian return ompd_rc_error;
317d2a6e165SVignesh Balasubramanian }
318d2a6e165SVignesh Balasubramanian }
319d2a6e165SVignesh Balasubramanian return my_enumerate_icvs(handle, current, next, nextIcvName, nextScope, more);
320d2a6e165SVignesh Balasubramanian }
321d2a6e165SVignesh Balasubramanian
322d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t
ompd_enumerate_states(ompd_address_space_handle_t * addrSpaceHandle,ompd_word_t currentState,ompd_word_t * nextState,const char ** nextStateName,ompd_word_t * moreEnums)323d2a6e165SVignesh Balasubramanian ompd_enumerate_states(ompd_address_space_handle_t *addrSpaceHandle,
324d2a6e165SVignesh Balasubramanian ompd_word_t currentState, ompd_word_t *nextState,
325d2a6e165SVignesh Balasubramanian const char **nextStateName, ompd_word_t *moreEnums) {
326d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_enumerate_states)(ompd_address_space_handle_t *,
327d2a6e165SVignesh Balasubramanian ompd_word_t, ompd_word_t *,
328d2a6e165SVignesh Balasubramanian const char **, ompd_word_t *) = NULL;
329d2a6e165SVignesh Balasubramanian if (!my_enumerate_states) {
330d2a6e165SVignesh Balasubramanian my_enumerate_states = dlsym(ompd_library, "ompd_enumerate_states");
331d2a6e165SVignesh Balasubramanian if (dlerror()) {
332d2a6e165SVignesh Balasubramanian return ompd_rc_error;
333d2a6e165SVignesh Balasubramanian }
334d2a6e165SVignesh Balasubramanian }
335d2a6e165SVignesh Balasubramanian return my_enumerate_states(addrSpaceHandle, currentState, nextState,
336d2a6e165SVignesh Balasubramanian nextStateName, moreEnums);
337d2a6e165SVignesh Balasubramanian }
338d2a6e165SVignesh Balasubramanian
ompd_get_state(ompd_thread_handle_t * threadHandle,ompd_word_t * state,ompd_wait_id_t * waitId)339d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t ompd_get_state(ompd_thread_handle_t *threadHandle,
340d2a6e165SVignesh Balasubramanian ompd_word_t *state,
341d2a6e165SVignesh Balasubramanian ompd_wait_id_t *waitId) {
342d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_get_state)(ompd_thread_handle_t *, ompd_word_t *,
343d2a6e165SVignesh Balasubramanian ompd_wait_id_t *) = NULL;
344d2a6e165SVignesh Balasubramanian if (!my_get_state) {
345d2a6e165SVignesh Balasubramanian my_get_state = dlsym(ompd_library, "ompd_get_state");
346d2a6e165SVignesh Balasubramanian if (dlerror()) {
347d2a6e165SVignesh Balasubramanian return ompd_rc_error;
348d2a6e165SVignesh Balasubramanian }
349d2a6e165SVignesh Balasubramanian }
350d2a6e165SVignesh Balasubramanian return my_get_state(threadHandle, state, waitId);
351d2a6e165SVignesh Balasubramanian }
352d2a6e165SVignesh Balasubramanian
ompd_get_task_function(ompd_task_handle_t * taskHandle,ompd_address_t * entryPoint)353d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t ompd_get_task_function(ompd_task_handle_t *taskHandle,
354d2a6e165SVignesh Balasubramanian ompd_address_t *entryPoint) {
355d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_get_task_function)(ompd_task_handle_t *,
356d2a6e165SVignesh Balasubramanian ompd_address_t *) = NULL;
357d2a6e165SVignesh Balasubramanian if (!my_get_task_function) {
358d2a6e165SVignesh Balasubramanian my_get_task_function = dlsym(ompd_library, "ompd_get_task_function");
359d2a6e165SVignesh Balasubramanian if (dlerror()) {
360d2a6e165SVignesh Balasubramanian return ompd_rc_error;
361d2a6e165SVignesh Balasubramanian }
362d2a6e165SVignesh Balasubramanian }
363d2a6e165SVignesh Balasubramanian return my_get_task_function(taskHandle, entryPoint);
364d2a6e165SVignesh Balasubramanian }
365d2a6e165SVignesh Balasubramanian
ompd_get_thread_id(ompd_thread_handle_t * threadHandle,ompd_thread_id_t kind,ompd_size_t tidSize,void * tid)366d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t ompd_get_thread_id(ompd_thread_handle_t *threadHandle,
367d2a6e165SVignesh Balasubramanian ompd_thread_id_t kind,
368d2a6e165SVignesh Balasubramanian ompd_size_t tidSize, void *tid) {
369d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_get_thread_id)(ompd_thread_handle_t *, ompd_thread_id_t,
370d2a6e165SVignesh Balasubramanian ompd_size_t, void *) = NULL;
371d2a6e165SVignesh Balasubramanian if (!my_get_thread_id) {
372d2a6e165SVignesh Balasubramanian my_get_thread_id = dlsym(ompd_library, "ompd_get_thread_id");
373d2a6e165SVignesh Balasubramanian if (dlerror()) {
374d2a6e165SVignesh Balasubramanian return ompd_rc_error;
375d2a6e165SVignesh Balasubramanian }
376d2a6e165SVignesh Balasubramanian }
377d2a6e165SVignesh Balasubramanian return my_get_thread_id(threadHandle, kind, tidSize, tid);
378d2a6e165SVignesh Balasubramanian }
379d2a6e165SVignesh Balasubramanian
ompd_get_tool_data(void * handle,ompd_scope_t scope,ompd_word_t * value,ompd_address_t * ptr)380d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t ompd_get_tool_data(void *handle, ompd_scope_t scope,
381d2a6e165SVignesh Balasubramanian ompd_word_t *value,
382d2a6e165SVignesh Balasubramanian ompd_address_t *ptr) {
383d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_get_tool_data)(void *, ompd_scope_t, ompd_word_t *,
384d2a6e165SVignesh Balasubramanian ompd_address_t *) = NULL;
385d2a6e165SVignesh Balasubramanian if (!my_get_tool_data) {
386d2a6e165SVignesh Balasubramanian my_get_tool_data = dlsym(ompd_library, "ompd_get_tool_data");
387d2a6e165SVignesh Balasubramanian if (dlerror()) {
388d2a6e165SVignesh Balasubramanian return ompd_rc_error;
389d2a6e165SVignesh Balasubramanian }
390d2a6e165SVignesh Balasubramanian }
391d2a6e165SVignesh Balasubramanian return my_get_tool_data(handle, scope, value, ptr);
392d2a6e165SVignesh Balasubramanian }
393d2a6e165SVignesh Balasubramanian
394d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t
ompd_get_icv_string_from_scope(void * handle,ompd_scope_t scope,ompd_icv_id_t icvId,const char ** icvString)395d2a6e165SVignesh Balasubramanian ompd_get_icv_string_from_scope(void *handle, ompd_scope_t scope,
396d2a6e165SVignesh Balasubramanian ompd_icv_id_t icvId, const char **icvString) {
397d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_get_icv_string_from_scope)(
398d2a6e165SVignesh Balasubramanian void *, ompd_scope_t, ompd_icv_id_t, const char **) = NULL;
399d2a6e165SVignesh Balasubramanian if (!my_get_icv_string_from_scope) {
400d2a6e165SVignesh Balasubramanian my_get_icv_string_from_scope =
401d2a6e165SVignesh Balasubramanian dlsym(ompd_library, "ompd_get_icv_string_from_scope");
402d2a6e165SVignesh Balasubramanian if (dlerror()) {
403d2a6e165SVignesh Balasubramanian return ompd_rc_error;
404d2a6e165SVignesh Balasubramanian }
405d2a6e165SVignesh Balasubramanian }
406d2a6e165SVignesh Balasubramanian return my_get_icv_string_from_scope(handle, scope, icvId, icvString);
407d2a6e165SVignesh Balasubramanian }
408d2a6e165SVignesh Balasubramanian
409d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t
ompd_rel_thread_handle(ompd_thread_handle_t * threadHandle)410d2a6e165SVignesh Balasubramanian ompd_rel_thread_handle(ompd_thread_handle_t *threadHandle) {
411d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_release_thread_handle)(ompd_thread_handle_t *) = NULL;
412d2a6e165SVignesh Balasubramanian if (!my_release_thread_handle) {
413d2a6e165SVignesh Balasubramanian my_release_thread_handle = dlsym(ompd_library, "ompd_rel_thread_handle");
414d2a6e165SVignesh Balasubramanian if (dlerror()) {
415d2a6e165SVignesh Balasubramanian return ompd_rc_error;
416d2a6e165SVignesh Balasubramanian }
417d2a6e165SVignesh Balasubramanian }
418d2a6e165SVignesh Balasubramanian return my_release_thread_handle(threadHandle);
419d2a6e165SVignesh Balasubramanian }
420d2a6e165SVignesh Balasubramanian
421d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t
ompd_rel_parallel_handle(ompd_parallel_handle_t * parallelHandle)422d2a6e165SVignesh Balasubramanian ompd_rel_parallel_handle(ompd_parallel_handle_t *parallelHandle) {
423d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_release_parallel_handle)(ompd_parallel_handle_t *) =
424d2a6e165SVignesh Balasubramanian NULL;
425d2a6e165SVignesh Balasubramanian if (!my_release_parallel_handle) {
426d2a6e165SVignesh Balasubramanian my_release_parallel_handle =
427d2a6e165SVignesh Balasubramanian dlsym(ompd_library, "ompd_rel_parallel_handle");
428d2a6e165SVignesh Balasubramanian if (dlerror()) {
429d2a6e165SVignesh Balasubramanian return ompd_rc_error;
430d2a6e165SVignesh Balasubramanian }
431d2a6e165SVignesh Balasubramanian }
432d2a6e165SVignesh Balasubramanian return my_release_parallel_handle(parallelHandle);
433d2a6e165SVignesh Balasubramanian }
434d2a6e165SVignesh Balasubramanian
ompd_rel_task_handle(ompd_task_handle_t * taskHandle)435d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t ompd_rel_task_handle(ompd_task_handle_t *taskHandle) {
436d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_release_task_handle)(ompd_task_handle_t *) = NULL;
437d2a6e165SVignesh Balasubramanian if (!my_release_task_handle) {
438d2a6e165SVignesh Balasubramanian my_release_task_handle = dlsym(ompd_library, "ompd_rel_task_handle");
439d2a6e165SVignesh Balasubramanian if (dlerror()) {
440d2a6e165SVignesh Balasubramanian return ompd_rc_error;
441d2a6e165SVignesh Balasubramanian }
442d2a6e165SVignesh Balasubramanian }
443d2a6e165SVignesh Balasubramanian return my_release_task_handle(taskHandle);
444d2a6e165SVignesh Balasubramanian }
445d2a6e165SVignesh Balasubramanian
446d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t
ompd_task_handle_compare(ompd_task_handle_t * task_handle_1,ompd_task_handle_t * task_handle_2,int * cmp_value)447d2a6e165SVignesh Balasubramanian ompd_task_handle_compare(ompd_task_handle_t *task_handle_1,
448d2a6e165SVignesh Balasubramanian ompd_task_handle_t *task_handle_2, int *cmp_value) {
449d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_task_handle_compare)(
450d2a6e165SVignesh Balasubramanian ompd_task_handle_t *, ompd_task_handle_t *, int *) = NULL;
451d2a6e165SVignesh Balasubramanian if (!my_task_handle_compare) {
452d2a6e165SVignesh Balasubramanian my_task_handle_compare = dlsym(ompd_library, "ompd_task_handle_compare");
453d2a6e165SVignesh Balasubramanian if (dlerror()) {
454d2a6e165SVignesh Balasubramanian return ompd_rc_error;
455d2a6e165SVignesh Balasubramanian }
456d2a6e165SVignesh Balasubramanian }
457d2a6e165SVignesh Balasubramanian return my_task_handle_compare(task_handle_1, task_handle_2, cmp_value);
458d2a6e165SVignesh Balasubramanian }
459d2a6e165SVignesh Balasubramanian
460d2a6e165SVignesh Balasubramanian OMPD_WEAK_ATTR ompd_rc_t
ompd_get_display_control_vars(ompd_address_space_handle_t * address_space_handle,const char * const ** control_vars)461d2a6e165SVignesh Balasubramanian ompd_get_display_control_vars(ompd_address_space_handle_t *address_space_handle,
462d2a6e165SVignesh Balasubramanian const char *const **control_vars) {
463d2a6e165SVignesh Balasubramanian static ompd_rc_t (*my_ompd_get_display_control_vars)(
464d2a6e165SVignesh Balasubramanian ompd_address_space_handle_t *, const char *const **) = NULL;
465d2a6e165SVignesh Balasubramanian if (!my_ompd_get_display_control_vars) {
466d2a6e165SVignesh Balasubramanian my_ompd_get_display_control_vars =
467d2a6e165SVignesh Balasubramanian dlsym(ompd_library, "ompd_get_display_control_vars");
468d2a6e165SVignesh Balasubramanian if (dlerror()) {
469d2a6e165SVignesh Balasubramanian return ompd_rc_error;
470d2a6e165SVignesh Balasubramanian }
471d2a6e165SVignesh Balasubramanian }
472d2a6e165SVignesh Balasubramanian return my_ompd_get_display_control_vars(address_space_handle, control_vars);
473d2a6e165SVignesh Balasubramanian }
474d2a6e165SVignesh Balasubramanian
475d2a6e165SVignesh Balasubramanian /**
476d2a6e165SVignesh Balasubramanian * Loads the OMPD library (libompd.so). Returns an integer with the version if
477d2a6e165SVignesh Balasubramanian * the OMPD library could be loaded successfully. Error codes: -1: argument
478d2a6e165SVignesh Balasubramanian * could not be converted to string -2: error when calling dlopen -3: error when
479d2a6e165SVignesh Balasubramanian * fetching version of OMPD API else: see ompd return codes
480d2a6e165SVignesh Balasubramanian */
ompd_open(PyObject * self,PyObject * args)481d2a6e165SVignesh Balasubramanian static PyObject *ompd_open(PyObject *self, PyObject *args) {
482d2a6e165SVignesh Balasubramanian const char *name, *dlerr;
483d2a6e165SVignesh Balasubramanian dlerror();
484d2a6e165SVignesh Balasubramanian if (!PyArg_ParseTuple(args, "s", &name)) {
485d2a6e165SVignesh Balasubramanian return Py_BuildValue("i", -1);
486d2a6e165SVignesh Balasubramanian }
487d2a6e165SVignesh Balasubramanian ompd_library = dlopen(name, RTLD_LAZY);
488d2a6e165SVignesh Balasubramanian if ((dlerr = dlerror())) {
489d2a6e165SVignesh Balasubramanian return Py_BuildValue("i", -2);
490d2a6e165SVignesh Balasubramanian }
491d2a6e165SVignesh Balasubramanian if (dlerror()) {
492d2a6e165SVignesh Balasubramanian return Py_BuildValue("i", -3);
493d2a6e165SVignesh Balasubramanian }
494d2a6e165SVignesh Balasubramanian ompd_word_t version;
495d2a6e165SVignesh Balasubramanian ompd_rc_t rc = ompd_get_api_version(&version);
496d2a6e165SVignesh Balasubramanian if (rc != ompd_rc_ok)
497d2a6e165SVignesh Balasubramanian return Py_BuildValue("l", -10 - rc);
498d2a6e165SVignesh Balasubramanian
499d2a6e165SVignesh Balasubramanian int returnValue = version;
500d2a6e165SVignesh Balasubramanian return Py_BuildValue("i", returnValue);
501d2a6e165SVignesh Balasubramanian }
502d2a6e165SVignesh Balasubramanian
503d2a6e165SVignesh Balasubramanian /**
504d2a6e165SVignesh Balasubramanian * Have the debugger print a string.
505d2a6e165SVignesh Balasubramanian */
_print(const char * str,int category)506d2a6e165SVignesh Balasubramanian ompd_rc_t _print(const char *str, int category) {
507d2a6e165SVignesh Balasubramanian PyObject *pFunc = PyObject_GetAttrString(pModule, "_print");
508d2a6e165SVignesh Balasubramanian if (pFunc && PyCallable_Check(pFunc)) {
509d2a6e165SVignesh Balasubramanian PyObject *pArgs = PyTuple_New(1);
510d2a6e165SVignesh Balasubramanian PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", str));
511d2a6e165SVignesh Balasubramanian PyObject_CallObject(pFunc, pArgs);
512d2a6e165SVignesh Balasubramanian Py_XDECREF(pArgs);
513d2a6e165SVignesh Balasubramanian }
514d2a6e165SVignesh Balasubramanian Py_XDECREF(pFunc);
515d2a6e165SVignesh Balasubramanian return ompd_rc_ok;
516d2a6e165SVignesh Balasubramanian }
517d2a6e165SVignesh Balasubramanian
_printf(const char * format,...)518*b0fc18daSFangrui Song void _printf(const char *format, ...) {
519d2a6e165SVignesh Balasubramanian va_list args;
520d2a6e165SVignesh Balasubramanian va_start(args, format);
521d2a6e165SVignesh Balasubramanian char output[1024];
522d2a6e165SVignesh Balasubramanian vsnprintf(output, 1024, format, args);
523d2a6e165SVignesh Balasubramanian va_end(args);
524d2a6e165SVignesh Balasubramanian _print(output, 0);
525d2a6e165SVignesh Balasubramanian }
526d2a6e165SVignesh Balasubramanian
527d2a6e165SVignesh Balasubramanian /**
528d2a6e165SVignesh Balasubramanian * Capsule destructors for thread, parallel and task handles.
529d2a6e165SVignesh Balasubramanian */
call_ompd_rel_thread_handle_temp(PyObject * capsule)530d2a6e165SVignesh Balasubramanian static void call_ompd_rel_thread_handle_temp(PyObject *capsule) {
531d2a6e165SVignesh Balasubramanian ompd_thread_handle_t *threadHandle =
532d2a6e165SVignesh Balasubramanian (ompd_thread_handle_t *)(PyCapsule_GetPointer(capsule, "ThreadHandle"));
533d2a6e165SVignesh Balasubramanian
534d2a6e165SVignesh Balasubramanian ompd_rc_t retVal = ompd_rel_thread_handle(threadHandle);
535d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
536d2a6e165SVignesh Balasubramanian _printf(
537d2a6e165SVignesh Balasubramanian "An error occurred when calling ompd_rel_thread_handle! Error code: %d",
538d2a6e165SVignesh Balasubramanian retVal);
539d2a6e165SVignesh Balasubramanian }
540d2a6e165SVignesh Balasubramanian }
541d2a6e165SVignesh Balasubramanian
destroyThreadCapsule(PyObject * capsule)542d2a6e165SVignesh Balasubramanian static void destroyThreadCapsule(PyObject *capsule) {
543d2a6e165SVignesh Balasubramanian call_ompd_rel_thread_handle_temp(capsule);
544d2a6e165SVignesh Balasubramanian }
545d2a6e165SVignesh Balasubramanian static void (*my_thread_capsule_destructor)(PyObject *) = destroyThreadCapsule;
546d2a6e165SVignesh Balasubramanian
call_ompd_rel_parallel_handle_temp(PyObject * capsule)547d2a6e165SVignesh Balasubramanian static void call_ompd_rel_parallel_handle_temp(PyObject *capsule) {
548d2a6e165SVignesh Balasubramanian ompd_parallel_handle_t *parallelHandle =
549d2a6e165SVignesh Balasubramanian (ompd_parallel_handle_t *)(PyCapsule_GetPointer(capsule,
550d2a6e165SVignesh Balasubramanian "ParallelHandle"));
551d2a6e165SVignesh Balasubramanian
552d2a6e165SVignesh Balasubramanian ompd_rc_t retVal = ompd_rel_parallel_handle(parallelHandle);
553d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
554d2a6e165SVignesh Balasubramanian _printf("An error occurred when calling ompd_rel_parallel_handle! Error "
555d2a6e165SVignesh Balasubramanian "code: %d",
556d2a6e165SVignesh Balasubramanian retVal);
557d2a6e165SVignesh Balasubramanian }
558d2a6e165SVignesh Balasubramanian }
559d2a6e165SVignesh Balasubramanian
destroyParallelCapsule(PyObject * capsule)560d2a6e165SVignesh Balasubramanian static void destroyParallelCapsule(PyObject *capsule) {
561d2a6e165SVignesh Balasubramanian call_ompd_rel_parallel_handle_temp(capsule);
562d2a6e165SVignesh Balasubramanian }
563d2a6e165SVignesh Balasubramanian static void (*my_parallel_capsule_destructor)(PyObject *) =
564d2a6e165SVignesh Balasubramanian destroyParallelCapsule;
565d2a6e165SVignesh Balasubramanian
call_ompd_rel_task_handle_temp(PyObject * capsule)566d2a6e165SVignesh Balasubramanian static void call_ompd_rel_task_handle_temp(PyObject *capsule) {
567d2a6e165SVignesh Balasubramanian ompd_task_handle_t *taskHandle =
568d2a6e165SVignesh Balasubramanian (ompd_task_handle_t *)(PyCapsule_GetPointer(capsule, "TaskHandle"));
569d2a6e165SVignesh Balasubramanian
570d2a6e165SVignesh Balasubramanian ompd_rc_t retVal = ompd_rel_task_handle(taskHandle);
571d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
572d2a6e165SVignesh Balasubramanian _printf("An error occurred when calling ompd_rel_task_handle!\n");
573d2a6e165SVignesh Balasubramanian }
574d2a6e165SVignesh Balasubramanian }
575d2a6e165SVignesh Balasubramanian
destroyTaskCapsule(PyObject * capsule)576d2a6e165SVignesh Balasubramanian static void destroyTaskCapsule(PyObject *capsule) {
577d2a6e165SVignesh Balasubramanian call_ompd_rel_task_handle_temp(capsule);
578d2a6e165SVignesh Balasubramanian }
579d2a6e165SVignesh Balasubramanian static void (*my_task_capsule_destructor)(PyObject *) = destroyTaskCapsule;
580d2a6e165SVignesh Balasubramanian
581d2a6e165SVignesh Balasubramanian /**
582d2a6e165SVignesh Balasubramanian * Release thread handle. Called inside destructor for Python thread_handle
583d2a6e165SVignesh Balasubramanian * object.
584d2a6e165SVignesh Balasubramanian */
call_ompd_rel_thread_handle(PyObject * self,PyObject * args)585d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_rel_thread_handle(PyObject *self, PyObject *args) {
586d2a6e165SVignesh Balasubramanian PyObject *threadHandlePy = PyTuple_GetItem(args, 0);
587d2a6e165SVignesh Balasubramanian ompd_thread_handle_t *threadHandle =
588d2a6e165SVignesh Balasubramanian (ompd_thread_handle_t *)(PyCapsule_GetPointer(threadHandlePy,
589d2a6e165SVignesh Balasubramanian "ThreadHandle"));
590d2a6e165SVignesh Balasubramanian
591d2a6e165SVignesh Balasubramanian ompd_rc_t retVal = ompd_rel_thread_handle(threadHandle);
592d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
593d2a6e165SVignesh Balasubramanian _printf(
594d2a6e165SVignesh Balasubramanian "An error occurred when calling ompd_rel_thread_handle! Error code: %d",
595d2a6e165SVignesh Balasubramanian retVal);
596d2a6e165SVignesh Balasubramanian }
597d2a6e165SVignesh Balasubramanian return Py_BuildValue("l", retVal);
598d2a6e165SVignesh Balasubramanian }
599d2a6e165SVignesh Balasubramanian
600d2a6e165SVignesh Balasubramanian /**
601d2a6e165SVignesh Balasubramanian * Allocate memory in the debugger's address space.
602d2a6e165SVignesh Balasubramanian */
_alloc(ompd_size_t bytes,void ** ptr)603d2a6e165SVignesh Balasubramanian ompd_rc_t _alloc(ompd_size_t bytes, void **ptr) {
604d2a6e165SVignesh Balasubramanian if (ptr == NULL) {
605d2a6e165SVignesh Balasubramanian return ompd_rc_bad_input;
606d2a6e165SVignesh Balasubramanian }
607d2a6e165SVignesh Balasubramanian *ptr = malloc(bytes);
608d2a6e165SVignesh Balasubramanian return ompd_rc_ok;
609d2a6e165SVignesh Balasubramanian }
610d2a6e165SVignesh Balasubramanian
611d2a6e165SVignesh Balasubramanian /**
612d2a6e165SVignesh Balasubramanian * Free memory in the debugger's address space.
613d2a6e165SVignesh Balasubramanian */
_free(void * ptr)614d2a6e165SVignesh Balasubramanian ompd_rc_t _free(void *ptr) {
615d2a6e165SVignesh Balasubramanian free(ptr);
616d2a6e165SVignesh Balasubramanian return ompd_rc_ok;
617d2a6e165SVignesh Balasubramanian }
618d2a6e165SVignesh Balasubramanian
619d2a6e165SVignesh Balasubramanian /**
620d2a6e165SVignesh Balasubramanian * Look up the sizes of primitive types in the target.
621d2a6e165SVignesh Balasubramanian */
_sizes(ompd_address_space_context_t * _acontext,ompd_device_type_sizes_t * sizes)622d2a6e165SVignesh Balasubramanian ompd_rc_t _sizes(ompd_address_space_context_t *_acontext, /* IN */
623d2a6e165SVignesh Balasubramanian ompd_device_type_sizes_t *sizes) /* OUT */
624d2a6e165SVignesh Balasubramanian {
625d2a6e165SVignesh Balasubramanian if (acontext.id != _acontext->id)
626d2a6e165SVignesh Balasubramanian return ompd_rc_stale_handle;
627d2a6e165SVignesh Balasubramanian ompd_device_type_sizes_t mysizes = {
628d2a6e165SVignesh Balasubramanian (uint8_t)sizeof(char), (uint8_t)sizeof(short),
629d2a6e165SVignesh Balasubramanian (uint8_t)sizeof(int), (uint8_t)sizeof(long),
630d2a6e165SVignesh Balasubramanian (uint8_t)sizeof(long long), (uint8_t)sizeof(void *)};
631d2a6e165SVignesh Balasubramanian *sizes = mysizes;
632d2a6e165SVignesh Balasubramanian return ompd_rc_ok;
633d2a6e165SVignesh Balasubramanian }
634d2a6e165SVignesh Balasubramanian
635d2a6e165SVignesh Balasubramanian /**
636d2a6e165SVignesh Balasubramanian * Look up the address of a global symbol in the target.
637d2a6e165SVignesh Balasubramanian */
_sym_addr(ompd_address_space_context_t * context,ompd_thread_context_t * tcontext,const char * symbol_name,ompd_address_t * symbol_addr,const char * file_name)638d2a6e165SVignesh Balasubramanian ompd_rc_t _sym_addr(ompd_address_space_context_t *context, /* IN */
639d2a6e165SVignesh Balasubramanian ompd_thread_context_t *tcontext, /* IN */
640d2a6e165SVignesh Balasubramanian const char *symbol_name, /* IN */
641d2a6e165SVignesh Balasubramanian ompd_address_t *symbol_addr, /* OUT */
642d2a6e165SVignesh Balasubramanian const char *file_name) /* IN */
643d2a6e165SVignesh Balasubramanian {
644d2a6e165SVignesh Balasubramanian int thread_id = -1;
645d2a6e165SVignesh Balasubramanian PyObject *symbolAddress;
646d2a6e165SVignesh Balasubramanian if (tcontext != NULL) {
647d2a6e165SVignesh Balasubramanian thread_id = tcontext->id;
648d2a6e165SVignesh Balasubramanian }
649d2a6e165SVignesh Balasubramanian PyObject *pFunc = PyObject_GetAttrString(pModule, "_sym_addr");
650d2a6e165SVignesh Balasubramanian if (pFunc && PyCallable_Check(pFunc)) {
651d2a6e165SVignesh Balasubramanian PyObject *pArgs = PyTuple_New(2);
652d2a6e165SVignesh Balasubramanian PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", thread_id));
653d2a6e165SVignesh Balasubramanian PyTuple_SetItem(pArgs, 1, Py_BuildValue("s", symbol_name));
654d2a6e165SVignesh Balasubramanian symbolAddress = PyObject_CallObject(pFunc, pArgs);
655d2a6e165SVignesh Balasubramanian if (symbolAddress == NULL) {
656d2a6e165SVignesh Balasubramanian PyErr_Print();
657d2a6e165SVignesh Balasubramanian }
658d2a6e165SVignesh Balasubramanian symbol_addr->address = PyLong_AsLong(symbolAddress);
659d2a6e165SVignesh Balasubramanian Py_XDECREF(pArgs);
660d2a6e165SVignesh Balasubramanian Py_XDECREF(symbolAddress);
661d2a6e165SVignesh Balasubramanian }
662d2a6e165SVignesh Balasubramanian Py_XDECREF(pFunc);
663d2a6e165SVignesh Balasubramanian return ompd_rc_ok;
664d2a6e165SVignesh Balasubramanian }
665d2a6e165SVignesh Balasubramanian
666d2a6e165SVignesh Balasubramanian /**
667d2a6e165SVignesh Balasubramanian * Read memory from the target.
668d2a6e165SVignesh Balasubramanian */
_read(ompd_address_space_context_t * context,ompd_thread_context_t * tcontext,const ompd_address_t * addr,ompd_size_t nbytes,void * buffer)669d2a6e165SVignesh Balasubramanian ompd_rc_t _read(ompd_address_space_context_t *context, /* IN */
670d2a6e165SVignesh Balasubramanian ompd_thread_context_t *tcontext, /* IN */
671d2a6e165SVignesh Balasubramanian const ompd_address_t *addr, /* IN */
672d2a6e165SVignesh Balasubramanian ompd_size_t nbytes, /* IN */
673d2a6e165SVignesh Balasubramanian void *buffer) /* OUT */
674d2a6e165SVignesh Balasubramanian {
675d2a6e165SVignesh Balasubramanian uint64_t readMem = (uint64_t)addr->address;
676d2a6e165SVignesh Balasubramanian PyObject *pFunc = PyObject_GetAttrString(pModule, "_read");
677d2a6e165SVignesh Balasubramanian if (pFunc && PyCallable_Check(pFunc)) {
678d2a6e165SVignesh Balasubramanian PyObject *pArgs = PyTuple_New(2);
679d2a6e165SVignesh Balasubramanian PyTuple_SetItem(pArgs, 0, Py_BuildValue("l", readMem));
680d2a6e165SVignesh Balasubramanian PyTuple_SetItem(pArgs, 1, Py_BuildValue("l", nbytes));
681d2a6e165SVignesh Balasubramanian PyObject *retArray = PyObject_CallObject(pFunc, pArgs);
682d2a6e165SVignesh Balasubramanian Py_XDECREF(pArgs);
683d2a6e165SVignesh Balasubramanian if (retArray == NULL) {
684d2a6e165SVignesh Balasubramanian PyErr_Print();
685d2a6e165SVignesh Balasubramanian }
686d2a6e165SVignesh Balasubramanian if (!PyByteArray_Check(retArray)) {
687d2a6e165SVignesh Balasubramanian return ompd_rc_error;
688d2a6e165SVignesh Balasubramanian }
689d2a6e165SVignesh Balasubramanian Py_ssize_t retSize = PyByteArray_Size(retArray);
690d2a6e165SVignesh Balasubramanian const char *strBuf = PyByteArray_AsString(retArray);
691d2a6e165SVignesh Balasubramanian if ((ompd_size_t)retSize != nbytes) {
692d2a6e165SVignesh Balasubramanian return ompd_rc_error;
693d2a6e165SVignesh Balasubramanian }
694d2a6e165SVignesh Balasubramanian memcpy(buffer, strBuf, nbytes);
695d2a6e165SVignesh Balasubramanian Py_XDECREF(retArray);
696d2a6e165SVignesh Balasubramanian }
697d2a6e165SVignesh Balasubramanian Py_XDECREF(pFunc);
698d2a6e165SVignesh Balasubramanian return ompd_rc_ok;
699d2a6e165SVignesh Balasubramanian }
700d2a6e165SVignesh Balasubramanian
701d2a6e165SVignesh Balasubramanian /**
702d2a6e165SVignesh Balasubramanian * Reads string from target.
703d2a6e165SVignesh Balasubramanian */
_read_string(ompd_address_space_context_t * context,ompd_thread_context_t * tcontext,const ompd_address_t * addr,ompd_size_t nbytes,void * buffer)704d2a6e165SVignesh Balasubramanian ompd_rc_t _read_string(ompd_address_space_context_t *context, /* IN */
705d2a6e165SVignesh Balasubramanian ompd_thread_context_t *tcontext, /* IN */
706d2a6e165SVignesh Balasubramanian const ompd_address_t *addr, /* IN */
707d2a6e165SVignesh Balasubramanian ompd_size_t nbytes, /* IN */
708d2a6e165SVignesh Balasubramanian void *buffer) /* OUT */
709d2a6e165SVignesh Balasubramanian {
710d2a6e165SVignesh Balasubramanian ompd_rc_t retVal = ompd_rc_ok;
711d2a6e165SVignesh Balasubramanian uint64_t readMem = (uint64_t)addr->address;
712d2a6e165SVignesh Balasubramanian PyObject *pFunc = PyObject_GetAttrString(pModule, "_read_string");
713d2a6e165SVignesh Balasubramanian PyObject *pArgs = PyTuple_New(1);
714d2a6e165SVignesh Balasubramanian PyTuple_SetItem(pArgs, 0, Py_BuildValue("l", readMem));
715d2a6e165SVignesh Balasubramanian PyObject *retString = PyObject_CallObject(pFunc, pArgs);
716d2a6e165SVignesh Balasubramanian Py_XDECREF(pArgs);
717d2a6e165SVignesh Balasubramanian if (!PyUnicode_Check(retString)) {
718d2a6e165SVignesh Balasubramanian return ompd_rc_error;
719d2a6e165SVignesh Balasubramanian }
720d2a6e165SVignesh Balasubramanian Py_ssize_t retSize;
721d2a6e165SVignesh Balasubramanian const char *strbuffer = PyUnicode_AsUTF8AndSize(retString, &retSize);
722d2a6e165SVignesh Balasubramanian if ((ompd_size_t)retSize + 1 >= nbytes) {
723d2a6e165SVignesh Balasubramanian retVal = ompd_rc_incomplete;
724d2a6e165SVignesh Balasubramanian }
725d2a6e165SVignesh Balasubramanian strncpy(buffer, strbuffer, nbytes);
726d2a6e165SVignesh Balasubramanian ((char *)buffer)[nbytes - 1] = '\0';
727d2a6e165SVignesh Balasubramanian return retVal;
728d2a6e165SVignesh Balasubramanian }
729d2a6e165SVignesh Balasubramanian
730d2a6e165SVignesh Balasubramanian /**
731d2a6e165SVignesh Balasubramanian * Write memory from the target.
732d2a6e165SVignesh Balasubramanian */
733d2a6e165SVignesh Balasubramanian ompd_rc_t
_endianess(ompd_address_space_context_t * address_space_context,const void * input,ompd_size_t unit_size,ompd_size_t count,void * output)734d2a6e165SVignesh Balasubramanian _endianess(ompd_address_space_context_t *address_space_context, /* IN */
735d2a6e165SVignesh Balasubramanian const void *input, /* IN */
736d2a6e165SVignesh Balasubramanian ompd_size_t unit_size, /* IN */
737d2a6e165SVignesh Balasubramanian ompd_size_t count, /* IN: number of primitive type */
738d2a6e165SVignesh Balasubramanian void *output) {
739d2a6e165SVignesh Balasubramanian if (acontext.id != address_space_context->id)
740d2a6e165SVignesh Balasubramanian return ompd_rc_stale_handle;
741d2a6e165SVignesh Balasubramanian memmove(output, input, count * unit_size);
742d2a6e165SVignesh Balasubramanian return ompd_rc_ok;
743d2a6e165SVignesh Balasubramanian }
744d2a6e165SVignesh Balasubramanian
745d2a6e165SVignesh Balasubramanian /**
746d2a6e165SVignesh Balasubramanian * Returns thread context for thread id; helper function for _thread_context
747d2a6e165SVignesh Balasubramanian * callback.
748d2a6e165SVignesh Balasubramanian */
get_thread_context(int id)749d2a6e165SVignesh Balasubramanian ompd_thread_context_t *get_thread_context(int id) {
750d2a6e165SVignesh Balasubramanian static ompd_thread_context_t *tc = NULL;
751d2a6e165SVignesh Balasubramanian static int size = 0;
752d2a6e165SVignesh Balasubramanian int i;
753d2a6e165SVignesh Balasubramanian if (id < 1)
754d2a6e165SVignesh Balasubramanian return NULL;
755d2a6e165SVignesh Balasubramanian if (tc == NULL) {
756d2a6e165SVignesh Balasubramanian size = 16;
757d2a6e165SVignesh Balasubramanian tc = malloc(size * sizeof(ompd_thread_context_t));
758d2a6e165SVignesh Balasubramanian for (i = 0; i < size; i++)
759d2a6e165SVignesh Balasubramanian tc[i].id = i + 1;
760d2a6e165SVignesh Balasubramanian }
761d2a6e165SVignesh Balasubramanian if (id - 1 >= size) {
762d2a6e165SVignesh Balasubramanian size += 16;
763d2a6e165SVignesh Balasubramanian tc = realloc(tc, size * sizeof(ompd_thread_context_t));
764d2a6e165SVignesh Balasubramanian for (i = 0; i < size; i++)
765d2a6e165SVignesh Balasubramanian tc[i].id = i + 1;
766d2a6e165SVignesh Balasubramanian }
767d2a6e165SVignesh Balasubramanian return tc + id - 1;
768d2a6e165SVignesh Balasubramanian }
769d2a6e165SVignesh Balasubramanian
770d2a6e165SVignesh Balasubramanian /**
771d2a6e165SVignesh Balasubramanian * Get thread specific context.
772d2a6e165SVignesh Balasubramanian */
773d2a6e165SVignesh Balasubramanian ompd_rc_t
_thread_context(ompd_address_space_context_t * context,ompd_thread_id_t kind,ompd_size_t sizeof_thread_id,const void * thread_id,ompd_thread_context_t ** thread_context)774d2a6e165SVignesh Balasubramanian _thread_context(ompd_address_space_context_t *context, /* IN */
775d2a6e165SVignesh Balasubramanian ompd_thread_id_t kind, /* IN, 0 for pthread, 1 for lwp */
776d2a6e165SVignesh Balasubramanian ompd_size_t sizeof_thread_id, /* IN */
777d2a6e165SVignesh Balasubramanian const void *thread_id, /* IN */
778d2a6e165SVignesh Balasubramanian ompd_thread_context_t **thread_context) /* OUT */
779d2a6e165SVignesh Balasubramanian {
780d2a6e165SVignesh Balasubramanian if (acontext.id != context->id)
781d2a6e165SVignesh Balasubramanian return ompd_rc_stale_handle;
782d2a6e165SVignesh Balasubramanian if (kind != 0 && kind != 1)
783d2a6e165SVignesh Balasubramanian return ompd_rc_unsupported;
784d2a6e165SVignesh Balasubramanian long int tid;
785d2a6e165SVignesh Balasubramanian if (sizeof(long int) >= 8 && sizeof_thread_id == 8)
786*b0fc18daSFangrui Song tid = *(const uint64_t *)thread_id;
787d2a6e165SVignesh Balasubramanian else if (sizeof(long int) >= 4 && sizeof_thread_id == 4)
788*b0fc18daSFangrui Song tid = *(const uint32_t *)thread_id;
789d2a6e165SVignesh Balasubramanian else if (sizeof(long int) >= 2 && sizeof_thread_id == 2)
790*b0fc18daSFangrui Song tid = *(const uint16_t *)thread_id;
791d2a6e165SVignesh Balasubramanian else
792d2a6e165SVignesh Balasubramanian return ompd_rc_bad_input;
793d2a6e165SVignesh Balasubramanian PyObject *pFunc = PyObject_GetAttrString(pModule, "_thread_context");
794d2a6e165SVignesh Balasubramanian if (pFunc && PyCallable_Check(pFunc)) {
795d2a6e165SVignesh Balasubramanian PyObject *pArgs = PyTuple_New(2);
796d2a6e165SVignesh Balasubramanian PyTuple_SetItem(pArgs, 0, Py_BuildValue("l", kind));
797d2a6e165SVignesh Balasubramanian PyTuple_SetItem(pArgs, 1, Py_BuildValue("l", tid));
798d2a6e165SVignesh Balasubramanian PyObject *res = PyObject_CallObject(pFunc, pArgs);
799d2a6e165SVignesh Balasubramanian int resAsInt = (int)PyLong_AsLong(res);
800d2a6e165SVignesh Balasubramanian if (resAsInt == -1) {
801d2a6e165SVignesh Balasubramanian // NOTE: could not find match for thread_id
802d2a6e165SVignesh Balasubramanian return ompd_rc_unavailable;
803d2a6e165SVignesh Balasubramanian }
804d2a6e165SVignesh Balasubramanian (*thread_context) = get_thread_context(resAsInt);
805d2a6e165SVignesh Balasubramanian Py_XDECREF(pArgs);
806d2a6e165SVignesh Balasubramanian Py_XDECREF(res);
807d2a6e165SVignesh Balasubramanian Py_XDECREF(pFunc);
808d2a6e165SVignesh Balasubramanian if (*thread_context == NULL) {
809d2a6e165SVignesh Balasubramanian return ompd_rc_bad_input;
810d2a6e165SVignesh Balasubramanian }
811d2a6e165SVignesh Balasubramanian return ompd_rc_ok;
812d2a6e165SVignesh Balasubramanian }
813d2a6e165SVignesh Balasubramanian Py_XDECREF(pFunc);
814d2a6e165SVignesh Balasubramanian return ompd_rc_error;
815d2a6e165SVignesh Balasubramanian }
816d2a6e165SVignesh Balasubramanian
817d2a6e165SVignesh Balasubramanian /**
818d2a6e165SVignesh Balasubramanian * Calls ompd_process_initialize; returns pointer to ompd_address_space_handle.
819d2a6e165SVignesh Balasubramanian */
call_ompd_initialize(PyObject * self,PyObject * noargs)820d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_initialize(PyObject *self, PyObject *noargs) {
821d2a6e165SVignesh Balasubramanian pModule = PyImport_Import(PyUnicode_FromString("ompd_callbacks"));
822d2a6e165SVignesh Balasubramanian
823d2a6e165SVignesh Balasubramanian static ompd_callbacks_t table = {
824d2a6e165SVignesh Balasubramanian _alloc, _free, _print, _sizes, _sym_addr, _read,
825d2a6e165SVignesh Balasubramanian NULL, _read_string, _endianess, _endianess, _thread_context};
826d2a6e165SVignesh Balasubramanian
827d2a6e165SVignesh Balasubramanian ompd_rc_t (*my_ompd_init)(ompd_word_t version, ompd_callbacks_t *) =
828d2a6e165SVignesh Balasubramanian dlsym(ompd_library, "ompd_initialize");
829d2a6e165SVignesh Balasubramanian ompd_rc_t returnInit = my_ompd_init(201811, &table);
830d2a6e165SVignesh Balasubramanian if (returnInit != ompd_rc_ok) {
831d2a6e165SVignesh Balasubramanian _printf("An error occurred when calling ompd_initialize! Error code: %d",
832d2a6e165SVignesh Balasubramanian returnInit);
833d2a6e165SVignesh Balasubramanian }
834d2a6e165SVignesh Balasubramanian ompd_address_space_handle_t *addr_space = NULL;
835d2a6e165SVignesh Balasubramanian ompd_rc_t (*my_proc_init)(ompd_address_space_context_t *,
836d2a6e165SVignesh Balasubramanian ompd_address_space_handle_t **) =
837d2a6e165SVignesh Balasubramanian dlsym(ompd_library, "ompd_process_initialize");
838d2a6e165SVignesh Balasubramanian ompd_rc_t retProcInit = my_proc_init(&acontext, &addr_space);
839d2a6e165SVignesh Balasubramanian if (retProcInit != ompd_rc_ok) {
840d2a6e165SVignesh Balasubramanian _printf("An error occurred when calling ompd_process_initialize! Error "
841d2a6e165SVignesh Balasubramanian "code: %d",
842d2a6e165SVignesh Balasubramanian retProcInit);
843d2a6e165SVignesh Balasubramanian }
844d2a6e165SVignesh Balasubramanian return PyCapsule_New(addr_space, "AddressSpace", NULL);
845d2a6e165SVignesh Balasubramanian }
846d2a6e165SVignesh Balasubramanian
847d2a6e165SVignesh Balasubramanian /**
848d2a6e165SVignesh Balasubramanian * Returns a PyCapsule pointer to thread handle for thread with the given id.
849d2a6e165SVignesh Balasubramanian */
get_thread_handle(PyObject * self,PyObject * args)850d2a6e165SVignesh Balasubramanian static PyObject *get_thread_handle(PyObject *self, PyObject *args) {
851d2a6e165SVignesh Balasubramanian PyObject *threadIdTup = PyTuple_GetItem(args, 0);
852d2a6e165SVignesh Balasubramanian uint64_t threadId = (uint64_t)PyLong_AsLong(threadIdTup);
853d2a6e165SVignesh Balasubramanian // NOTE: compiler does not know what thread handle looks like, so no memory
854d2a6e165SVignesh Balasubramanian // is allocated automatically in the debugger's memory space
855d2a6e165SVignesh Balasubramanian
856d2a6e165SVignesh Balasubramanian PyObject *addrSpaceTup = PyTuple_GetItem(args, 1);
857d2a6e165SVignesh Balasubramanian ompd_thread_handle_t *threadHandle;
858d2a6e165SVignesh Balasubramanian ompd_address_space_handle_t *addrSpace =
859d2a6e165SVignesh Balasubramanian (ompd_address_space_handle_t *)PyCapsule_GetPointer(addrSpaceTup,
860d2a6e165SVignesh Balasubramanian "AddressSpace");
861d2a6e165SVignesh Balasubramanian
862d2a6e165SVignesh Balasubramanian ompd_size_t sizeof_tid = (ompd_size_t)sizeof(uint64_t);
863d2a6e165SVignesh Balasubramanian ompd_rc_t retVal = ompd_get_thread_handle(addrSpace, 1, sizeof_tid, &threadId,
864d2a6e165SVignesh Balasubramanian &threadHandle);
865d2a6e165SVignesh Balasubramanian
866d2a6e165SVignesh Balasubramanian if (retVal == ompd_rc_unavailable) {
867d2a6e165SVignesh Balasubramanian return Py_BuildValue("i", -1);
868d2a6e165SVignesh Balasubramanian } else if (retVal != ompd_rc_ok) {
869d2a6e165SVignesh Balasubramanian _printf(
870d2a6e165SVignesh Balasubramanian "An error occured when calling ompd_get_thread_handle! Error code: %d",
871d2a6e165SVignesh Balasubramanian retVal);
872d2a6e165SVignesh Balasubramanian return Py_BuildValue("l", retVal);
873d2a6e165SVignesh Balasubramanian }
874d2a6e165SVignesh Balasubramanian return PyCapsule_New(threadHandle, "ThreadHandle",
875d2a6e165SVignesh Balasubramanian my_thread_capsule_destructor);
876d2a6e165SVignesh Balasubramanian }
877d2a6e165SVignesh Balasubramanian
878d2a6e165SVignesh Balasubramanian /**
879d2a6e165SVignesh Balasubramanian * Returns a PyCapsule pointer to a thread handle for a specific thread id in
880d2a6e165SVignesh Balasubramanian * the current parallel context.
881d2a6e165SVignesh Balasubramanian */
call_ompd_get_thread_in_parallel(PyObject * self,PyObject * args)882d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_get_thread_in_parallel(PyObject *self,
883d2a6e165SVignesh Balasubramanian PyObject *args) {
884d2a6e165SVignesh Balasubramanian PyObject *parallelHandlePy = PyTuple_GetItem(args, 0);
885d2a6e165SVignesh Balasubramanian int threadNum = (int)PyLong_AsLong(PyTuple_GetItem(args, 1));
886d2a6e165SVignesh Balasubramanian ompd_parallel_handle_t *parallelHandle =
887d2a6e165SVignesh Balasubramanian (ompd_parallel_handle_t *)(PyCapsule_GetPointer(parallelHandlePy,
888d2a6e165SVignesh Balasubramanian "ParallelHandle"));
889d2a6e165SVignesh Balasubramanian ompd_thread_handle_t *threadHandle;
890d2a6e165SVignesh Balasubramanian
891d2a6e165SVignesh Balasubramanian ompd_rc_t retVal =
892d2a6e165SVignesh Balasubramanian ompd_get_thread_in_parallel(parallelHandle, threadNum, &threadHandle);
893d2a6e165SVignesh Balasubramanian
894d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
895d2a6e165SVignesh Balasubramanian _printf("An error occurred when calling ompd_get_thread_in_parallel! Error "
896d2a6e165SVignesh Balasubramanian "code: %d",
897d2a6e165SVignesh Balasubramanian retVal);
898d2a6e165SVignesh Balasubramanian return Py_BuildValue("l", retVal);
899d2a6e165SVignesh Balasubramanian }
900d2a6e165SVignesh Balasubramanian return PyCapsule_New(threadHandle, "ThreadHandle",
901d2a6e165SVignesh Balasubramanian my_thread_capsule_destructor);
902d2a6e165SVignesh Balasubramanian }
903d2a6e165SVignesh Balasubramanian
904d2a6e165SVignesh Balasubramanian /**
905d2a6e165SVignesh Balasubramanian * Returns a PyCapsule pointer to the parallel handle of the current parallel
906d2a6e165SVignesh Balasubramanian * region associated with a thread.
907d2a6e165SVignesh Balasubramanian */
call_ompd_get_curr_parallel_handle(PyObject * self,PyObject * args)908d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_get_curr_parallel_handle(PyObject *self,
909d2a6e165SVignesh Balasubramanian PyObject *args) {
910d2a6e165SVignesh Balasubramanian PyObject *threadHandlePy = PyTuple_GetItem(args, 0);
911d2a6e165SVignesh Balasubramanian ompd_thread_handle_t *threadHandle =
912d2a6e165SVignesh Balasubramanian (ompd_thread_handle_t *)(PyCapsule_GetPointer(threadHandlePy,
913d2a6e165SVignesh Balasubramanian "ThreadHandle"));
914d2a6e165SVignesh Balasubramanian ompd_parallel_handle_t *parallelHandle;
915d2a6e165SVignesh Balasubramanian
916d2a6e165SVignesh Balasubramanian ompd_rc_t retVal =
917d2a6e165SVignesh Balasubramanian ompd_get_curr_parallel_handle(threadHandle, ¶llelHandle);
918d2a6e165SVignesh Balasubramanian
919d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
920d2a6e165SVignesh Balasubramanian _printf("An error occurred when calling ompd_get_curr_parallel_handle! "
921d2a6e165SVignesh Balasubramanian "Error code: %d",
922d2a6e165SVignesh Balasubramanian retVal);
923d2a6e165SVignesh Balasubramanian return Py_BuildValue("l", retVal);
924d2a6e165SVignesh Balasubramanian }
925d2a6e165SVignesh Balasubramanian return PyCapsule_New(parallelHandle, "ParallelHandle",
926d2a6e165SVignesh Balasubramanian my_parallel_capsule_destructor);
927d2a6e165SVignesh Balasubramanian }
928d2a6e165SVignesh Balasubramanian
929d2a6e165SVignesh Balasubramanian /**
930d2a6e165SVignesh Balasubramanian * Returns a PyCapsule pointer to the parallel handle for the parallel region
931d2a6e165SVignesh Balasubramanian * enclosing the parallel region specified by parallel_handle.
932d2a6e165SVignesh Balasubramanian */
call_ompd_get_enclosing_parallel_handle(PyObject * self,PyObject * args)933d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_get_enclosing_parallel_handle(PyObject *self,
934d2a6e165SVignesh Balasubramanian PyObject *args) {
935d2a6e165SVignesh Balasubramanian PyObject *parallelHandlePy = PyTuple_GetItem(args, 0);
936d2a6e165SVignesh Balasubramanian ompd_parallel_handle_t *parallelHandle =
937d2a6e165SVignesh Balasubramanian (ompd_parallel_handle_t *)(PyCapsule_GetPointer(parallelHandlePy,
938d2a6e165SVignesh Balasubramanian "ParallelHandle"));
939d2a6e165SVignesh Balasubramanian ompd_parallel_handle_t *enclosingParallelHandle;
940d2a6e165SVignesh Balasubramanian
941d2a6e165SVignesh Balasubramanian ompd_rc_t retVal = ompd_get_enclosing_parallel_handle(
942d2a6e165SVignesh Balasubramanian parallelHandle, &enclosingParallelHandle);
943d2a6e165SVignesh Balasubramanian
944d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
945d2a6e165SVignesh Balasubramanian _printf("An error occurred when calling "
946d2a6e165SVignesh Balasubramanian "ompd_get_enclosing_parallel_handle! Error code: %d",
947d2a6e165SVignesh Balasubramanian retVal);
948d2a6e165SVignesh Balasubramanian return Py_BuildValue("l", retVal);
949d2a6e165SVignesh Balasubramanian }
950d2a6e165SVignesh Balasubramanian return PyCapsule_New(enclosingParallelHandle, "ParallelHandle",
951d2a6e165SVignesh Balasubramanian my_parallel_capsule_destructor);
952d2a6e165SVignesh Balasubramanian }
953d2a6e165SVignesh Balasubramanian
954d2a6e165SVignesh Balasubramanian /**
955d2a6e165SVignesh Balasubramanian * Returns a PyCapsule pointer to the parallel handle for the parallel region
956d2a6e165SVignesh Balasubramanian * enclosing the task specified.
957d2a6e165SVignesh Balasubramanian */
call_ompd_get_task_parallel_handle(PyObject * self,PyObject * args)958d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_get_task_parallel_handle(PyObject *self,
959d2a6e165SVignesh Balasubramanian PyObject *args) {
960d2a6e165SVignesh Balasubramanian PyObject *taskHandlePy = PyTuple_GetItem(args, 0);
961d2a6e165SVignesh Balasubramanian ompd_task_handle_t *taskHandle =
962d2a6e165SVignesh Balasubramanian PyCapsule_GetPointer(taskHandlePy, "TaskHandle");
963d2a6e165SVignesh Balasubramanian ompd_parallel_handle_t *taskParallelHandle;
964d2a6e165SVignesh Balasubramanian
965d2a6e165SVignesh Balasubramanian ompd_rc_t retVal =
966d2a6e165SVignesh Balasubramanian ompd_get_task_parallel_handle(taskHandle, &taskParallelHandle);
967d2a6e165SVignesh Balasubramanian
968d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
969d2a6e165SVignesh Balasubramanian _printf("An error occurred when calling ompd_get_task_parallel_handle! "
970d2a6e165SVignesh Balasubramanian "Error code: %d");
971d2a6e165SVignesh Balasubramanian return Py_BuildValue("l", retVal);
972d2a6e165SVignesh Balasubramanian }
973d2a6e165SVignesh Balasubramanian return PyCapsule_New(taskParallelHandle, "ParallelHandle",
974d2a6e165SVignesh Balasubramanian my_parallel_capsule_destructor);
975d2a6e165SVignesh Balasubramanian }
976d2a6e165SVignesh Balasubramanian
977d2a6e165SVignesh Balasubramanian /**
978d2a6e165SVignesh Balasubramanian * Releases a parallel handle; is called in by the destructor of a Python
979d2a6e165SVignesh Balasubramanian * parallel_handle object.
980d2a6e165SVignesh Balasubramanian */
call_ompd_rel_parallel_handle(PyObject * self,PyObject * args)981d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_rel_parallel_handle(PyObject *self, PyObject *args) {
982d2a6e165SVignesh Balasubramanian PyObject *parallelHandlePy = PyTuple_GetItem(args, 0);
983d2a6e165SVignesh Balasubramanian ompd_parallel_handle_t *parallelHandle =
984d2a6e165SVignesh Balasubramanian (ompd_parallel_handle_t *)(PyCapsule_GetPointer(parallelHandlePy,
985d2a6e165SVignesh Balasubramanian "ParallelHandle"));
986d2a6e165SVignesh Balasubramanian
987d2a6e165SVignesh Balasubramanian ompd_rc_t retVal = ompd_rel_parallel_handle(parallelHandle);
988d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
989d2a6e165SVignesh Balasubramanian _printf("An error occurred when calling ompd_rel_parallel_handle! Error "
990d2a6e165SVignesh Balasubramanian "code: %d",
991d2a6e165SVignesh Balasubramanian retVal);
992d2a6e165SVignesh Balasubramanian }
993d2a6e165SVignesh Balasubramanian return Py_BuildValue("l", retVal);
994d2a6e165SVignesh Balasubramanian }
995d2a6e165SVignesh Balasubramanian
996d2a6e165SVignesh Balasubramanian /**
997d2a6e165SVignesh Balasubramanian * Returns a PyCapsule pointer to the task handle of the current task region
998d2a6e165SVignesh Balasubramanian * associated with a thread.
999d2a6e165SVignesh Balasubramanian */
call_ompd_get_curr_task_handle(PyObject * self,PyObject * args)1000d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_get_curr_task_handle(PyObject *self,
1001d2a6e165SVignesh Balasubramanian PyObject *args) {
1002d2a6e165SVignesh Balasubramanian PyObject *threadHandlePy = PyTuple_GetItem(args, 0);
1003d2a6e165SVignesh Balasubramanian ompd_thread_handle_t *threadHandle =
1004d2a6e165SVignesh Balasubramanian (ompd_thread_handle_t *)(PyCapsule_GetPointer(threadHandlePy,
1005d2a6e165SVignesh Balasubramanian "ThreadHandle"));
1006d2a6e165SVignesh Balasubramanian ompd_task_handle_t *taskHandle;
1007d2a6e165SVignesh Balasubramanian
1008d2a6e165SVignesh Balasubramanian ompd_rc_t retVal = ompd_get_curr_task_handle(threadHandle, &taskHandle);
1009d2a6e165SVignesh Balasubramanian
1010d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
1011d2a6e165SVignesh Balasubramanian _printf("An error occurred when calling ompd_get_curr_task_handle! Error "
1012d2a6e165SVignesh Balasubramanian "code: %d",
1013d2a6e165SVignesh Balasubramanian retVal);
1014d2a6e165SVignesh Balasubramanian return Py_BuildValue("l", retVal);
1015d2a6e165SVignesh Balasubramanian }
1016d2a6e165SVignesh Balasubramanian return PyCapsule_New(taskHandle, "TaskHandle", my_task_capsule_destructor);
1017d2a6e165SVignesh Balasubramanian }
1018d2a6e165SVignesh Balasubramanian
1019d2a6e165SVignesh Balasubramanian /**
1020d2a6e165SVignesh Balasubramanian * Returns a task handle for the task that created the task specified.
1021d2a6e165SVignesh Balasubramanian */
call_ompd_get_generating_task_handle(PyObject * self,PyObject * args)1022d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_get_generating_task_handle(PyObject *self,
1023d2a6e165SVignesh Balasubramanian PyObject *args) {
1024d2a6e165SVignesh Balasubramanian PyObject *taskHandlePy = PyTuple_GetItem(args, 0);
1025d2a6e165SVignesh Balasubramanian ompd_task_handle_t *taskHandle =
1026d2a6e165SVignesh Balasubramanian (ompd_task_handle_t *)(PyCapsule_GetPointer(taskHandlePy, "TaskHandle"));
1027d2a6e165SVignesh Balasubramanian ompd_task_handle_t *generatingTaskHandle;
1028d2a6e165SVignesh Balasubramanian
1029d2a6e165SVignesh Balasubramanian ompd_rc_t retVal =
1030d2a6e165SVignesh Balasubramanian ompd_get_generating_task_handle(taskHandle, &generatingTaskHandle);
1031d2a6e165SVignesh Balasubramanian
1032d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
1033d2a6e165SVignesh Balasubramanian _printf("An error occurred when calling ompd_get_generating_task_handle! "
1034d2a6e165SVignesh Balasubramanian "Error code: %d",
1035d2a6e165SVignesh Balasubramanian retVal);
1036d2a6e165SVignesh Balasubramanian return Py_BuildValue("l", retVal);
1037d2a6e165SVignesh Balasubramanian }
1038d2a6e165SVignesh Balasubramanian return PyCapsule_New(generatingTaskHandle, "TaskHandle",
1039d2a6e165SVignesh Balasubramanian my_task_capsule_destructor);
1040d2a6e165SVignesh Balasubramanian }
1041d2a6e165SVignesh Balasubramanian
1042d2a6e165SVignesh Balasubramanian /**
1043d2a6e165SVignesh Balasubramanian * Returns the task handle for the task that scheduled the task specified.
1044d2a6e165SVignesh Balasubramanian */
call_ompd_get_scheduling_task_handle(PyObject * self,PyObject * args)1045d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_get_scheduling_task_handle(PyObject *self,
1046d2a6e165SVignesh Balasubramanian PyObject *args) {
1047d2a6e165SVignesh Balasubramanian PyObject *taskHandlePy = PyTuple_GetItem(args, 0);
1048d2a6e165SVignesh Balasubramanian ompd_task_handle_t *taskHandle =
1049d2a6e165SVignesh Balasubramanian (ompd_task_handle_t *)(PyCapsule_GetPointer(taskHandlePy, "TaskHandle"));
1050d2a6e165SVignesh Balasubramanian ompd_task_handle_t *schedulingTaskHandle;
1051d2a6e165SVignesh Balasubramanian
1052d2a6e165SVignesh Balasubramanian ompd_rc_t retVal =
1053d2a6e165SVignesh Balasubramanian ompd_get_scheduling_task_handle(taskHandle, &schedulingTaskHandle);
1054d2a6e165SVignesh Balasubramanian
1055d2a6e165SVignesh Balasubramanian if (retVal == ompd_rc_unavailable) {
1056d2a6e165SVignesh Balasubramanian return Py_None;
1057d2a6e165SVignesh Balasubramanian } else if (retVal != ompd_rc_ok) {
1058d2a6e165SVignesh Balasubramanian _printf("An error occurred when calling ompd_get_scheduling_task_handle! "
1059d2a6e165SVignesh Balasubramanian "Error code: %d",
1060d2a6e165SVignesh Balasubramanian retVal);
1061d2a6e165SVignesh Balasubramanian return Py_BuildValue("l", retVal);
1062d2a6e165SVignesh Balasubramanian }
1063d2a6e165SVignesh Balasubramanian return PyCapsule_New(schedulingTaskHandle, "TaskHandle",
1064d2a6e165SVignesh Balasubramanian my_task_capsule_destructor);
1065d2a6e165SVignesh Balasubramanian }
1066d2a6e165SVignesh Balasubramanian
1067d2a6e165SVignesh Balasubramanian /**
1068d2a6e165SVignesh Balasubramanian * Returns task handles for the implicit tasks associated with a parallel
1069d2a6e165SVignesh Balasubramanian * region.
1070d2a6e165SVignesh Balasubramanian */
call_ompd_get_task_in_parallel(PyObject * self,PyObject * args)1071d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_get_task_in_parallel(PyObject *self,
1072d2a6e165SVignesh Balasubramanian PyObject *args) {
1073d2a6e165SVignesh Balasubramanian PyObject *parallelHandlePy = PyTuple_GetItem(args, 0);
1074d2a6e165SVignesh Balasubramanian int threadNum = (int)PyLong_AsLong(PyTuple_GetItem(args, 1));
1075d2a6e165SVignesh Balasubramanian ompd_parallel_handle_t *parallelHandle =
1076d2a6e165SVignesh Balasubramanian (ompd_parallel_handle_t *)(PyCapsule_GetPointer(parallelHandlePy,
1077d2a6e165SVignesh Balasubramanian "ParallelHandle"));
1078d2a6e165SVignesh Balasubramanian ompd_task_handle_t *taskHandle;
1079d2a6e165SVignesh Balasubramanian
1080d2a6e165SVignesh Balasubramanian ompd_rc_t retVal =
1081d2a6e165SVignesh Balasubramanian ompd_get_task_in_parallel(parallelHandle, threadNum, &taskHandle);
1082d2a6e165SVignesh Balasubramanian
1083d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
1084d2a6e165SVignesh Balasubramanian _printf("An error occurred when calling ompd_get_task_in_parallel! Error "
1085d2a6e165SVignesh Balasubramanian "code: %d",
1086d2a6e165SVignesh Balasubramanian retVal);
1087d2a6e165SVignesh Balasubramanian return Py_BuildValue("l", retVal);
1088d2a6e165SVignesh Balasubramanian }
1089d2a6e165SVignesh Balasubramanian return PyCapsule_New(taskHandle, "TaskHandle", my_task_capsule_destructor);
1090d2a6e165SVignesh Balasubramanian }
1091d2a6e165SVignesh Balasubramanian
1092d2a6e165SVignesh Balasubramanian /**
1093d2a6e165SVignesh Balasubramanian * Releases a task handle; is called by the destructor of a Python task_handle
1094d2a6e165SVignesh Balasubramanian * object.
1095d2a6e165SVignesh Balasubramanian */
call_ompd_rel_task_handle(PyObject * self,PyObject * args)1096d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_rel_task_handle(PyObject *self, PyObject *args) {
1097d2a6e165SVignesh Balasubramanian PyObject *taskHandlePy = PyTuple_GetItem(args, 0);
1098d2a6e165SVignesh Balasubramanian ompd_task_handle_t *taskHandle =
1099d2a6e165SVignesh Balasubramanian (ompd_task_handle_t *)(PyCapsule_GetPointer(taskHandlePy, "TaskHandle"));
1100d2a6e165SVignesh Balasubramanian
1101d2a6e165SVignesh Balasubramanian ompd_rc_t retVal = ompd_rel_task_handle(taskHandle);
1102d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
1103d2a6e165SVignesh Balasubramanian _printf(
1104d2a6e165SVignesh Balasubramanian "An error occurred when calling ompd_rel_task_handle! Error code: %d",
1105d2a6e165SVignesh Balasubramanian retVal);
1106d2a6e165SVignesh Balasubramanian }
1107d2a6e165SVignesh Balasubramanian return Py_BuildValue("l", retVal);
1108d2a6e165SVignesh Balasubramanian }
1109d2a6e165SVignesh Balasubramanian
1110d2a6e165SVignesh Balasubramanian /**
1111d2a6e165SVignesh Balasubramanian * Calls ompd_get_task_frame and returns a PyCapsule for the enter frame of the
1112d2a6e165SVignesh Balasubramanian * given task.
1113d2a6e165SVignesh Balasubramanian */
call_ompd_get_task_frame(PyObject * self,PyObject * args)1114d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_get_task_frame(PyObject *self, PyObject *args) {
1115d2a6e165SVignesh Balasubramanian PyObject *taskHandlePy = PyTuple_GetItem(args, 0);
1116d2a6e165SVignesh Balasubramanian ompd_task_handle_t *taskHandle =
1117d2a6e165SVignesh Balasubramanian (ompd_task_handle_t *)PyCapsule_GetPointer(taskHandlePy, "TaskHandle");
1118d2a6e165SVignesh Balasubramanian ompd_frame_info_t exitFrameInfo;
1119d2a6e165SVignesh Balasubramanian ompd_frame_info_t enterFrameInfo;
1120d2a6e165SVignesh Balasubramanian
1121d2a6e165SVignesh Balasubramanian ompd_rc_t retVal =
1122d2a6e165SVignesh Balasubramanian ompd_get_task_frame(taskHandle, &exitFrameInfo, &enterFrameInfo);
1123d2a6e165SVignesh Balasubramanian
1124d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
1125d2a6e165SVignesh Balasubramanian _printf(
1126d2a6e165SVignesh Balasubramanian "An error occurred when calling ompd_get_task_frame! Error code: %d",
1127d2a6e165SVignesh Balasubramanian retVal);
1128d2a6e165SVignesh Balasubramanian return Py_BuildValue("l", retVal);
1129d2a6e165SVignesh Balasubramanian }
1130d2a6e165SVignesh Balasubramanian
1131d2a6e165SVignesh Balasubramanian PyObject *result = PyTuple_New(4);
1132d2a6e165SVignesh Balasubramanian PyTuple_SetItem(
1133d2a6e165SVignesh Balasubramanian result, 0, PyLong_FromUnsignedLong(enterFrameInfo.frame_address.address));
1134d2a6e165SVignesh Balasubramanian PyTuple_SetItem(result, 1,
1135d2a6e165SVignesh Balasubramanian PyLong_FromUnsignedLong(enterFrameInfo.frame_flag));
1136d2a6e165SVignesh Balasubramanian PyTuple_SetItem(result, 2,
1137d2a6e165SVignesh Balasubramanian PyLong_FromUnsignedLong(exitFrameInfo.frame_address.address));
1138d2a6e165SVignesh Balasubramanian PyTuple_SetItem(result, 3, PyLong_FromUnsignedLong(exitFrameInfo.frame_flag));
1139d2a6e165SVignesh Balasubramanian return result;
1140d2a6e165SVignesh Balasubramanian }
1141d2a6e165SVignesh Balasubramanian
1142d2a6e165SVignesh Balasubramanian /**
1143d2a6e165SVignesh Balasubramanian * Calls ompd_get_icv_from_scope.
1144d2a6e165SVignesh Balasubramanian */
call_ompd_get_icv_from_scope(PyObject * self,PyObject * args)1145d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_get_icv_from_scope(PyObject *self, PyObject *args) {
1146d2a6e165SVignesh Balasubramanian PyObject *addrSpaceHandlePy = PyTuple_GetItem(args, 0);
1147d2a6e165SVignesh Balasubramanian PyObject *scopePy = PyTuple_GetItem(args, 1);
1148d2a6e165SVignesh Balasubramanian PyObject *icvIdPy = PyTuple_GetItem(args, 2);
1149d2a6e165SVignesh Balasubramanian
1150d2a6e165SVignesh Balasubramanian ompd_scope_t scope = (ompd_scope_t)PyLong_AsLong(scopePy);
1151d2a6e165SVignesh Balasubramanian ompd_address_space_handle_t *addrSpaceHandle;
1152d2a6e165SVignesh Balasubramanian switch (scope) {
1153d2a6e165SVignesh Balasubramanian case ompd_scope_thread:
1154d2a6e165SVignesh Balasubramanian addrSpaceHandle = (ompd_address_space_handle_t *)PyCapsule_GetPointer(
1155d2a6e165SVignesh Balasubramanian addrSpaceHandlePy, "ThreadHandle");
1156d2a6e165SVignesh Balasubramanian break;
1157d2a6e165SVignesh Balasubramanian case ompd_scope_parallel:
1158d2a6e165SVignesh Balasubramanian addrSpaceHandle = (ompd_address_space_handle_t *)PyCapsule_GetPointer(
1159d2a6e165SVignesh Balasubramanian addrSpaceHandlePy, "ParallelHandle");
1160d2a6e165SVignesh Balasubramanian break;
1161d2a6e165SVignesh Balasubramanian case ompd_scope_implicit_task:
1162d2a6e165SVignesh Balasubramanian addrSpaceHandle = (ompd_address_space_handle_t *)PyCapsule_GetPointer(
1163d2a6e165SVignesh Balasubramanian addrSpaceHandlePy, "TaskHandle");
1164d2a6e165SVignesh Balasubramanian break;
1165d2a6e165SVignesh Balasubramanian case ompd_scope_task:
1166d2a6e165SVignesh Balasubramanian addrSpaceHandle = (ompd_address_space_handle_t *)PyCapsule_GetPointer(
1167d2a6e165SVignesh Balasubramanian addrSpaceHandlePy, "TaskHandle");
1168d2a6e165SVignesh Balasubramanian break;
1169d2a6e165SVignesh Balasubramanian default:
1170d2a6e165SVignesh Balasubramanian addrSpaceHandle = (ompd_address_space_handle_t *)PyCapsule_GetPointer(
1171d2a6e165SVignesh Balasubramanian addrSpaceHandlePy, "AddressSpace");
1172d2a6e165SVignesh Balasubramanian break;
1173d2a6e165SVignesh Balasubramanian }
1174d2a6e165SVignesh Balasubramanian
1175d2a6e165SVignesh Balasubramanian ompd_icv_id_t icvId = (ompd_icv_id_t)PyLong_AsLong(icvIdPy);
1176d2a6e165SVignesh Balasubramanian ompd_word_t icvValue;
1177d2a6e165SVignesh Balasubramanian
1178d2a6e165SVignesh Balasubramanian ompd_rc_t retVal =
1179d2a6e165SVignesh Balasubramanian ompd_get_icv_from_scope(addrSpaceHandle, scope, icvId, &icvValue);
1180d2a6e165SVignesh Balasubramanian
1181d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
1182d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_incomplete) {
1183d2a6e165SVignesh Balasubramanian _printf("An error occurred when calling ompd_get_icv_from_scope(%i, %i): "
1184d2a6e165SVignesh Balasubramanian "Error code: %d",
1185d2a6e165SVignesh Balasubramanian scope, icvId, retVal);
1186d2a6e165SVignesh Balasubramanian }
1187d2a6e165SVignesh Balasubramanian return Py_None;
1188d2a6e165SVignesh Balasubramanian }
1189d2a6e165SVignesh Balasubramanian return PyLong_FromLong(icvValue);
1190d2a6e165SVignesh Balasubramanian }
1191d2a6e165SVignesh Balasubramanian
1192d2a6e165SVignesh Balasubramanian /**
1193d2a6e165SVignesh Balasubramanian * Calls ompd_enumerate_icvs.
1194d2a6e165SVignesh Balasubramanian */
call_ompd_enumerate_icvs(PyObject * self,PyObject * args)1195d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_enumerate_icvs(PyObject *self, PyObject *args) {
1196d2a6e165SVignesh Balasubramanian PyObject *addrSpaceHandlePy = PyTuple_GetItem(args, 0);
1197d2a6e165SVignesh Balasubramanian PyObject *currentPy = PyTuple_GetItem(args, 1);
1198d2a6e165SVignesh Balasubramanian ompd_icv_id_t current = (ompd_icv_id_t)(PyLong_AsLong(currentPy));
1199d2a6e165SVignesh Balasubramanian ompd_address_space_handle_t *addrSpaceHandle =
1200d2a6e165SVignesh Balasubramanian (ompd_address_space_handle_t *)PyCapsule_GetPointer(addrSpaceHandlePy,
1201d2a6e165SVignesh Balasubramanian "AddressSpace");
1202d2a6e165SVignesh Balasubramanian
1203d2a6e165SVignesh Balasubramanian const char *nextIcv;
1204d2a6e165SVignesh Balasubramanian ompd_scope_t nextScope;
1205d2a6e165SVignesh Balasubramanian int more;
1206d2a6e165SVignesh Balasubramanian ompd_icv_id_t nextId;
1207d2a6e165SVignesh Balasubramanian
1208d2a6e165SVignesh Balasubramanian ompd_rc_t retVal = ompd_enumerate_icvs(addrSpaceHandle, current, &nextId,
1209d2a6e165SVignesh Balasubramanian &nextIcv, &nextScope, &more);
1210d2a6e165SVignesh Balasubramanian
1211d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
1212d2a6e165SVignesh Balasubramanian _printf(
1213d2a6e165SVignesh Balasubramanian "An error occurred when calling ompd_enumerate_icvs! Error code: %d",
1214d2a6e165SVignesh Balasubramanian retVal);
1215d2a6e165SVignesh Balasubramanian return Py_None;
1216d2a6e165SVignesh Balasubramanian }
1217d2a6e165SVignesh Balasubramanian PyObject *retTuple = PyTuple_New(4);
1218d2a6e165SVignesh Balasubramanian PyTuple_SetItem(retTuple, 0, PyLong_FromUnsignedLong(nextId));
1219d2a6e165SVignesh Balasubramanian PyTuple_SetItem(retTuple, 1, PyUnicode_FromString(nextIcv));
1220d2a6e165SVignesh Balasubramanian PyTuple_SetItem(retTuple, 2, PyLong_FromUnsignedLong(nextScope));
1221d2a6e165SVignesh Balasubramanian PyTuple_SetItem(retTuple, 3, PyLong_FromLong(more));
1222d2a6e165SVignesh Balasubramanian return retTuple;
1223d2a6e165SVignesh Balasubramanian }
1224d2a6e165SVignesh Balasubramanian
1225d2a6e165SVignesh Balasubramanian /**
1226d2a6e165SVignesh Balasubramanian * Calls ompd_enumerate_states.
1227d2a6e165SVignesh Balasubramanian */
call_ompd_enumerate_states(PyObject * self,PyObject * args)1228d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_enumerate_states(PyObject *self, PyObject *args) {
1229d2a6e165SVignesh Balasubramanian PyObject *addrSpaceHandlePy = PyTuple_GetItem(args, 0);
1230d2a6e165SVignesh Balasubramanian ompd_address_space_handle_t *addrSpaceHandle =
1231d2a6e165SVignesh Balasubramanian (ompd_address_space_handle_t *)PyCapsule_GetPointer(addrSpaceHandlePy,
1232d2a6e165SVignesh Balasubramanian "AddressSpace");
1233d2a6e165SVignesh Balasubramanian ompd_word_t currentState =
1234d2a6e165SVignesh Balasubramanian (ompd_word_t)PyLong_AsLong(PyTuple_GetItem(args, 1));
1235d2a6e165SVignesh Balasubramanian
1236d2a6e165SVignesh Balasubramanian ompd_word_t nextState;
1237d2a6e165SVignesh Balasubramanian const char *nextStateName;
1238d2a6e165SVignesh Balasubramanian ompd_word_t moreEnums;
1239d2a6e165SVignesh Balasubramanian
1240d2a6e165SVignesh Balasubramanian ompd_rc_t retVal = ompd_enumerate_states(
1241d2a6e165SVignesh Balasubramanian addrSpaceHandle, currentState, &nextState, &nextStateName, &moreEnums);
1242d2a6e165SVignesh Balasubramanian
1243d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
1244d2a6e165SVignesh Balasubramanian _printf(
1245d2a6e165SVignesh Balasubramanian "An error occurred when calling ompd_enumerate_states! Error code: %d",
1246d2a6e165SVignesh Balasubramanian retVal);
1247d2a6e165SVignesh Balasubramanian return Py_None;
1248d2a6e165SVignesh Balasubramanian }
1249d2a6e165SVignesh Balasubramanian PyObject *retTuple = PyTuple_New(3);
1250d2a6e165SVignesh Balasubramanian PyTuple_SetItem(retTuple, 0, PyLong_FromLong(nextState));
1251d2a6e165SVignesh Balasubramanian PyTuple_SetItem(retTuple, 1, PyUnicode_FromString(nextStateName));
1252d2a6e165SVignesh Balasubramanian PyTuple_SetItem(retTuple, 2, PyLong_FromLong(moreEnums));
1253d2a6e165SVignesh Balasubramanian return retTuple;
1254d2a6e165SVignesh Balasubramanian }
1255d2a6e165SVignesh Balasubramanian
1256d2a6e165SVignesh Balasubramanian /**
1257d2a6e165SVignesh Balasubramanian * Calls ompd_get_state.
1258d2a6e165SVignesh Balasubramanian */
call_ompd_get_state(PyObject * self,PyObject * args)1259d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_get_state(PyObject *self, PyObject *args) {
1260d2a6e165SVignesh Balasubramanian PyObject *threadHandlePy = PyTuple_GetItem(args, 0);
1261d2a6e165SVignesh Balasubramanian ompd_thread_handle_t *threadHandle =
1262d2a6e165SVignesh Balasubramanian (ompd_thread_handle_t *)PyCapsule_GetPointer(threadHandlePy,
1263d2a6e165SVignesh Balasubramanian "ThreadHandle");
1264d2a6e165SVignesh Balasubramanian ompd_word_t state;
1265d2a6e165SVignesh Balasubramanian ompd_wait_id_t waitId;
1266d2a6e165SVignesh Balasubramanian
1267d2a6e165SVignesh Balasubramanian ompd_rc_t retVal = ompd_get_state(threadHandle, &state, &waitId);
1268d2a6e165SVignesh Balasubramanian
1269d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
1270d2a6e165SVignesh Balasubramanian _printf("An error occurred when calling ompd_get_state! Error code: %d",
1271d2a6e165SVignesh Balasubramanian retVal);
1272d2a6e165SVignesh Balasubramanian return Py_None;
1273d2a6e165SVignesh Balasubramanian }
1274d2a6e165SVignesh Balasubramanian PyObject *retTuple = PyTuple_New(2);
1275d2a6e165SVignesh Balasubramanian PyTuple_SetItem(retTuple, 0, PyLong_FromLong(state));
1276d2a6e165SVignesh Balasubramanian PyTuple_SetItem(retTuple, 1, PyLong_FromUnsignedLong(waitId));
1277d2a6e165SVignesh Balasubramanian return retTuple;
1278d2a6e165SVignesh Balasubramanian }
1279d2a6e165SVignesh Balasubramanian
1280d2a6e165SVignesh Balasubramanian /**
1281d2a6e165SVignesh Balasubramanian * Calls ompd_get_task_function and returns entry point of the code that
1282d2a6e165SVignesh Balasubramanian * corresponds to the code executed by the task.
1283d2a6e165SVignesh Balasubramanian */
call_ompd_get_task_function(PyObject * self,PyObject * args)1284d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_get_task_function(PyObject *self, PyObject *args) {
1285d2a6e165SVignesh Balasubramanian PyObject *taskHandlePy = PyTuple_GetItem(args, 0);
1286d2a6e165SVignesh Balasubramanian ompd_task_handle_t *taskHandle =
1287d2a6e165SVignesh Balasubramanian (ompd_task_handle_t *)PyCapsule_GetPointer(taskHandlePy, "TaskHandle");
1288d2a6e165SVignesh Balasubramanian ompd_address_t entryPoint;
1289d2a6e165SVignesh Balasubramanian
1290d2a6e165SVignesh Balasubramanian ompd_rc_t retVal = ompd_get_task_function(taskHandle, &entryPoint);
1291d2a6e165SVignesh Balasubramanian
1292d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
1293d2a6e165SVignesh Balasubramanian _printf(
1294d2a6e165SVignesh Balasubramanian "An error occurred when calling ompd_get_task_function! Error code: %d",
1295d2a6e165SVignesh Balasubramanian retVal);
1296d2a6e165SVignesh Balasubramanian return Py_None;
1297d2a6e165SVignesh Balasubramanian }
1298d2a6e165SVignesh Balasubramanian return PyLong_FromLong((long)entryPoint.address);
1299d2a6e165SVignesh Balasubramanian }
1300d2a6e165SVignesh Balasubramanian
1301d2a6e165SVignesh Balasubramanian /**
1302d2a6e165SVignesh Balasubramanian * Prints pointer stored inside PyCapusle.
1303d2a6e165SVignesh Balasubramanian */
print_capsule(PyObject * self,PyObject * args)1304d2a6e165SVignesh Balasubramanian static PyObject *print_capsule(PyObject *self, PyObject *args) {
1305d2a6e165SVignesh Balasubramanian PyObject *capsule = PyTuple_GetItem(args, 0);
1306d2a6e165SVignesh Balasubramanian PyObject *name = PyTuple_GetItem(args, 1);
1307d2a6e165SVignesh Balasubramanian void *pointer =
1308d2a6e165SVignesh Balasubramanian PyCapsule_GetPointer(capsule, PyUnicode_AsUTF8AndSize(name, NULL));
1309d2a6e165SVignesh Balasubramanian _printf("Capsule pointer: %p", pointer);
1310d2a6e165SVignesh Balasubramanian return Py_None;
1311d2a6e165SVignesh Balasubramanian }
1312d2a6e165SVignesh Balasubramanian
1313d2a6e165SVignesh Balasubramanian /**
1314d2a6e165SVignesh Balasubramanian * Calls ompd_get_thread_id for given handle and returns the thread id as a
1315d2a6e165SVignesh Balasubramanian * long.
1316d2a6e165SVignesh Balasubramanian */
call_ompd_get_thread_id(PyObject * self,PyObject * args)1317d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_get_thread_id(PyObject *self, PyObject *args) {
1318d2a6e165SVignesh Balasubramanian PyObject *threadHandlePy = PyTuple_GetItem(args, 0);
1319d2a6e165SVignesh Balasubramanian ompd_thread_handle_t *threadHandle =
1320d2a6e165SVignesh Balasubramanian (ompd_thread_handle_t *)(PyCapsule_GetPointer(threadHandlePy,
1321d2a6e165SVignesh Balasubramanian "ThreadHandle"));
1322d2a6e165SVignesh Balasubramanian ompd_thread_id_t kind = 0; // OMPD_THREAD_ID_PTHREAD
1323d2a6e165SVignesh Balasubramanian ompd_size_t sizeOfId = (ompd_size_t)sizeof(pthread_t);
1324d2a6e165SVignesh Balasubramanian
1325d2a6e165SVignesh Balasubramanian uint64_t thread;
1326d2a6e165SVignesh Balasubramanian ompd_rc_t retVal = ompd_get_thread_id(threadHandle, kind, sizeOfId, &thread);
1327d2a6e165SVignesh Balasubramanian
1328d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
1329d2a6e165SVignesh Balasubramanian kind = 1; // OMPD_THREAD_ID_LWP
1330d2a6e165SVignesh Balasubramanian retVal = ompd_get_thread_id(threadHandle, kind, sizeOfId, &thread);
1331d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
1332d2a6e165SVignesh Balasubramanian _printf(
1333d2a6e165SVignesh Balasubramanian "An error occurred when calling ompd_get_thread_id! Error code: %d",
1334d2a6e165SVignesh Balasubramanian retVal);
1335d2a6e165SVignesh Balasubramanian return Py_None;
1336d2a6e165SVignesh Balasubramanian }
1337d2a6e165SVignesh Balasubramanian }
1338d2a6e165SVignesh Balasubramanian return PyLong_FromLong(thread);
1339d2a6e165SVignesh Balasubramanian }
1340d2a6e165SVignesh Balasubramanian
1341d2a6e165SVignesh Balasubramanian /**
1342d2a6e165SVignesh Balasubramanian * Calls ompd_get_tool_data and returns a tuple containing the value and pointer
1343d2a6e165SVignesh Balasubramanian * of the ompt_data_t union for the selected scope.
1344d2a6e165SVignesh Balasubramanian */
call_ompd_get_tool_data(PyObject * self,PyObject * args)1345d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_get_tool_data(PyObject *self, PyObject *args) {
1346d2a6e165SVignesh Balasubramanian PyObject *scopePy = PyTuple_GetItem(args, 0);
1347d2a6e165SVignesh Balasubramanian ompd_scope_t scope = (ompd_scope_t)(PyLong_AsLong(scopePy));
1348d2a6e165SVignesh Balasubramanian PyObject *handlePy = PyTuple_GetItem(args, 1);
1349d2a6e165SVignesh Balasubramanian void *handle = NULL;
1350d2a6e165SVignesh Balasubramanian
1351d2a6e165SVignesh Balasubramanian if (scope == 3) {
1352d2a6e165SVignesh Balasubramanian ompd_thread_handle_t *threadHandle =
1353d2a6e165SVignesh Balasubramanian (ompd_thread_handle_t *)(PyCapsule_GetPointer(handlePy,
1354d2a6e165SVignesh Balasubramanian "ThreadHandle"));
1355d2a6e165SVignesh Balasubramanian handle = threadHandle;
1356d2a6e165SVignesh Balasubramanian } else if (scope == 4) {
1357d2a6e165SVignesh Balasubramanian ompd_parallel_handle_t *parallelHandle =
1358d2a6e165SVignesh Balasubramanian (ompd_parallel_handle_t *)(PyCapsule_GetPointer(handlePy,
1359d2a6e165SVignesh Balasubramanian "ParallelHandle"));
1360d2a6e165SVignesh Balasubramanian handle = parallelHandle;
1361d2a6e165SVignesh Balasubramanian } else if (scope == 5 || scope == 6) {
1362d2a6e165SVignesh Balasubramanian ompd_task_handle_t *taskHandle =
1363d2a6e165SVignesh Balasubramanian (ompd_task_handle_t *)(PyCapsule_GetPointer(handlePy, "TaskHandle"));
1364d2a6e165SVignesh Balasubramanian handle = taskHandle;
1365d2a6e165SVignesh Balasubramanian } else {
1366d2a6e165SVignesh Balasubramanian _printf("An error occured when calling ompd_get_tool_data! Scope type not "
1367d2a6e165SVignesh Balasubramanian "supported.");
1368d2a6e165SVignesh Balasubramanian return Py_None;
1369d2a6e165SVignesh Balasubramanian }
1370d2a6e165SVignesh Balasubramanian
1371d2a6e165SVignesh Balasubramanian ompd_word_t value;
1372d2a6e165SVignesh Balasubramanian ompd_address_t ptr;
1373d2a6e165SVignesh Balasubramanian
1374d2a6e165SVignesh Balasubramanian ompd_rc_t retVal = ompd_get_tool_data(handle, scope, &value, &ptr);
1375d2a6e165SVignesh Balasubramanian
1376d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
1377d2a6e165SVignesh Balasubramanian _printf("An error occured when calling ompd_get_tool_data! Error code: %d",
1378d2a6e165SVignesh Balasubramanian retVal);
1379d2a6e165SVignesh Balasubramanian return Py_None;
1380d2a6e165SVignesh Balasubramanian }
1381d2a6e165SVignesh Balasubramanian
1382d2a6e165SVignesh Balasubramanian PyObject *retTuple = PyTuple_New(2);
1383d2a6e165SVignesh Balasubramanian PyTuple_SetItem(retTuple, 0, PyLong_FromLong(value));
1384d2a6e165SVignesh Balasubramanian PyTuple_SetItem(retTuple, 1, PyLong_FromLong(ptr.address));
1385d2a6e165SVignesh Balasubramanian return retTuple;
1386d2a6e165SVignesh Balasubramanian }
1387d2a6e165SVignesh Balasubramanian
1388d2a6e165SVignesh Balasubramanian /** Calls ompd_get_icv_string_from_scope.
1389d2a6e165SVignesh Balasubramanian */
call_ompd_get_icv_string_from_scope(PyObject * self,PyObject * args)1390d2a6e165SVignesh Balasubramanian static PyObject *call_ompd_get_icv_string_from_scope(PyObject *self,
1391d2a6e165SVignesh Balasubramanian PyObject *args) {
1392d2a6e165SVignesh Balasubramanian PyObject *handlePy = PyTuple_GetItem(args, 0);
1393d2a6e165SVignesh Balasubramanian PyObject *scopePy = PyTuple_GetItem(args, 1);
1394d2a6e165SVignesh Balasubramanian PyObject *icvIdPy = PyTuple_GetItem(args, 2);
1395d2a6e165SVignesh Balasubramanian
1396d2a6e165SVignesh Balasubramanian ompd_scope_t scope = (ompd_scope_t)PyLong_AsLong(scopePy);
1397d2a6e165SVignesh Balasubramanian void *handle = NULL;
1398d2a6e165SVignesh Balasubramanian switch (scope) {
1399d2a6e165SVignesh Balasubramanian case ompd_scope_thread:
1400d2a6e165SVignesh Balasubramanian handle =
1401d2a6e165SVignesh Balasubramanian (ompd_thread_handle_t *)PyCapsule_GetPointer(handlePy, "ThreadHandle");
1402d2a6e165SVignesh Balasubramanian break;
1403d2a6e165SVignesh Balasubramanian case ompd_scope_parallel:
1404d2a6e165SVignesh Balasubramanian handle = (ompd_parallel_handle_t *)PyCapsule_GetPointer(handlePy,
1405d2a6e165SVignesh Balasubramanian "ParallelHandle");
1406d2a6e165SVignesh Balasubramanian break;
1407d2a6e165SVignesh Balasubramanian case ompd_scope_implicit_task:
1408d2a6e165SVignesh Balasubramanian handle = (ompd_task_handle_t *)PyCapsule_GetPointer(handlePy, "TaskHandle");
1409d2a6e165SVignesh Balasubramanian break;
1410d2a6e165SVignesh Balasubramanian case ompd_scope_task:
1411d2a6e165SVignesh Balasubramanian handle = (ompd_task_handle_t *)PyCapsule_GetPointer(handlePy, "TaskHandle");
1412d2a6e165SVignesh Balasubramanian break;
1413d2a6e165SVignesh Balasubramanian default:
1414d2a6e165SVignesh Balasubramanian handle = (ompd_address_space_handle_t *)PyCapsule_GetPointer(
1415d2a6e165SVignesh Balasubramanian handlePy, "AddressSpace");
1416d2a6e165SVignesh Balasubramanian break;
1417d2a6e165SVignesh Balasubramanian }
1418d2a6e165SVignesh Balasubramanian
1419d2a6e165SVignesh Balasubramanian ompd_icv_id_t icvId = (ompd_icv_id_t)PyLong_AsLong(icvIdPy);
1420d2a6e165SVignesh Balasubramanian const char *icvString;
1421d2a6e165SVignesh Balasubramanian
1422d2a6e165SVignesh Balasubramanian ompd_rc_t retVal =
1423d2a6e165SVignesh Balasubramanian ompd_get_icv_string_from_scope(handle, scope, icvId, &icvString);
1424d2a6e165SVignesh Balasubramanian
1425d2a6e165SVignesh Balasubramanian if (retVal != ompd_rc_ok) {
1426d2a6e165SVignesh Balasubramanian _printf("An error occurred when calling ompd_get_icv_string_from_scope! "
1427d2a6e165SVignesh Balasubramanian "Error code: %d",
1428d2a6e165SVignesh Balasubramanian retVal);
1429d2a6e165SVignesh Balasubramanian return Py_None;
1430d2a6e165SVignesh Balasubramanian }
1431d2a6e165SVignesh Balasubramanian return PyUnicode_FromString(icvString);
1432d2a6e165SVignesh Balasubramanian }
1433d2a6e165SVignesh Balasubramanian
1434d2a6e165SVignesh Balasubramanian // Prototypes of API test functions.
1435d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_thread_handle(PyObject *self, PyObject *args);
1436d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_curr_parallel_handle(PyObject *self, PyObject *args);
1437d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_thread_in_parallel(PyObject *self, PyObject *args);
1438d2a6e165SVignesh Balasubramanian PyObject *test_ompd_thread_handle_compare(PyObject *self, PyObject *args);
1439d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_thread_id(PyObject *self, PyObject *args);
1440d2a6e165SVignesh Balasubramanian PyObject *test_ompd_rel_thread_handle(PyObject *self, PyObject *args);
1441d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_enclosing_parallel_handle(PyObject *self,
1442d2a6e165SVignesh Balasubramanian PyObject *args);
1443d2a6e165SVignesh Balasubramanian PyObject *test_ompd_parallel_handle_compare(PyObject *self, PyObject *args);
1444d2a6e165SVignesh Balasubramanian PyObject *test_ompd_rel_parallel_handle(PyObject *self, PyObject *args);
1445d2a6e165SVignesh Balasubramanian PyObject *test_ompd_initialize(PyObject *self, PyObject *noargs);
1446d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_api_version(PyObject *self, PyObject *noargs);
1447d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_version_string(PyObject *self, PyObject *noargs);
1448d2a6e165SVignesh Balasubramanian PyObject *test_ompd_finalize(PyObject *self, PyObject *noargs);
1449d2a6e165SVignesh Balasubramanian PyObject *test_ompd_process_initialize(PyObject *self, PyObject *noargs);
1450d2a6e165SVignesh Balasubramanian PyObject *test_ompd_device_initialize(PyObject *self, PyObject *noargs);
1451d2a6e165SVignesh Balasubramanian PyObject *test_ompd_rel_address_space_handle(PyObject *self, PyObject *noargs);
1452d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_omp_version(PyObject *self, PyObject *args);
1453d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_omp_version_string(PyObject *self, PyObject *args);
1454d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_curr_task_handle(PyObject *self, PyObject *args);
1455d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_task_parallel_handle(PyObject *self, PyObject *args);
1456d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_generating_task_handle(PyObject *self, PyObject *args);
1457d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_scheduling_task_handle(PyObject *self, PyObject *args);
1458d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_task_in_parallel(PyObject *self, PyObject *args);
1459d2a6e165SVignesh Balasubramanian PyObject *test_ompd_rel_task_handle(PyObject *self, PyObject *noargs);
1460d2a6e165SVignesh Balasubramanian PyObject *test_ompd_task_handle_compare(PyObject *self, PyObject *args);
1461d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_task_function(PyObject *self, PyObject *args);
1462d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_task_frame(PyObject *self, PyObject *args);
1463d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_state(PyObject *self, PyObject *args);
1464d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_display_control_vars(PyObject *self, PyObject *args);
1465d2a6e165SVignesh Balasubramanian PyObject *test_ompd_rel_display_control_vars(PyObject *self, PyObject *noargs);
1466d2a6e165SVignesh Balasubramanian PyObject *test_ompd_enumerate_icvs(PyObject *self, PyObject *noargs);
1467d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_icv_from_scope_with_addr_handle(PyObject *self,
1468d2a6e165SVignesh Balasubramanian PyObject *noargs);
1469d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_icv_from_scope_with_thread_handle(PyObject *self,
1470d2a6e165SVignesh Balasubramanian PyObject *noargs);
1471d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_icv_from_scope_with_parallel_handle(PyObject *self,
1472d2a6e165SVignesh Balasubramanian PyObject *noargs);
1473d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_icv_from_scope_with_task_handle(PyObject *self,
1474d2a6e165SVignesh Balasubramanian PyObject *noargs);
1475d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_icv_string_from_scope(PyObject *self, PyObject *noargs);
1476d2a6e165SVignesh Balasubramanian PyObject *test_ompd_get_tool_data(PyObject *self, PyObject *noargs);
1477d2a6e165SVignesh Balasubramanian PyObject *test_ompd_enumerate_states(PyObject *self, PyObject *noargs);
1478d2a6e165SVignesh Balasubramanian /**
1479d2a6e165SVignesh Balasubramanian * Binds Python function names to C functions.
1480d2a6e165SVignesh Balasubramanian */
1481d2a6e165SVignesh Balasubramanian static PyMethodDef ompdModule_methods[] = {
1482d2a6e165SVignesh Balasubramanian {"ompd_open", ompd_open, METH_VARARGS,
1483d2a6e165SVignesh Balasubramanian "Execute dlopen, return OMPD version."},
1484d2a6e165SVignesh Balasubramanian {"call_ompd_initialize", call_ompd_initialize, METH_NOARGS,
1485d2a6e165SVignesh Balasubramanian "Initializes OMPD environment and callbacks."},
1486d2a6e165SVignesh Balasubramanian {"call_ompd_rel_thread_handle", call_ompd_rel_thread_handle, METH_VARARGS,
1487d2a6e165SVignesh Balasubramanian "Releases a thread handle."},
1488d2a6e165SVignesh Balasubramanian {"get_thread_handle", get_thread_handle, METH_VARARGS,
1489d2a6e165SVignesh Balasubramanian "Collects information on threads."},
1490d2a6e165SVignesh Balasubramanian {"call_ompd_get_thread_in_parallel", call_ompd_get_thread_in_parallel,
1491d2a6e165SVignesh Balasubramanian METH_VARARGS,
1492d2a6e165SVignesh Balasubramanian "Obtains handle for a certain thread within parallel region."},
1493d2a6e165SVignesh Balasubramanian {"call_ompd_get_curr_parallel_handle", call_ompd_get_curr_parallel_handle,
1494d2a6e165SVignesh Balasubramanian METH_VARARGS,
1495d2a6e165SVignesh Balasubramanian "Obtains a pointer to the parallel handle for the current parallel "
1496d2a6e165SVignesh Balasubramanian "region."},
1497d2a6e165SVignesh Balasubramanian {"call_ompd_get_enclosing_parallel_handle",
1498d2a6e165SVignesh Balasubramanian call_ompd_get_enclosing_parallel_handle, METH_VARARGS,
1499d2a6e165SVignesh Balasubramanian "Obtains a pointer to the parallel handle for the parallel region "
1500d2a6e165SVignesh Balasubramanian "enclosing the parallel region specified."},
1501d2a6e165SVignesh Balasubramanian {"call_ompd_get_task_parallel_handle", call_ompd_get_task_parallel_handle,
1502d2a6e165SVignesh Balasubramanian METH_VARARGS,
1503d2a6e165SVignesh Balasubramanian "Obtains a pointer to the parallel handle for the parallel region "
1504d2a6e165SVignesh Balasubramanian "enclosing the task region specified."},
1505d2a6e165SVignesh Balasubramanian {"call_ompd_rel_parallel_handle", call_ompd_rel_parallel_handle,
1506d2a6e165SVignesh Balasubramanian METH_VARARGS, "Releases a parallel region handle."},
1507d2a6e165SVignesh Balasubramanian {"call_ompd_get_curr_task_handle", call_ompd_get_curr_task_handle,
1508d2a6e165SVignesh Balasubramanian METH_VARARGS,
1509d2a6e165SVignesh Balasubramanian "Obtains a pointer to the task handle for the current task region "
1510d2a6e165SVignesh Balasubramanian "associated with an OpenMP thread."},
1511d2a6e165SVignesh Balasubramanian {"call_ompd_get_generating_task_handle",
1512d2a6e165SVignesh Balasubramanian call_ompd_get_generating_task_handle, METH_VARARGS,
1513d2a6e165SVignesh Balasubramanian "Obtains a pointer to the task handle for the task that was created when "
1514d2a6e165SVignesh Balasubramanian "the task handle specified was encountered."},
1515d2a6e165SVignesh Balasubramanian {"call_ompd_get_scheduling_task_handle",
1516d2a6e165SVignesh Balasubramanian call_ompd_get_scheduling_task_handle, METH_VARARGS,
1517d2a6e165SVignesh Balasubramanian "Obtains a pointer to the task handle for the task that scheduled the "
1518d2a6e165SVignesh Balasubramanian "task specified."},
1519d2a6e165SVignesh Balasubramanian {"call_ompd_get_task_in_parallel", call_ompd_get_task_in_parallel,
1520d2a6e165SVignesh Balasubramanian METH_VARARGS,
1521d2a6e165SVignesh Balasubramanian "Obtains the handle for implicit tasks associated with a parallel "
1522d2a6e165SVignesh Balasubramanian "region."},
1523d2a6e165SVignesh Balasubramanian {"call_ompd_rel_task_handle", call_ompd_rel_task_handle, METH_VARARGS,
1524d2a6e165SVignesh Balasubramanian "Releases a task handle."},
1525d2a6e165SVignesh Balasubramanian {"call_ompd_get_task_frame", call_ompd_get_task_frame, METH_VARARGS,
1526d2a6e165SVignesh Balasubramanian "Returns a pointer to the enter and exit frame address and flag of the "
1527d2a6e165SVignesh Balasubramanian "given task."},
1528d2a6e165SVignesh Balasubramanian {"call_ompd_enumerate_icvs", call_ompd_enumerate_icvs, METH_VARARGS,
1529d2a6e165SVignesh Balasubramanian "Saves ICVs in map."},
1530d2a6e165SVignesh Balasubramanian {"call_ompd_get_icv_from_scope", call_ompd_get_icv_from_scope, METH_VARARGS,
1531d2a6e165SVignesh Balasubramanian "Gets ICVs from scope."},
1532d2a6e165SVignesh Balasubramanian {"call_ompd_enumerate_states", call_ompd_enumerate_states, METH_VARARGS,
1533d2a6e165SVignesh Balasubramanian "Enumerates OMP states."},
1534d2a6e165SVignesh Balasubramanian {"call_ompd_get_state", call_ompd_get_state, METH_VARARGS,
1535d2a6e165SVignesh Balasubramanian "Returns state for given thread handle."},
1536d2a6e165SVignesh Balasubramanian {"call_ompd_get_task_function", call_ompd_get_task_function, METH_VARARGS,
1537d2a6e165SVignesh Balasubramanian "Returns point of code where task starts executing."},
1538d2a6e165SVignesh Balasubramanian {"print_capsule", print_capsule, METH_VARARGS, "Print capsule content"},
1539d2a6e165SVignesh Balasubramanian {"call_ompd_get_thread_id", call_ompd_get_thread_id, METH_VARARGS,
1540d2a6e165SVignesh Balasubramanian "Maps an OMPD thread handle to a native thread."},
1541d2a6e165SVignesh Balasubramanian {"call_ompd_get_tool_data", call_ompd_get_tool_data, METH_VARARGS,
1542d2a6e165SVignesh Balasubramanian "Returns value and pointer of ompd_data_t for given scope and handle."},
1543d2a6e165SVignesh Balasubramanian {"call_ompd_get_icv_string_from_scope", call_ompd_get_icv_string_from_scope,
1544d2a6e165SVignesh Balasubramanian METH_VARARGS, "Gets ICV string representation from scope."},
1545d2a6e165SVignesh Balasubramanian
1546d2a6e165SVignesh Balasubramanian {"test_ompd_get_thread_handle", test_ompd_get_thread_handle, METH_VARARGS,
1547d2a6e165SVignesh Balasubramanian "Test API ompd_get_thread_handle."},
1548d2a6e165SVignesh Balasubramanian {"test_ompd_get_curr_parallel_handle", test_ompd_get_curr_parallel_handle,
1549d2a6e165SVignesh Balasubramanian METH_VARARGS, "Test API test_ompd_get_curr_parallel_handle."},
1550d2a6e165SVignesh Balasubramanian {"test_ompd_get_thread_in_parallel", test_ompd_get_thread_in_parallel,
1551d2a6e165SVignesh Balasubramanian METH_VARARGS, "Test API ompd_get_thread_in_parallel."},
1552d2a6e165SVignesh Balasubramanian {"test_ompd_thread_handle_compare", test_ompd_thread_handle_compare,
1553d2a6e165SVignesh Balasubramanian METH_VARARGS, "Test API ompd_thread_handle_compare."},
1554d2a6e165SVignesh Balasubramanian {"test_ompd_get_thread_id", test_ompd_get_thread_id, METH_VARARGS,
1555d2a6e165SVignesh Balasubramanian "Test API ompd_get_thread_id."},
1556d2a6e165SVignesh Balasubramanian {"test_ompd_rel_thread_handle", test_ompd_rel_thread_handle, METH_VARARGS,
1557d2a6e165SVignesh Balasubramanian "Test API ompd_rel_thread_handle."},
1558d2a6e165SVignesh Balasubramanian {"test_ompd_get_enclosing_parallel_handle",
1559d2a6e165SVignesh Balasubramanian test_ompd_get_enclosing_parallel_handle, METH_VARARGS,
1560d2a6e165SVignesh Balasubramanian "Test API ompd_get_enclosing_parallel_handle."},
1561d2a6e165SVignesh Balasubramanian {"test_ompd_parallel_handle_compare", test_ompd_parallel_handle_compare,
1562d2a6e165SVignesh Balasubramanian METH_VARARGS, "Test API test_ompd_parallel_handle_compare."},
1563d2a6e165SVignesh Balasubramanian {"test_ompd_rel_parallel_handle", test_ompd_rel_parallel_handle,
1564d2a6e165SVignesh Balasubramanian METH_VARARGS, "Test API ompd_rel_parallel_handle."},
1565d2a6e165SVignesh Balasubramanian
1566d2a6e165SVignesh Balasubramanian {"test_ompd_initialize", test_ompd_initialize, METH_VARARGS,
1567d2a6e165SVignesh Balasubramanian "Test API ompd_initialize."},
1568d2a6e165SVignesh Balasubramanian {"test_ompd_get_api_version", test_ompd_get_api_version, METH_VARARGS,
1569d2a6e165SVignesh Balasubramanian "Test API ompd_get_api_version."},
1570d2a6e165SVignesh Balasubramanian {"test_ompd_get_version_string", test_ompd_get_version_string, METH_VARARGS,
1571d2a6e165SVignesh Balasubramanian "Test API ompd_get_version_string."},
1572d2a6e165SVignesh Balasubramanian {"test_ompd_finalize", test_ompd_finalize, METH_VARARGS,
1573d2a6e165SVignesh Balasubramanian "Test API ompd_finalize."},
1574d2a6e165SVignesh Balasubramanian {"test_ompd_process_initialize", test_ompd_process_initialize, METH_VARARGS,
1575d2a6e165SVignesh Balasubramanian "Test API ompd_process_initialize. "},
1576d2a6e165SVignesh Balasubramanian {"test_ompd_device_initialize", test_ompd_device_initialize, METH_VARARGS,
1577d2a6e165SVignesh Balasubramanian "Test API ompd_device_initialize."},
1578d2a6e165SVignesh Balasubramanian {"test_ompd_rel_address_space_handle", test_ompd_rel_address_space_handle,
1579d2a6e165SVignesh Balasubramanian METH_VARARGS, "Test API ompd_rel_address_space_handle."},
1580d2a6e165SVignesh Balasubramanian {"test_ompd_get_omp_version", test_ompd_get_omp_version, METH_VARARGS,
1581d2a6e165SVignesh Balasubramanian "Test API ompd_get_omp_version."},
1582d2a6e165SVignesh Balasubramanian {"test_ompd_get_omp_version_string", test_ompd_get_omp_version_string,
1583d2a6e165SVignesh Balasubramanian METH_VARARGS, "Test API ompd_get_omp_version_string."},
1584d2a6e165SVignesh Balasubramanian
1585d2a6e165SVignesh Balasubramanian {"test_ompd_get_curr_task_handle", test_ompd_get_curr_task_handle,
1586d2a6e165SVignesh Balasubramanian METH_VARARGS, "Test API ompd_get_curr_task_handle."},
1587d2a6e165SVignesh Balasubramanian {"test_ompd_get_task_parallel_handle", test_ompd_get_task_parallel_handle,
1588d2a6e165SVignesh Balasubramanian METH_VARARGS, "Test API ompd_get_task_parallel_handle."},
1589d2a6e165SVignesh Balasubramanian {"test_ompd_get_generating_task_handle",
1590d2a6e165SVignesh Balasubramanian test_ompd_get_generating_task_handle, METH_VARARGS,
1591d2a6e165SVignesh Balasubramanian "Test API ompd_get_generating_task_handle."},
1592d2a6e165SVignesh Balasubramanian {"test_ompd_get_scheduling_task_handle",
1593d2a6e165SVignesh Balasubramanian test_ompd_get_scheduling_task_handle, METH_VARARGS,
1594d2a6e165SVignesh Balasubramanian "Test API ompd_get_scheduling_task_handle."},
1595d2a6e165SVignesh Balasubramanian {"test_ompd_get_task_in_parallel", test_ompd_get_task_in_parallel,
1596d2a6e165SVignesh Balasubramanian METH_VARARGS, "Test API ompd_get_task_in_parallel."},
1597d2a6e165SVignesh Balasubramanian {"test_ompd_rel_task_handle", test_ompd_rel_task_handle, METH_VARARGS,
1598d2a6e165SVignesh Balasubramanian "Test API ompd_rel_task_handle."},
1599d2a6e165SVignesh Balasubramanian {"test_ompd_task_handle_compare", test_ompd_task_handle_compare,
1600d2a6e165SVignesh Balasubramanian METH_VARARGS, "Test API ompd_task_handle_compare."},
1601d2a6e165SVignesh Balasubramanian {"test_ompd_get_task_function", test_ompd_get_task_function, METH_VARARGS,
1602d2a6e165SVignesh Balasubramanian "Test API ompd_get_task_function."},
1603d2a6e165SVignesh Balasubramanian {"test_ompd_get_task_frame", test_ompd_get_task_frame, METH_VARARGS,
1604d2a6e165SVignesh Balasubramanian "Test API ompd_get_task_frame."},
1605d2a6e165SVignesh Balasubramanian {"test_ompd_get_state", test_ompd_get_state, METH_VARARGS,
1606d2a6e165SVignesh Balasubramanian "Test API ompd_get_state."},
1607d2a6e165SVignesh Balasubramanian {"test_ompd_get_display_control_vars", test_ompd_get_display_control_vars,
1608d2a6e165SVignesh Balasubramanian METH_VARARGS, "Test API ompd_get_display_control_vars."},
1609d2a6e165SVignesh Balasubramanian {"test_ompd_rel_display_control_vars", test_ompd_rel_display_control_vars,
1610d2a6e165SVignesh Balasubramanian METH_VARARGS, "Test API ompd_rel_display_control_vars."},
1611d2a6e165SVignesh Balasubramanian {"test_ompd_enumerate_icvs", test_ompd_enumerate_icvs, METH_VARARGS,
1612d2a6e165SVignesh Balasubramanian "Test API ompd_enumerate_icvs."},
1613d2a6e165SVignesh Balasubramanian {"test_ompd_get_icv_from_scope_with_addr_handle",
1614d2a6e165SVignesh Balasubramanian test_ompd_get_icv_from_scope_with_addr_handle, METH_VARARGS,
1615d2a6e165SVignesh Balasubramanian "Test API ompd_get_icv_from_scope with addr_handle."},
1616d2a6e165SVignesh Balasubramanian {"test_ompd_get_icv_from_scope_with_thread_handle",
1617d2a6e165SVignesh Balasubramanian test_ompd_get_icv_from_scope_with_thread_handle, METH_VARARGS,
1618d2a6e165SVignesh Balasubramanian "Test API ompd_get_icv_from_scope with thread_handle."},
1619d2a6e165SVignesh Balasubramanian {"test_ompd_get_icv_from_scope_with_parallel_handle",
1620d2a6e165SVignesh Balasubramanian test_ompd_get_icv_from_scope_with_parallel_handle, METH_VARARGS,
1621d2a6e165SVignesh Balasubramanian "Test API ompd_get_icv_from_scope with parallel_handle."},
1622d2a6e165SVignesh Balasubramanian {"test_ompd_get_icv_from_scope_with_task_handle",
1623d2a6e165SVignesh Balasubramanian test_ompd_get_icv_from_scope_with_task_handle, METH_VARARGS,
1624d2a6e165SVignesh Balasubramanian "Test API ompd_get_icv_from_scope with task_handle."},
1625d2a6e165SVignesh Balasubramanian {"test_ompd_get_icv_string_from_scope", test_ompd_get_icv_string_from_scope,
1626d2a6e165SVignesh Balasubramanian METH_VARARGS, "Test API ompd_get_icv_string_from_scope."},
1627d2a6e165SVignesh Balasubramanian {"test_ompd_get_tool_data", test_ompd_get_tool_data, METH_VARARGS,
1628d2a6e165SVignesh Balasubramanian "Test API ompd_get_tool_data."},
1629d2a6e165SVignesh Balasubramanian {"test_ompd_enumerate_states", test_ompd_enumerate_states, METH_VARARGS,
1630d2a6e165SVignesh Balasubramanian "Test API ompd_enumerate_states."},
1631d2a6e165SVignesh Balasubramanian {NULL, NULL, 0, NULL}};
1632d2a6e165SVignesh Balasubramanian
1633d2a6e165SVignesh Balasubramanian /**
1634d2a6e165SVignesh Balasubramanian * Lets Python initialize module.
1635d2a6e165SVignesh Balasubramanian */
1636d2a6e165SVignesh Balasubramanian #if PY_MAJOR_VERSION >= 3
1637d2a6e165SVignesh Balasubramanian static struct PyModuleDef moduledef = {
1638d2a6e165SVignesh Balasubramanian PyModuleDef_HEAD_INIT,
1639d2a6e165SVignesh Balasubramanian "ompdModule", /* m_name */
1640d2a6e165SVignesh Balasubramanian "This is a module", /* m_doc */
1641d2a6e165SVignesh Balasubramanian -1, /* m_size */
1642d2a6e165SVignesh Balasubramanian ompdModule_methods, /* m_methods */
1643d2a6e165SVignesh Balasubramanian NULL, /* m_reload */
1644d2a6e165SVignesh Balasubramanian NULL, /* m_traverse */
1645d2a6e165SVignesh Balasubramanian NULL, /* m_clear */
1646d2a6e165SVignesh Balasubramanian NULL, /* m_free */
1647d2a6e165SVignesh Balasubramanian };
1648d2a6e165SVignesh Balasubramanian #endif
PyInit_ompdModule(void)1649d2a6e165SVignesh Balasubramanian void PyInit_ompdModule(void) {
1650d2a6e165SVignesh Balasubramanian // (void) Py_InitModule("ompdModule", ompdModule_methods);
1651d2a6e165SVignesh Balasubramanian PyModule_Create(&moduledef);
1652d2a6e165SVignesh Balasubramanian }
1653