mirror of
				https://github.com/Mikaela/Limnoria.git
				synced 2025-10-30 23:27:24 +01:00 
			
		
		
		
	src/commands.py: make subprocesses raise an error on timeout, rather than return a string
Conflicts: src/commands.py
This commit is contained in:
		
							parent
							
								
									d85cbd256b
								
							
						
					
					
						commit
						3526d5dabf
					
				| @ -69,6 +69,43 @@ def thread(f): | ||||
|             f(self, irc, msg, args, *L, **kwargs) | ||||
|     return utils.python.changeFunctionName(newf, f.func_name, f.__doc__) | ||||
| 
 | ||||
| class ProcessTimeoutError(Exception): | ||||
|     """Gets raised when a process is killed due to timeout.""" | ||||
|     pass | ||||
| 
 | ||||
| def process(f, *args, **kwargs): | ||||
|     """Runs a function <f> in a subprocess. | ||||
|      | ||||
|     Several extra keyword arguments can be supplied.  | ||||
|     <pn>, the pluginname, and <cn>, the command name, are strings used to | ||||
|     create the process name, for identification purposes. | ||||
|     <timeout>, if supplied, limits the length of execution of target  | ||||
|     function to <timeout> seconds.""" | ||||
|     timeout = kwargs.pop('timeout', None) | ||||
|      | ||||
|     q = multiprocessing.Queue() | ||||
|     def newf(f, q, *args, **kwargs): | ||||
|         try: | ||||
|             r = f(*args, **kwargs) | ||||
|             q.put(r) | ||||
|         except Exception as e: | ||||
|             q.put(e) | ||||
|     targetArgs = (f, q,) + args | ||||
|     p = callbacks.CommandProcess(target=newf, | ||||
|                                 args=targetArgs, kwargs=kwargs) | ||||
|     p.start() | ||||
|     p.join(timeout) | ||||
|     if p.is_alive(): | ||||
|         p.terminate() | ||||
|         raise ProcessTimeoutError, "%s aborted due to timeout." % (p.name,) | ||||
|     try: | ||||
|         v = q.get(block=False) | ||||
|     except Queue.Empty: | ||||
|         v = "Nothing returned." | ||||
|     if isinstance(v, Exception): | ||||
|         v = "Error: " + str(v) | ||||
|     return v | ||||
| 
 | ||||
| class UrlSnarfThread(world.SupyThread): | ||||
|     def __init__(self, *args, **kwargs): | ||||
|         assert 'url' in kwargs | ||||
|  | ||||
| @ -1,3 +1,3 @@ | ||||
| """stick the various versioning attributes in here, so we only have to change | ||||
| them once.""" | ||||
| version = '0.83.4.1+limnoria (2011-08-12T18:51:40+0200)' | ||||
| version = '0.83.4.1+limnoria (2011-08-13T01:53:58+0200)' | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Daniel Folkinshteyn
						Daniel Folkinshteyn