Critical.cpp 1.6 KB

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