summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/cache.py
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2012-05-23 00:23:31 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2012-05-23 11:33:18 +0100
commitd7b818b51f3e6dded0c0885cdfed5a24cda3b428 (patch)
tree6cd18f70cb71682aad55a6079da32c25f60bcbf7 /bitbake/lib/bb/cache.py
parent644b30adfb8fb158a253712033f717aadf6f2c68 (diff)
downloadpoky-d7b818b51f3e6dded0c0885cdfed5a24cda3b428.tar.gz
bitbake: refactor out codeparser cache into a separate class
We want to be able to reuse most this functionality for the file checksum cache. (Bitbake rev: 0fe3cb1438d297f90dd0fc6b26362ecbff75c76d) Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/cache.py')
-rw-r--r--bitbake/lib/bb/cache.py116
1 files changed, 114 insertions, 2 deletions
diff --git a/bitbake/lib/bb/cache.py b/bitbake/lib/bb/cache.py
index 47e814b577..36e6356f51 100644
--- a/bitbake/lib/bb/cache.py
+++ b/bitbake/lib/bb/cache.py
@@ -1,11 +1,12 @@
1# ex:ts=4:sw=4:sts=4:et 1# ex:ts=4:sw=4:sts=4:et
2# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- 2# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
3# 3#
4# BitBake 'Event' implementation 4# BitBake Cache implementation
5# 5#
6# Caching of bitbake variables before task execution 6# Caching of bitbake variables before task execution
7 7
8# Copyright (C) 2006 Richard Purdie 8# Copyright (C) 2006 Richard Purdie
9# Copyright (C) 2012 Intel Corporation
9 10
10# but small sections based on code from bin/bitbake: 11# but small sections based on code from bin/bitbake:
11# Copyright (C) 2003, 2004 Chris Larson 12# Copyright (C) 2003, 2004 Chris Larson
@@ -703,4 +704,115 @@ class CacheData(object):
703 for info in info_array: 704 for info in info_array:
704 info.add_cacheData(self, fn) 705 info.add_cacheData(self, fn)
705 706
706 707
708class MultiProcessCache(object):
709 """
710 BitBake multi-process cache implementation
711
712 Used by the codeparser & file checksum caches
713 """
714
715 def __init__(self):
716 self.cachefile = None
717 self.cachedata = self.create_cachedata()
718 self.cachedata_extras = self.create_cachedata()
719
720 def init_cache(self, d):
721 cachedir = (d.getVar("PERSISTENT_DIR", True) or
722 d.getVar("CACHE", True))
723 if cachedir in [None, '']:
724 return
725 bb.utils.mkdirhier(cachedir)
726 self.cachefile = os.path.join(cachedir, self.__class__.cache_file_name)
727 logger.debug(1, "Using cache in '%s'", self.cachefile)
728
729 try:
730 p = pickle.Unpickler(file(self.cachefile, "rb"))
731 data, version = p.load()
732 except:
733 return
734
735 if version != self.__class__.CACHE_VERSION:
736 return
737
738 self.cachedata = data
739
740 def internSet(self, items):
741 new = set()
742 for i in items:
743 new.add(intern(i))
744 return new
745
746 def compress_keys(self, data):
747 # Override in subclasses if desired
748 return
749
750 def create_cachedata(self):
751 data = [{}]
752 return data
753
754 def save_extras(self, d):
755 if not self.cachefile:
756 return
757
758 glf = bb.utils.lockfile(self.cachefile + ".lock", shared=True)
759
760 i = os.getpid()
761 lf = None
762 while not lf:
763 lf = bb.utils.lockfile(self.cachefile + ".lock." + str(i), retry=False)
764 if not lf or os.path.exists(self.cachefile + "-" + str(i)):
765 if lf:
766 bb.utils.unlockfile(lf)
767 lf = None
768 i = i + 1
769 continue
770
771 p = pickle.Pickler(file(self.cachefile + "-" + str(i), "wb"), -1)
772 p.dump([self.cachedata_extras, self.__class__.CACHE_VERSION])
773
774 bb.utils.unlockfile(lf)
775 bb.utils.unlockfile(glf)
776
777 def merge_data(self, source, dest):
778 for j in range(0,len(dest)):
779 for h in source[j]:
780 if h not in dest[j]:
781 dest[j][h] = source[j][h]
782
783 def save_merge(self, d):
784 if not self.cachefile:
785 return
786
787 glf = bb.utils.lockfile(self.cachefile + ".lock")
788
789 try:
790 p = pickle.Unpickler(file(self.cachefile, "rb"))
791 data, version = p.load()
792 except (IOError, EOFError):
793 data, version = None, None
794
795 if version != self.__class__.CACHE_VERSION:
796 data = self.create_cachedata()
797
798 for f in [y for y in os.listdir(os.path.dirname(self.cachefile)) if y.startswith(os.path.basename(self.cachefile) + '-')]:
799 f = os.path.join(os.path.dirname(self.cachefile), f)
800 try:
801 p = pickle.Unpickler(file(f, "rb"))
802 extradata, version = p.load()
803 except (IOError, EOFError):
804 extradata, version = self.create_cachedata(), None
805
806 if version != self.__class__.CACHE_VERSION:
807 continue
808
809 self.merge_data(extradata, data)
810 os.unlink(f)
811
812 self.compress_keys(data)
813
814 p = pickle.Pickler(file(self.cachefile, "wb"), -1)
815 p.dump([data, self.__class__.CACHE_VERSION])
816
817 bb.utils.unlockfile(glf)
818