import logging; log = logging.getLogger(__name__)
import os
import gdb
import mcgdb
from ... import representation
from ...representation import Worker
FRAME_RENAME = {
    "gomp_team_barrier_wait_end" : "#pragma omp barrier",
    "gomp_barrier_handle_tasks": "<gomp task dispatcher>",
    "gomp_init_task" : "<gomp task initializer>"
    }
[docs]class RenamedFrame(mcgdb.capture.FrameStripperDecorator):
[docs]    def function(self):
        name = str(self.parent.inferior_frame().name())
        return FRAME_RENAME[name] 
[docs]    def frame_locals(self): return None 
[docs]    def frame_args(self): return None 
[docs]    def address(self):
        return None 
[docs]    def line(self):
        name = str(self.parent.inferior_frame().name())
        if FRAME_RENAME[name] == "#pragma omp barrier":
            return self.parent.inferior_frame().older().older().find_sal().line
        else:
            return None 
[docs]    def filename(self):
        name = str(self.parent.inferior_frame().name())
        if FRAME_RENAME[name] == "#pragma omp barrier":
            return self.parent.inferior_frame().older().older().find_sal().symtab.filename
        else:
            return None  
    
[docs]class FrameFilter:
    def __init__(self):
        self.enabled = True
        self.priority = 450
        
[docs]    def filter(self, frames):
        for frame in frames:
            name = str(frame.inferior_frame().name())
            if name in FRAME_RENAME:
                yield RenamedFrame(frame)
            else:
                yield frame  
                
[docs]def activate():
    mcgdb.toggle_activate_submodules(__name__)(do_activate=True)
    gdb.frame_filters["GOMP Subroutines"] = FrameFilter()
    
    mcgdb.register_model("OpenMP Pthread",
                         "libpthread.so",
                         mcgdb.toggle_activate_submodules(__name__+".gomp_thread_start"), objfile=True) 
        
# keep last to use objets above
from . import \
    GOMP_parallel_start_end, \
    GOMP_barrier, \
    GOMP_single_start, \
    GOMP_task, \
    GOMP_taskwait, \
    GOMP_sections_next, \
    GOMP_critical_start_end, \
    omp_get_thread_num, \
    gomp_thread_start
#    syscall_write