Critical.cpp 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include "Critical.h"
  2. #include "Globals.h"
  3. #include "Thread.h"
  4. using namespace Framework;
  5. // Inhalt der Critical class aus Critical.h
  6. // Konstructor
  7. Critical::Critical()
  8. {
  9. InitializeCriticalSection( &cs );
  10. }
  11. // Destructor
  12. Critical::~Critical()
  13. {
  14. DeleteCriticalSection( &cs );
  15. }
  16. // sperrt das Objekt
  17. void Critical::lock()
  18. {
  19. EnterCriticalSection( &cs );
  20. if( !owner )
  21. owner = getThreadRegister()->zThread( GetCurrentThread() );
  22. if( owner )
  23. owner->addCriticalLock();
  24. lockCount++;
  25. }
  26. // versucht das Objekt zu sperren
  27. bool Critical::tryLock()
  28. {
  29. if( lockCount > 0 )
  30. return false;
  31. EnterCriticalSection( &cs );
  32. if( !owner )
  33. owner = getThreadRegister()->zThread( GetCurrentThread() );
  34. if( owner )
  35. owner->addCriticalLock();
  36. lockCount++;
  37. return true;
  38. }
  39. // entsperrt das Objekt
  40. void Critical::unlock()
  41. {
  42. if( owner && owner->getThreadHandle() != GetCurrentThread() )
  43. throw std::runtime_error( "A Thread that does not own a Critical Object trys to unlock it" );
  44. if( owner )
  45. owner->removeCriticalLock();
  46. if( !--lockCount )
  47. owner = 0;
  48. LeaveCriticalSection( &cs );
  49. }
  50. // gibt true zurück, wenn das Objekt gesperrt ist
  51. bool Critical::isLocked() const
  52. {
  53. return lockCount > 0;
  54. }
  55. // gibt einen Zeiger auf den Thread zurück, der das Objekt gesperrt hat
  56. const Thread *Critical::zOwner() const
  57. {
  58. return owner;
  59. }