test_CountedResource.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. from direct.showbase.CountedResource import CountedResource
  2. def test_CountedResource():
  3. class MouseResource(CountedResource):
  4. """
  5. A simple class to demonstrate the acquisition of a resource.
  6. """
  7. @classmethod
  8. def acquire(cls):
  9. # The call to the super-class's acquire() is
  10. # not necessary at the moment, but may be in
  11. # the future, so do it now for good measure.
  12. super(MouseResource, cls).acquire()
  13. # Now acquire the resource this class is
  14. # managing.
  15. print('-- Acquire Mouse')
  16. @classmethod
  17. def release(cls):
  18. # First, release the resource this class is
  19. # managing.
  20. print('-- Release Mouse')
  21. # The call to the super-class's release() is
  22. # not necessary at the moment, but may be in
  23. # the future, so do it now for good measure.
  24. super(MouseResource, cls).release()
  25. def __init__(self):
  26. super(MouseResource, self).__init__()
  27. def __del__(self):
  28. super(MouseResource, self).__del__()
  29. class CursorResource(CountedResource):
  30. """
  31. A class to demonstrate how to implement a dependent
  32. resource. Notice how this class also inherits from
  33. CountedResource. Instead of subclassing MouseCounter,
  34. we will just acquire it in our __init__() and release
  35. it in our __del__().
  36. """
  37. @classmethod
  38. def acquire(cls):
  39. super(CursorResource, cls).acquire()
  40. print('-- Acquire Cursor')
  41. @classmethod
  42. def release(cls):
  43. print('-- Release Cursor')
  44. super(CursorResource, cls).release()
  45. def __init__(self):
  46. # The required resource references should
  47. # be stored on 'self' since we want to
  48. # release it when the object is deleted.
  49. self.__mouseResource = MouseResource()
  50. # Call the super-classes __init__()
  51. # after all required resources are
  52. # referenced.
  53. super(CursorResource, self).__init__()
  54. def __del__(self):
  55. # Free up the most dependent resource
  56. # first, the one this class is managing.
  57. super(CursorResource, self).__del__()
  58. # Now unlink any required resources.
  59. del self.__mouseResource
  60. class InvalidResource(MouseResource):
  61. @classmethod
  62. def acquire(cls):
  63. super(InvalidResource, cls).acquire()
  64. print('-- Acquire Invalid')
  65. @classmethod
  66. def release(cls):
  67. print('-- Release Invalid')
  68. super(InvalidResource, cls).release()
  69. print('\nAllocate Mouse')
  70. m = MouseResource()
  71. print('Free up Mouse')
  72. del m
  73. print('\nAllocate Cursor')
  74. c = CursorResource()
  75. print('Free up Cursor')
  76. del c
  77. print('\nAllocate Mouse then Cursor')
  78. m = MouseResource()
  79. c = CursorResource()
  80. print('Free up Cursor')
  81. del c
  82. print('Free up Mouse')
  83. del m
  84. print('\nAllocate Mouse then Cursor')
  85. m = MouseResource()
  86. c = CursorResource()
  87. print('Free up Mouse')
  88. del m
  89. print('Free up Cursor')
  90. del c
  91. print('\nAllocate Cursor then Mouse')
  92. c = CursorResource()
  93. m = MouseResource()
  94. print('Free up Mouse')
  95. del m
  96. print('Free up Cursor')
  97. del c
  98. print('\nAllocate Cursor then Mouse')
  99. c = CursorResource()
  100. m = MouseResource()
  101. print('Free up Cursor')
  102. del c
  103. # example of an invalid subclass
  104. try:
  105. print('\nAllocate Invalid')
  106. i = InvalidResource()
  107. print('Free up Invalid')
  108. except AssertionError as e:
  109. print(e)
  110. print('')
  111. print('Free up Mouse')
  112. del m
  113. def demoFunc():
  114. print('\nAllocate Cursor within function')
  115. c = CursorResource()
  116. print('Cursor will be freed on function exit')
  117. demoFunc()