1d2a6e165SVignesh Balasubramanianimport ompdModule 2d2a6e165SVignesh Balasubramanianimport imp 3d2a6e165SVignesh Balasubramanian 4d2a6e165SVignesh Balasubramanian 5*f98ee40fSTobias Hietaclass ompd_parallel(object): 6d2a6e165SVignesh Balasubramanian def __init__(self, parallel_handle): 7d2a6e165SVignesh Balasubramanian """Initializes an ompd_parallel object with the pointer 8d2a6e165SVignesh Balasubramanian to a handle of a parallel region.""" 9d2a6e165SVignesh Balasubramanian self.parallel_handle = parallel_handle 10d2a6e165SVignesh Balasubramanian self.threads = {} 11d2a6e165SVignesh Balasubramanian self.itasks = {} 12d2a6e165SVignesh Balasubramanian self.enclosing_parallel_handle = None 13d2a6e165SVignesh Balasubramanian self.enclosing_parallel = False 14d2a6e165SVignesh Balasubramanian self.task_handle = None 15d2a6e165SVignesh Balasubramanian 16d2a6e165SVignesh Balasubramanian def get_thread_in_parallel(self, thread_num): 17d2a6e165SVignesh Balasubramanian """Obtains thread handles for the threads associated with the 18d2a6e165SVignesh Balasubramanian parallel region specified by parallel_handle.""" 19d2a6e165SVignesh Balasubramanian if not thread_num in self.threads: 20*f98ee40fSTobias Hieta thread_handle = ompdModule.call_ompd_get_thread_in_parallel( 21*f98ee40fSTobias Hieta self.parallel_handle, thread_num 22*f98ee40fSTobias Hieta ) 23d2a6e165SVignesh Balasubramanian self.threads[thread_num] = ompd_thread(thread_handle) 24d2a6e165SVignesh Balasubramanian return self.threads[thread_num] 25d2a6e165SVignesh Balasubramanian 26d2a6e165SVignesh Balasubramanian def get_enclosing_parallel_handle(self): 27d2a6e165SVignesh Balasubramanian """Obtains a parallel handle for the parallel region enclosing 28d2a6e165SVignesh Balasubramanian the parallel region specified by parallel_handle.""" 29d2a6e165SVignesh Balasubramanian if not self.enclosing_parallel_handle: 30*f98ee40fSTobias Hieta self.enclosing_parallel_handle = ( 31*f98ee40fSTobias Hieta ompdModule.call_ompd_get_enclosing_parallel_handle(self.parallel_handle) 32*f98ee40fSTobias Hieta ) 33d2a6e165SVignesh Balasubramanian return self.enclosing_parallel_handle 34d2a6e165SVignesh Balasubramanian 35d2a6e165SVignesh Balasubramanian def get_enclosing_parallel(self): 36d2a6e165SVignesh Balasubramanian if not self.enclosing_parallel: 37*f98ee40fSTobias Hieta self.enclosing_parallel = ompd_parallel( 38*f98ee40fSTobias Hieta self.get_enclosing_parallel_handle() 39*f98ee40fSTobias Hieta ) 40d2a6e165SVignesh Balasubramanian return self.enclosing_parallel 41d2a6e165SVignesh Balasubramanian 42d2a6e165SVignesh Balasubramanian def get_task_in_parallel(self, thread_num): 43d2a6e165SVignesh Balasubramanian """Obtains handles for the implicit tasks associated with the 44d2a6e165SVignesh Balasubramanian parallel region specified by parallel_handle.""" 45d2a6e165SVignesh Balasubramanian if not thread_num in self.itasks: 46*f98ee40fSTobias Hieta task_handle = ompdModule.call_ompd_get_task_in_parallel( 47*f98ee40fSTobias Hieta self.parallel_handle, thread_num 48*f98ee40fSTobias Hieta ) 49d2a6e165SVignesh Balasubramanian self.itasks[thread_num] = ompd_task(task_handle) 50d2a6e165SVignesh Balasubramanian return self.itasks[thread_num] 51d2a6e165SVignesh Balasubramanian 52d2a6e165SVignesh Balasubramanian def __del__(self): 53d2a6e165SVignesh Balasubramanian """Releases the parallel handle.""" 54d2a6e165SVignesh Balasubramanian pass # let capsule destructors do the job 55d2a6e165SVignesh Balasubramanian 56d2a6e165SVignesh Balasubramanian 57*f98ee40fSTobias Hietaclass ompd_task(object): 58d2a6e165SVignesh Balasubramanian def __init__(self, task_handle): 59d2a6e165SVignesh Balasubramanian """Initializes a new ompd_task_handle object and sets the attribute 60d2a6e165SVignesh Balasubramanian to the task handle specified.""" 61d2a6e165SVignesh Balasubramanian self.task_handle = task_handle 62d2a6e165SVignesh Balasubramanian self.task_parallel_handle = False 63d2a6e165SVignesh Balasubramanian self.generating_task_handle = False 64d2a6e165SVignesh Balasubramanian self.scheduling_task_handle = False 65d2a6e165SVignesh Balasubramanian self.task_parallel = False 66d2a6e165SVignesh Balasubramanian self.generating_task = False 67d2a6e165SVignesh Balasubramanian self.scheduling_task = False 68d2a6e165SVignesh Balasubramanian self.task_frames = None 69d2a6e165SVignesh Balasubramanian self.task_frame_flags = None 70d2a6e165SVignesh Balasubramanian 71d2a6e165SVignesh Balasubramanian def get_task_parallel_handle(self): 72d2a6e165SVignesh Balasubramanian """Obtains a task parallel handle for the parallel region enclosing 73d2a6e165SVignesh Balasubramanian the task region specified.""" 74d2a6e165SVignesh Balasubramanian if not self.task_parallel_handle: 75*f98ee40fSTobias Hieta self.task_parallel_handle = ompdModule.call_ompd_get_task_parallel_handle( 76*f98ee40fSTobias Hieta self.task_handle 77*f98ee40fSTobias Hieta ) 78d2a6e165SVignesh Balasubramanian return self.task_parallel_handle 79d2a6e165SVignesh Balasubramanian 80d2a6e165SVignesh Balasubramanian def get_task_parallel(self): 81d2a6e165SVignesh Balasubramanian if not self.task_parallel: 82d2a6e165SVignesh Balasubramanian self.task_parallel = ompd_parallel(self.get_task_parallel_handle()) 83d2a6e165SVignesh Balasubramanian return self.task_parallel 84d2a6e165SVignesh Balasubramanian 85d2a6e165SVignesh Balasubramanian def get_generating_task_handle(self): 86d2a6e165SVignesh Balasubramanian """Obtains the task handle for the task that created the task specified 87d2a6e165SVignesh Balasubramanian by the task handle.""" 88d2a6e165SVignesh Balasubramanian if not self.generating_task_handle: 89*f98ee40fSTobias Hieta self.generating_task_handle = ( 90*f98ee40fSTobias Hieta ompdModule.call_ompd_get_generating_task_handle(self.task_handle) 91*f98ee40fSTobias Hieta ) 92d2a6e165SVignesh Balasubramanian return self.generating_task_handle 93d2a6e165SVignesh Balasubramanian 94d2a6e165SVignesh Balasubramanian def get_generating_task(self): 95d2a6e165SVignesh Balasubramanian if not self.generating_task: 96*f98ee40fSTobias Hieta self.generating_task = ompd_task( 97*f98ee40fSTobias Hieta ompdModule.call_ompd_get_generating_task_handle(self.task_handle) 98*f98ee40fSTobias Hieta ) 99d2a6e165SVignesh Balasubramanian return self.generating_task 100d2a6e165SVignesh Balasubramanian 101d2a6e165SVignesh Balasubramanian def get_scheduling_task_handle(self): 102d2a6e165SVignesh Balasubramanian """Obtains the task handle for the task that scheduled the task specified.""" 103d2a6e165SVignesh Balasubramanian if not self.scheduling_task_handle: 104*f98ee40fSTobias Hieta self.scheduling_task_handle = ( 105*f98ee40fSTobias Hieta ompdModule.call_ompd_get_scheduling_task_handle(self.task_handle) 106*f98ee40fSTobias Hieta ) 107d2a6e165SVignesh Balasubramanian return self.scheduling_task_handle 108d2a6e165SVignesh Balasubramanian 109d2a6e165SVignesh Balasubramanian def get_scheduling_task(self): 110d2a6e165SVignesh Balasubramanian """Returns ompd_task object for the task that scheduled the current task.""" 111d2a6e165SVignesh Balasubramanian if not self.scheduling_task: 112d2a6e165SVignesh Balasubramanian self.scheduling_task = ompd_task(self.get_scheduling_task_handle()) 113d2a6e165SVignesh Balasubramanian return self.scheduling_task 114d2a6e165SVignesh Balasubramanian 115d2a6e165SVignesh Balasubramanian def get_task_function(self): 116d2a6e165SVignesh Balasubramanian """Returns long with address of function entry point.""" 117d2a6e165SVignesh Balasubramanian return ompdModule.call_ompd_get_task_function(self.task_handle) 118d2a6e165SVignesh Balasubramanian 119d2a6e165SVignesh Balasubramanian def get_task_frame_with_flags(self): 120d2a6e165SVignesh Balasubramanian """Returns enter frame address and flag, exit frame address and flag for current task handle.""" 121d2a6e165SVignesh Balasubramanian if self.task_frames is None or self.task_frame_flags is None: 122d2a6e165SVignesh Balasubramanian ret_value = ompdModule.call_ompd_get_task_frame(self.task_handle) 123d2a6e165SVignesh Balasubramanian if isinstance(ret_value, tuple): 124d2a6e165SVignesh Balasubramanian self.task_frames = (ret_value[0], ret_value[2]) 125d2a6e165SVignesh Balasubramanian self.task_frame_flags = (ret_value[1], ret_value[3]) 126d2a6e165SVignesh Balasubramanian else: 127d2a6e165SVignesh Balasubramanian return ret_value 128*f98ee40fSTobias Hieta return ( 129*f98ee40fSTobias Hieta self.task_frames[0], 130*f98ee40fSTobias Hieta self.task_frame_flags[0], 131*f98ee40fSTobias Hieta self.task_frames[1], 132*f98ee40fSTobias Hieta self.task_frame_flags[1], 133*f98ee40fSTobias Hieta ) 134d2a6e165SVignesh Balasubramanian 135d2a6e165SVignesh Balasubramanian def get_task_frame(self): 136d2a6e165SVignesh Balasubramanian """Returns enter and exit frame address for current task handle.""" 137d2a6e165SVignesh Balasubramanian if self.task_frames is None: 138d2a6e165SVignesh Balasubramanian ret_value = ompdModule.call_ompd_get_task_frame(self.task_handle) 139d2a6e165SVignesh Balasubramanian if isinstance(ret_value, tuple): 140d2a6e165SVignesh Balasubramanian self.task_frames = (ret_value[0], ret_value[2]) 141d2a6e165SVignesh Balasubramanian else: 142d2a6e165SVignesh Balasubramanian return ret_value 143d2a6e165SVignesh Balasubramanian return self.task_frames 144d2a6e165SVignesh Balasubramanian 145d2a6e165SVignesh Balasubramanian def __del__(self): 146d2a6e165SVignesh Balasubramanian """Releases the task handle.""" 147d2a6e165SVignesh Balasubramanian pass # let capsule destructors do the job 148d2a6e165SVignesh Balasubramanian 149d2a6e165SVignesh Balasubramanian 150d2a6e165SVignesh Balasubramanianclass ompd_thread(object): 151d2a6e165SVignesh Balasubramanian def __init__(self, thread_handle): 152d2a6e165SVignesh Balasubramanian """Initializes an ompd_thread with the data received from 153d2a6e165SVignesh Balasubramanian GDB.""" 154d2a6e165SVignesh Balasubramanian self.thread_handle = thread_handle 155d2a6e165SVignesh Balasubramanian self.parallel_handle = None 156d2a6e165SVignesh Balasubramanian self.task_handle = None 157d2a6e165SVignesh Balasubramanian self.current_task = False 158d2a6e165SVignesh Balasubramanian self.current_parallel = False 159d2a6e165SVignesh Balasubramanian self.thread_id = False 160d2a6e165SVignesh Balasubramanian 161d2a6e165SVignesh Balasubramanian def get_current_parallel_handle(self): 162d2a6e165SVignesh Balasubramanian """Obtains the parallel handle for the parallel region associated with 163d2a6e165SVignesh Balasubramanian the given thread handle.""" 164d2a6e165SVignesh Balasubramanian # TODO: invalidate thread objects based on `gdb.event.cont`. This should invalidate all internal state. 165*f98ee40fSTobias Hieta self.parallel_handle = ompdModule.call_ompd_get_curr_parallel_handle( 166*f98ee40fSTobias Hieta self.thread_handle 167*f98ee40fSTobias Hieta ) 168d2a6e165SVignesh Balasubramanian return self.parallel_handle 169d2a6e165SVignesh Balasubramanian 170d2a6e165SVignesh Balasubramanian def get_current_parallel(self): 171d2a6e165SVignesh Balasubramanian """Returns parallel object for parallel handle of the parallel region 172d2a6e165SVignesh Balasubramanian associated with the current thread handle.""" 173d2a6e165SVignesh Balasubramanian if not self.current_parallel: 174d2a6e165SVignesh Balasubramanian self.current_parallel = ompd_parallel(self.get_current_parallel_handle()) 175d2a6e165SVignesh Balasubramanian return self.current_parallel 176d2a6e165SVignesh Balasubramanian 177d2a6e165SVignesh Balasubramanian def get_current_task_handle(self): 178d2a6e165SVignesh Balasubramanian """Obtains the task handle for the current task region of the 179d2a6e165SVignesh Balasubramanian given thread.""" 180d2a6e165SVignesh Balasubramanian return ompdModule.call_ompd_get_curr_task_handle(self.thread_handle) 181d2a6e165SVignesh Balasubramanian 182d2a6e165SVignesh Balasubramanian def get_thread_id(self): 183d2a6e165SVignesh Balasubramanian """Obtains the ID for the given thread.""" 184d2a6e165SVignesh Balasubramanian if not self.thread_id: 185d2a6e165SVignesh Balasubramanian self.thread_id = ompdModule.call_ompd_get_thread_id(self.thread_handle) 186d2a6e165SVignesh Balasubramanian return self.thread_id 187d2a6e165SVignesh Balasubramanian 188d2a6e165SVignesh Balasubramanian def get_current_task(self): 189d2a6e165SVignesh Balasubramanian """Returns task object for task handle of the current task region.""" 190d2a6e165SVignesh Balasubramanian return ompd_task(self.get_current_task_handle()) 191d2a6e165SVignesh Balasubramanian 192d2a6e165SVignesh Balasubramanian def get_state(self): 193d2a6e165SVignesh Balasubramanian """Returns tuple with OMPD state (long) and wait_id, in case the thread is in a 194d2a6e165SVignesh Balasubramanian waiting state. Helper function for 'ompd threads' command.""" 195d2a6e165SVignesh Balasubramanian (state, wait_id) = ompdModule.call_ompd_get_state(self.thread_handle) 196d2a6e165SVignesh Balasubramanian return (state, wait_id) 197d2a6e165SVignesh Balasubramanian 198d2a6e165SVignesh Balasubramanian def __del__(self): 199d2a6e165SVignesh Balasubramanian """Releases the given thread handle.""" 200d2a6e165SVignesh Balasubramanian pass # let capsule destructors do the job 201