diff options
Diffstat (limited to 'bitbake/lib/bb/cache.py')
| -rw-r--r-- | bitbake/lib/bb/cache.py | 127 |
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 = {} |
