///////////////////////////////////////////////////////////////////////////// // semaphor.cc // // SIMLIB version: 2.18 // Date: 2004-01-25 // // Copyright (c) 1994-2004 Petr Peringer // // This library is licensed under GNU Library GPL. See the file COPYING. // // // class Semaphore implementation // it is like Store, but without statistics (different queue sort order?) // //////////////////////////////////////////////////////////////////////////// // interface // #include "simlib.h" #include "internal.h" //////////////////////////////////////////////////////////////////////////// // implementation // SIMLIB_IMPLEMENTATION //////////////////////////////////////////////////////////////////////////// // constructors // Semaphore::Semaphore() { dprintf(("Semaphore::Semaphore()")); n = 1; } Semaphore::Semaphore(const char *name) { dprintf(("Semaphore::Semaphore(\"%s\")",name)); SetName(name); n = 1; } //////////////////////////////////////////////////////////////////////////// // destructor // Semaphore::~Semaphore() { dprintf(("Semaphore::~Semaphore() // \"%s\", %d ", Name(), n)); } //////////////////////////////////////////////////////////////////////////// // initialization of state // void Semaphore::Clear() { dprintf(("%s.Clear()", Name())); n = 1; Q.Clear(); // queue initialization ###!!! } //////////////////////////////////////////////////////////////////////////// // Output // void Semaphore::Output() { Print("Semaphore: %s [%d]\n", Name(), n); } //////////////////////////////////////////////////////////////////////////// // // void Semaphore::P() { dprintf(("Semaphore'%s'.P()", Name())); while(n == 0) { Q.Insert(Current); Passivate(Current); Q.Get(Current); } n = 0; } //////////////////////////////////////////////////////////////////////////// // // void Semaphore::V() { dprintf(("%s.V()", Name())); if(n==1) SIMLIB_error(SemaphoreError); n = 1; Entity *p = Q.front(); // first entity in queue if(p) p->Activate(); } // end