Critical.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. std::cout << "Create Critical: " << id << "\n";
  16. }
  17. // Destructor
  18. Critical::~Critical()
  19. {
  20. std::cout << "Delete Critical: " << id << "\n";
  21. DeleteCriticalSection( &cs );
  22. }
  23. // sperrt das Objekt
  24. void Critical::lock()
  25. {
  26. pthread_t t = GetCurrentThread();
  27. Thread *tmp = getThreadRegister()->zThread( t );
  28. if( tmp )
  29. tmp->addCriticalLock();
  30. EnterCriticalSection( &cs );
  31. std::cout << "Lock Critical: " << id << "\n";
  32. if( !owner )
  33. owner = tmp;
  34. lockCount++;
  35. }
  36. // versucht das Objekt zu sperren
  37. bool Critical::tryLock()
  38. {
  39. if( lockCount > 0 )
  40. return false;
  41. Thread *tmp = getThreadRegister()->zThread( GetCurrentThread() );
  42. if( tmp )
  43. tmp->addCriticalLock();
  44. EnterCriticalSection( &cs );
  45. std::cout << "Lock Critical: " << id << "\n";
  46. if( !owner )
  47. owner = tmp;
  48. lockCount++;
  49. return true;
  50. }
  51. // entsperrt das Objekt
  52. void Critical::unlock()
  53. {
  54. if( owner && GetThreadId( owner->getThreadHandle() ) != GetThreadId( GetCurrentThread() ) )
  55. throw std::runtime_error( "A Thread that does not own a Critical Object trys to unlock it" );
  56. Thread *tmp = owner;
  57. if( !--lockCount )
  58. owner = 0;
  59. std::cout << "Unlock Critical: " << id << "\n";
  60. LeaveCriticalSection( &cs );
  61. if( tmp )
  62. tmp->removeCriticalLock();
  63. }
  64. // gibt true zurück, wenn das Objekt gesperrt ist
  65. bool Critical::isLocked() const
  66. {
  67. return lockCount > 0;
  68. }
  69. // gibt einen Zeiger auf den Thread zurück, der das Objekt gesperrt hat
  70. const Thread *Critical::zOwner() const
  71. {
  72. return owner;
  73. }