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