-
Notifications
You must be signed in to change notification settings - Fork 3
/
system.py
106 lines (91 loc) · 2.43 KB
/
system.py
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import utils
import re
from multiprocessing import Process, Queue
import callbacks
def libraryDirs():
out,err=utils.call('.','ld','--verbose')
return re.findall('SEARCH_DIR\("=([^"]+)"\);',out)
def listAllPackages():
res=set()
try:
all,err=utils.call('.','pkg-config','--list-all')
lines=all.splitlines()
for line in lines:
name=(line.split(' '))[0]
res.add(name)
except OSError:
pass
return sorted(list(res))
def symbolScan(q,ws):
import symbolscanner
q.put(symbolscanner.getLibrarySymbols(ws))
noMP=False
scanq=Queue()
workspacePath=''
scannerProcess=None
scanStarted=False
libSyms=None
wsSyms=None
wsLibs=None
def isScannerDone():
if scanq:
return not scanq.empty()
return True
def disableSymbolScan():
global libSyms
global wsSyms
global wsLibs
global scanq
libSyms={}
wsSyms={}
wsLibs={}
scanq=None
def startSymbolScan(ws):
utils.timestamp('start scan process')
if not noMP:
global scannerProcess
global scanStarted
global workspacePath
if scanq and not scanStarted:
scanStarted=True
workspacePath=ws
scannerProcess=Process(target=symbolScan,args=(scanq,workspacePath))
scannerProcess.start()
else:
global libSyms
global wsSyms
global wsLibs
import symbolscanner
(libSyms,wsSyms,wsLibs)=symbolscanner.getLibrarySymbols(workspacePath)
def getLibrarySymbols():
global libSyms
global wsSyms
global wsLibs
global scannerProcess
global scanq
if not libSyms:
if not scanq:
libSyms={}
wsSyms={}
wsLibs={}
else:
utils.timestamp('Getting scan results from queue')
(libSyms,wsSyms,wsLibs)=scanq.get()
utils.timestamp('Done queue get')
if scannerProcess:
utils.timestamp('Joining scan process')
scannerProcess.join()
utils.timestamp('Done join')
scannerProcess=None
if scanq:
scanq.close()
scanq=None
import symbolscanner
symbolscanner.setInitialResults(workspacePath,libSyms,wsSyms,wsLibs)
return libSyms
def getWorkspaceSymbols():
getLibrarySymbols()
return wsSyms
callbacks.closeCallbacks.append(getLibrarySymbols)
if __name__=='__main__':
getLibrarySymbols()