OSDN Git Service

Merge 2013.1.
[nvdajp/nvdajp.git] / source / queueHandler.py
1 #queueHandler.py\r
2 #A part of NonVisual Desktop Access (NVDA)\r
3 #Copyright (C) 2006-2007 NVDA Contributors <http://www.nvda-project.org/>\r
4 #This file is covered by the GNU General Public License.\r
5 #See the file COPYING for more details.\r
6 \r
7 import types\r
8 from Queue import Queue\r
9 import globalVars\r
10 from logHandler import log\r
11 import watchdog\r
12 \r
13 eventQueue=Queue()\r
14 eventQueue.__name__="eventQueue"\r
15 generators={}\r
16 lastGeneratorObjID=0\r
17 \r
18 def registerGeneratorObject(generatorObj):\r
19         global generators,lastGeneratorObjID\r
20         if not isinstance(generatorObj,types.GeneratorType):\r
21                 raise TypeError('Arg 2 must be a generator object, not %s'%type(generatorObj))\r
22         lastGeneratorObjID+=1\r
23         log.debug("Adding generator %d"%lastGeneratorObjID)\r
24         generators[lastGeneratorObjID]=generatorObj\r
25         return lastGeneratorObjID\r
26 \r
27 def cancelGeneratorObject(generatorObjID):\r
28         global generators\r
29         try:\r
30                 del generators[generatorObjID]\r
31         except KeyError:\r
32                 pass\r
33 \r
34 def queueFunction(queue,func,*args,**kwargs):\r
35         queue.put_nowait((func,args,kwargs))\r
36 \r
37 def isRunningGenerators():\r
38         res=len(generators)>0\r
39         log.debug("generators running: %s"%res)\r
40 \r
41 def flushQueue(queue):\r
42         for count in range(queue.qsize()+1):\r
43                 if not queue.empty():\r
44                         (func,args,kwargs)=queue.get_nowait()\r
45                         watchdog.alive()\r
46                         try:\r
47                                 func(*args,**kwargs)\r
48                         except:\r
49                                 log.exception("Error in func %s from %s"%(func.__name__,queue.__name__))\r
50 \r
51 def isPendingItems(queue):\r
52         if not queue.empty():\r
53                 res=True\r
54         else:\r
55                 res=False\r
56         return res\r
57 \r
58 def pumpAll():\r
59         # This dict can mutate during iteration, so use keys().\r
60         for ID in generators.keys():\r
61                 # KeyError could occur within the generator itself, so retrieve the generator first.\r
62                 try:\r
63                         gen = generators[ID]\r
64                 except KeyError:\r
65                         # Generator was cancelled. This is fine.\r
66                         continue\r
67                 watchdog.alive()\r
68                 try:\r
69                         next(gen)\r
70                 except StopIteration:\r
71                         log.debug("generator %s finished"%ID)\r
72                         del generators[ID]\r
73                 except:\r
74                         log.exception("error in generator %d"%ID)\r
75                         del generators[ID]\r
76         flushQueue(eventQueue)\r