summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/cache.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/bb/cache.py')
-rw-r--r--bitbake/lib/bb/cache.py127
1 files changed, 60 insertions, 67 deletions
diff --git a/bitbake/lib/bb/cache.py b/bitbake/lib/bb/cache.py
index d0fb234f89..cce12d12e9 100644
--- a/bitbake/lib/bb/cache.py
+++ b/bitbake/lib/bb/cache.py
@@ -280,10 +280,9 @@ class Cache(object):
280 cache_ok = True 280 cache_ok = True
281 if self.caches_array: 281 if self.caches_array:
282 for cache_class in self.caches_array: 282 for cache_class in self.caches_array:
283 if type(cache_class) is type and issubclass(cache_class, RecipeInfoCommon): 283 cachefile = getCacheFile(self.cachedir, cache_class.cachefile, self.data_hash)
284 cachefile = getCacheFile(self.cachedir, cache_class.cachefile, self.data_hash) 284 cache_ok = cache_ok and os.path.exists(cachefile)
285 cache_ok = cache_ok and os.path.exists(cachefile) 285 cache_class.init_cacheData(self)
286 cache_class.init_cacheData(self)
287 if cache_ok: 286 if cache_ok:
288 self.load_cachefile() 287 self.load_cachefile()
289 elif os.path.isfile(self.cachefile): 288 elif os.path.isfile(self.cachefile):
@@ -296,54 +295,52 @@ class Cache(object):
296 295
297 # Calculate the correct cachesize of all those cache files 296 # Calculate the correct cachesize of all those cache files
298 for cache_class in self.caches_array: 297 for cache_class in self.caches_array:
299 if type(cache_class) is type and issubclass(cache_class, RecipeInfoCommon): 298 cachefile = getCacheFile(self.cachedir, cache_class.cachefile, self.data_hash)
300 cachefile = getCacheFile(self.cachedir, cache_class.cachefile, self.data_hash) 299 with open(cachefile, "rb") as cachefile:
301 with open(cachefile, "rb") as cachefile: 300 cachesize += os.fstat(cachefile.fileno()).st_size
302 cachesize += os.fstat(cachefile.fileno()).st_size
303 301
304 bb.event.fire(bb.event.CacheLoadStarted(cachesize), self.data) 302 bb.event.fire(bb.event.CacheLoadStarted(cachesize), self.data)
305 303
306 for cache_class in self.caches_array: 304 for cache_class in self.caches_array:
307 if type(cache_class) is type and issubclass(cache_class, RecipeInfoCommon): 305 cachefile = getCacheFile(self.cachedir, cache_class.cachefile, self.data_hash)
308 cachefile = getCacheFile(self.cachedir, cache_class.cachefile, self.data_hash) 306 with open(cachefile, "rb") as cachefile:
309 with open(cachefile, "rb") as cachefile: 307 pickled = pickle.Unpickler(cachefile)
310 pickled = pickle.Unpickler(cachefile) 308 # Check cache version information
311 # Check cache version information 309 try:
310 cache_ver = pickled.load()
311 bitbake_ver = pickled.load()
312 except Exception:
313 logger.info('Invalid cache, rebuilding...')
314 return
315
316 if cache_ver != __cache_version__:
317 logger.info('Cache version mismatch, rebuilding...')
318 return
319 elif bitbake_ver != bb.__version__:
320 logger.info('Bitbake version mismatch, rebuilding...')
321 return
322
323 # Load the rest of the cache file
324 current_progress = 0
325 while cachefile:
312 try: 326 try:
313 cache_ver = pickled.load() 327 key = pickled.load()
314 bitbake_ver = pickled.load() 328 value = pickled.load()
315 except Exception: 329 except Exception:
316 logger.info('Invalid cache, rebuilding...') 330 break
317 return 331 if key in self.depends_cache:
318 332 self.depends_cache[key].append(value)
319 if cache_ver != __cache_version__: 333 else:
320 logger.info('Cache version mismatch, rebuilding...') 334 self.depends_cache[key] = [value]
321 return 335 # only fire events on even percentage boundaries
322 elif bitbake_ver != bb.__version__: 336 current_progress = cachefile.tell() + previous_progress
323 logger.info('Bitbake version mismatch, rebuilding...') 337 current_percent = 100 * current_progress / cachesize
324 return 338 if current_percent > previous_percent:
325 339 previous_percent = current_percent
326 # Load the rest of the cache file 340 bb.event.fire(bb.event.CacheLoadProgress(current_progress, cachesize),
327 current_progress = 0 341 self.data)
328 while cachefile: 342
329 try: 343 previous_progress += current_progress
330 key = pickled.load()
331 value = pickled.load()
332 except Exception:
333 break
334 if key in self.depends_cache:
335 self.depends_cache[key].append(value)
336 else:
337 self.depends_cache[key] = [value]
338 # only fire events on even percentage boundaries
339 current_progress = cachefile.tell() + previous_progress
340 current_percent = 100 * current_progress / cachesize
341 if current_percent > previous_percent:
342 previous_percent = current_percent
343 bb.event.fire(bb.event.CacheLoadProgress(current_progress, cachesize),
344 self.data)
345
346 previous_progress += current_progress
347 344
348 # Note: depends cache number is corresponding to the parsing file numbers. 345 # Note: depends cache number is corresponding to the parsing file numbers.
349 # The same file has several caches, still regarded as one item in the cache 346 # The same file has several caches, still regarded as one item in the cache
@@ -407,9 +404,8 @@ class Cache(object):
407 404
408 info_array = [] 405 info_array = []
409 for cache_class in caches_array: 406 for cache_class in caches_array:
410 if type(cache_class) is type and issubclass(cache_class, RecipeInfoCommon): 407 info = cache_class(filename, data)
411 info = cache_class(filename, data) 408 info_array.append(info)
412 info_array.append(info)
413 infos.append((virtualfn, info_array)) 409 infos.append((virtualfn, info_array))
414 410
415 return infos 411 return infos
@@ -601,26 +597,23 @@ class Cache(object):
601 file_dict = {} 597 file_dict = {}
602 pickler_dict = {} 598 pickler_dict = {}
603 for cache_class in self.caches_array: 599 for cache_class in self.caches_array:
604 if type(cache_class) is type and issubclass(cache_class, RecipeInfoCommon): 600 cache_class_name = cache_class.__name__
605 cache_class_name = cache_class.__name__ 601 cachefile = getCacheFile(self.cachedir, cache_class.cachefile, self.data_hash)
606 cachefile = getCacheFile(self.cachedir, cache_class.cachefile, self.data_hash) 602 file_dict[cache_class_name] = open(cachefile, "wb")
607 file_dict[cache_class_name] = open(cachefile, "wb") 603 pickler_dict[cache_class_name] = pickle.Pickler(file_dict[cache_class_name], pickle.HIGHEST_PROTOCOL)
608 pickler_dict[cache_class_name] = pickle.Pickler(file_dict[cache_class_name], pickle.HIGHEST_PROTOCOL) 604 pickler_dict[cache_class_name].dump(__cache_version__)
609 pickler_dict[cache_class_name].dump(__cache_version__) 605 pickler_dict[cache_class_name].dump(bb.__version__)
610 pickler_dict[cache_class_name].dump(bb.__version__)
611 606
612 try: 607 try:
613 for key, info_array in self.depends_cache.items(): 608 for key, info_array in self.depends_cache.items():
614 for info in info_array: 609 for info in info_array:
615 if isinstance(info, RecipeInfoCommon): 610 cache_class_name = info.__class__.__name__
616 cache_class_name = info.__class__.__name__ 611 pickler_dict[cache_class_name].dump(key)
617 pickler_dict[cache_class_name].dump(key) 612 pickler_dict[cache_class_name].dump(info)
618 pickler_dict[cache_class_name].dump(info)
619 finally: 613 finally:
620 for cache_class in self.caches_array: 614 for cache_class in self.caches_array:
621 if type(cache_class) is type and issubclass(cache_class, RecipeInfoCommon): 615 cache_class_name = cache_class.__name__
622 cache_class_name = cache_class.__name__ 616 file_dict[cache_class_name].close()
623 file_dict[cache_class_name].close()
624 617
625 del self.depends_cache 618 del self.depends_cache
626 619
@@ -652,8 +645,7 @@ class Cache(object):
652 645
653 info_array = [] 646 info_array = []
654 for cache_class in self.caches_array: 647 for cache_class in self.caches_array:
655 if type(cache_class) is type and issubclass(cache_class, RecipeInfoCommon): 648 info_array.append(cache_class(realfn, data))
656 info_array.append(cache_class(realfn, data))
657 self.add_info(file_name, info_array, cacheData, parsed) 649 self.add_info(file_name, info_array, cacheData, parsed)
658 650
659 @staticmethod 651 @staticmethod
@@ -721,8 +713,9 @@ class CacheData(object):
721 def __init__(self, caches_array): 713 def __init__(self, caches_array):
722 self.caches_array = caches_array 714 self.caches_array = caches_array
723 for cache_class in self.caches_array: 715 for cache_class in self.caches_array:
724 if type(cache_class) is type and issubclass(cache_class, RecipeInfoCommon): 716 if not issubclass(cache_class, RecipeInfoCommon):
725 cache_class.init_cacheData(self) 717 bb.error("Extra cache data class %s should subclass RecipeInfoCommon class" % cache_class)
718 cache_class.init_cacheData(self)
726 719
727 # Direct cache variables 720 # Direct cache variables
728 self.task_queues = {} 721 self.task_queues = {}