# encoding: utf-8
__author__ = "Nils Tobias Schmidt"
__email__ = "schmidt89 at informatik.uni-marburg.de"
from datetime import timedelta
from multiprocessing import Value, Lock
import sys
from time import time, sleep
from androlyze import Constants
from androlyze.util import Util
from androlyze.util.StopThread import StopThread
[docs]class AnalysisStatsView(StopThread):
''' Thread showing current analysis progress.
Also keeps track of succesful and failed tasks count.
'''
def __init__(self, cnt_total_tasks, tasks_per_chunk = 1, result = None):
'''
Parameters
----------
cnt_total_tasks : int
Number of total tasks.
tasks_per_chunk : int, optional (default is 1)
Number of subtasks a task (chunk) contains.
results : GroupResult
Collection of the tasks.
'''
super(AnalysisStatsView, self).__init__()
self.cnt_total_task = cnt_total_tasks
# progress stats
self.successful_tasks = self.failed_tasks = 0
self.tasks_per_chunk = tasks_per_chunk
self.start_time = time()
self.results = result
# shared memory count of analyzed apks
self.__analyzed_cnt_sm = Value('i', 0, lock = Lock())
[docs] def get_cnt_total_task(self):
return self.__cnt_total_task
[docs] def get_successful_tasks(self):
return self.__successful_tasks
[docs] def get_failed_tasks(self):
return self.__failed_tasks
[docs] def set_cnt_total_task(self, value):
self.__cnt_total_task = value
[docs] def set_successful_tasks(self, value):
self.__successful_tasks = value
[docs] def set_failed_tasks(self, value):
self.__failed_tasks = value
[docs] def del_cnt_total_task(self):
del self.__cnt_total_task
[docs] def del_successful_tasks(self):
del self.__successful_tasks
[docs] def del_failed_tasks(self):
del self.__failed_tasks
cnt_total_task = property(get_cnt_total_task, set_cnt_total_task, del_cnt_total_task, "int : Number of total tasks. Setter is thread")
successful_tasks = property(get_successful_tasks, set_successful_tasks, del_successful_tasks, "int : Number of succesful tasks.")
failed_tasks = property(get_failed_tasks, set_failed_tasks, del_failed_tasks, "int : Number of failed tasks.")
[docs] def run(self):
''' Print progress until terminate `event` set '''
refresh_rate = Constants.PROGRESS_REFRESH_RATE / 1000.0
while not self.shall_terminate():
sleep(refresh_rate)
self.print_progess()
# print final progress before exiting
self.print_progess()
sys.stderr.write("\n")
[docs] def print_progess(self):
''' Show the progress on run '''
progress_str = Util.format_progress(self.get_chunked_cnt(self.get_total_run_tasks()) , self.cnt_total_task)
time_elapsed = timedelta(seconds=round(time() - self.start_time))
progress_str = 'Successful: %d, Failed: %d, Total: %s -- Time elapsed: %s' % (self.successful_tasks, self.failed_tasks, progress_str, time_elapsed)
Util.print_dyn_progress(progress_str)
############################################################
#---Helper
############################################################
[docs] def get_chunked_cnt(self, cnt):
''' Get correct count then using `chunk`s. Each `chunk` contains `self.tasks_per_chunk` tasks '''
return min(cnt * self.tasks_per_chunk, self.cnt_total_task)
[docs] def get_total_run_tasks(self):
''' Return the total number of tasks that have been run (succesful + failed) '''
res = self.failed_tasks + self.successful_tasks
self.__analyzed_cnt_sm.value = res
return res
[docs] def get_total_run_tasks_sm(self):
''' Return the total number of tasks that have been run (succesful + failed) via shared memory '''
return self.__analyzed_cnt_sm