6 from threading import Thread
7 from threading import Lock
8 from threading import Event
20 __confs_unmeasured__ = []
23 """Prepare for measuring
24 Outcome is Linux image for generated configuration."""
25 print("Preparing new image.")
26 global __confs_unmeasured__
27 if len(__confs_unmeasured__) == 0:
28 dtb = database.database()
29 confs = dtb.get_unmeasured()
31 configurations.generate()
32 confs = dtb.get_unmeasured()
34 raise exceptions.NoApplicableConfiguration()
35 __confs_unmeasured__ = list(confs)
36 con = __confs_unmeasured__.pop()
37 kernel.config(con.config)
38 img = kernel.make(con.hash)
39 print("Prepared image: " + img)
42 def measure(kernelimg, con):
43 print("Measuring " + con.hash)
45 os.remove(sf(conf.jobfolder_linux_image))
46 except FileNotFoundError:
48 os.symlink(kernelimg, sf(conf.jobfolder_linux_image))
50 print("Configuration '" + con.hash + "' measured.")
55 __preparethreadEvent__ = Event()
56 __measurethreadEvent__ = Event()
58 class prepareThread(Thread):
59 global __preparethread__
60 global __measurethread__
61 def __init__(self, name='prepare'):
62 Thread.__init__(self, name=name)
64 print('Prepare thread start')
65 while not __terminate__:
67 img, config = prepare()
68 except exceptions.NoApplicableConfiguration:
70 __listlock__.acquire()
71 __conflist__.append((img, config))
72 __preparethreadEvent__.set()
73 if len(__conflist__) > conf.multithread_buffer:
74 __listlock__.release()
75 print('Prepare thread suspended')
76 __measurethreadEvent__.wait()
77 print('Prepare thread waken')
79 __listlock__.release()
80 __measurethreadEvent__.clear()
81 print('Prepare thread stop')
83 class measureThread(Thread):
84 global __preparethread__
85 global __measurethread__
86 def __init__(self, name='measure'):
87 Thread.__init__(self, name=name)
89 print('Measure thread start')
90 while not __terminate__:
91 __listlock__.acquire()
92 if len(__conflist__) <= 0:
93 __listlock__.release()
94 print('Measure thread suspended')
95 __preparethreadEvent__.wait()
96 print('Measure thread waken')
97 __listlock__.acquire()
98 __preparethreadEvent__.clear()
99 img, config = __conflist__.pop()
100 __listlock__.release()
101 __measurethreadEvent__.set()
103 print('Measure thread stop')
105 __preparethread__ = prepareThread()
106 __measurethread__ = measureThread()
108 # Start and sigterm handler #
109 def sigterm_handler(_signo, _stack_frame):
113 __measurethreadEvent__.set()
114 __preparethreadEvent__.set()
116 # Main loop and single thread #
117 __terminate__ = False
122 __preparethread__.start()
123 __measurethread__.start()
126 img, config = prepare()
129 while not __terminate__:
130 img, config = prepare()
133 #################################################################################
135 if __name__ == '__main__':
136 signal.signal(signal.SIGTERM, sigterm_handler)
137 signal.signal(signal.SIGINT, sigterm_handler)