remotedata.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. """
  2. BitBake 'remotedata' module
  3. Provides support for using a datastore from the bitbake client
  4. """
  5. # Copyright (C) 2016 Intel Corporation
  6. #
  7. # SPDX-License-Identifier: GPL-2.0-only
  8. #
  9. import bb.data
  10. class RemoteDatastores:
  11. """Used on the server side to manage references to server-side datastores"""
  12. def __init__(self, cooker):
  13. self.cooker = cooker
  14. self.datastores = {}
  15. self.locked = []
  16. self.datastores[0] = self.cooker.data
  17. self.nextindex = 1
  18. def __len__(self):
  19. return len(self.datastores)
  20. def __getitem__(self, key):
  21. # Cooker could have changed its datastore from under us
  22. self.datastores[0] = self.cooker.data
  23. return self.datastores[key]
  24. def items(self):
  25. return self.datastores.items()
  26. def store(self, d, locked=False):
  27. """
  28. Put a datastore into the collection. If locked=True then the datastore
  29. is understood to be managed externally and cannot be released by calling
  30. release().
  31. """
  32. idx = self.nextindex
  33. self.datastores[idx] = d
  34. if locked:
  35. self.locked.append(idx)
  36. self.nextindex += 1
  37. return idx
  38. def check_store(self, d, locked=False):
  39. """
  40. Put a datastore into the collection if it's not already in there;
  41. in either case return the index
  42. """
  43. for key, val in self.datastores.items():
  44. if val is d:
  45. idx = key
  46. break
  47. else:
  48. idx = self.store(d, locked)
  49. return idx
  50. def release(self, idx):
  51. """Discard a datastore in the collection"""
  52. if idx in self.locked:
  53. raise Exception('Tried to release locked datastore %d' % idx)
  54. del self.datastores[idx]