def __init__(self):
     self.h_j = DoubleDict()
     # root_job initializing
     self.root_job = Job(self.root_runner, "Root", "Parent of all jobs")
     h = Handler()
     self.h_j.set_obj2(h, self.root_job)
     self.h_j.set_obj1(self.root_job, h)
class Scheduler:
    def __init__(self):
        self.h_j = DoubleDict()
        # root_job initializing
        self.root_job = Job(self.root_runner, "Root", "Parent of all jobs")
        h = Handler()
        self.h_j.set_obj2(h, self.root_job)
        self.h_j.set_obj1(self.root_job, h)

    def add_job(self, runner, name = "Nameless", desc = "NoDesc", \
                parent = None, exc_handler = None):
        try:
            if parent is None:
                parent = self.h_j.obj1_lookup(self.root_job)
            j = Job(runner, name, desc, exc_handler)
            h = Handler()
            # Set the dict { Handlers : Jobs }
            self.h_j.set_obj2(h, j)
            # Set the dict { Jobs : Handlers }
            self.h_j.set_obj1(j, h)
            # Set to the parent the 'j' Job as a child
            parent_job = self.h_j.obj2_lookup(parent)
            parent_job.sched([j])
        except ScriptException as exc:
            print exc
        # Return the handler to the caller
        return h

    def run(self):
        try:
            self.root_job(self.h_j)
        except JobException as exc:
            print exc
        except ScriptException as exc:
            print exc
        except RsException as exc:
            print exc

    def set_regitem(self, handler, value):
        j = self.h_j.obj2_lookup(handler)
        j.set_regitem(j, value)

    def get_regitem(self, handler):
        j = self.h_j.obj2_lookup(handler)
        j.get_regitem(j.id)

    def root_runner(self):
        msg("Root job executed")