def createthread(function): """ <Purpose> Creates a new thread of execution. <Arguments> function: The function to invoke on entering the new thread. <Exceptions> RepyArgumentError is raised if the function is not callable. ResourceExhaustedError is raised if there are no available events. <Side Effects> Launches a new thread. <Resource Consumption> Consumes an event. <Returns> None """ # Check if the function is callable if not safe_callable(function): raise RepyArgumentError("Provided function is not callable!") # Generate a unique handle and see if there are resources available eventhandle = EVENT_PREFIX + idhelper.getuniqueid() #nanny.tattle_add_item('events', eventhandle) # Wrap the provided function def wrapped_func(): try: function() except: # Exit if they throw an uncaught exception tracebackrepy.handle_exception() harshexit.harshexit(30) #finally: # Remove the event before I exit #nanny.tattle_remove_item('events',eventhandle) # Create a thread object tobj = threading.Thread(target=wrapped_func, name=idhelper.get_new_thread_name(EVENT_PREFIX)) # Check if we get an exception trying to create a new thread try: tobj.start() except thread.error: # Set exit code 56, which stands for a Threading Error # The Node manager will detect this and handle it harshexit.harshexit(56)
def createthread(function): """ <Purpose> Creates a new thread of execution. <Arguments> function: The function to invoke on entering the new thread. <Exceptions> RepyArgumentError is raised if the function is not callable. ResourceExhaustedError is raised if there are no available events. <Side Effects> Launches a new thread. <Resource Consumption> Consumes an event. <Returns> None """ # Check if the function is callable if not safe_callable(function): raise RepyArgumentError("Provided function is not callable!") # Generate a unique handle and see if there are resources available eventhandle = EVENT_PREFIX + idhelper.getuniqueid() nanny.tattle_add_item('events', eventhandle) # Wrap the provided function def wrapped_func(): try: function() except: # Exit if they throw an uncaught exception tracebackrepy.handle_exception() harshexit.harshexit(30) finally: # Remove the event before I exit nanny.tattle_remove_item('events',eventhandle) # Create a thread object tobj = threading.Thread(target=wrapped_func, name=idhelper.get_new_thread_name(EVENT_PREFIX)) # Check if we get an exception trying to create a new thread try: tobj.start() except thread.error: # Set exit code 56, which stands for a Threading Error # The Node manager will detect this and handle it harshexit.harshexit(56)
def settimer(waittime, function, args): """ <Purpose> Allow the current event to set an event to be performed in the future. This does not guarantee the event will be triggered at that time, only that it will be triggered after that time. <Arguments> waittime: The minimum amount of time to wait before delivering the event function: The function to call args: The arguments to pass to the function. This should be a tuple or list <Exceptions> None. <Side Effects> None. <Returns> A timer handle, for use with canceltimer """ restrictions.assertisallowed('settimer', waittime) eventhandle = generate_eventhandle() nanny.tattle_add_item('events', eventhandle) tobj = threading.Timer(waittime, functionwrapper, [function] + [eventhandle] + [args]) # Set the name of the thread tobj.setName(idhelper.get_new_thread_name(EVENT_PREFIX)) timerinfo[eventhandle] = {'timer': tobj} # Check if we get an exception trying to create a new thread try: # start the timer tobj.start() except thread.error, exp: # Set exit code 56, which stands for a Threading Error # The Node manager will detect this and handle it harshexit.harshexit(56)
def settimer(waittime, function, args): """ <Purpose> Allow the current event to set an event to be performed in the future. This does not guarantee the event will be triggered at that time, only that it will be triggered after that time. <Arguments> waittime: The minimum amount of time to wait before delivering the event function: The function to call args: The arguments to pass to the function. This should be a tuple or list <Exceptions> None. <Side Effects> None. <Returns> A timer handle, for use with canceltimer """ restrictions.assertisallowed('settimer',waittime) eventhandle = generate_eventhandle() nanny.tattle_add_item('events',eventhandle) tobj = threading.Timer(waittime,functionwrapper,[function] + [eventhandle] + [args]) # Set the name of the thread tobj.setName(idhelper.get_new_thread_name(EVENT_PREFIX)) timerinfo[eventhandle] = {'timer':tobj} # Check if we get an exception trying to create a new thread try: # start the timer tobj.start() except thread.error, exp: # Set exit code 56, which stands for a Threading Error # The Node manager will detect this and handle it harshexit.harshexit(56)