/////////////////////////////////////////////////////////////////////////////
// barrier.cc
//
// SIMLIB version: 2.18
// Date: 2004-01-25
//
// Copyright (c) 1991-2004 Petr Peringer 
//
// This library is licensed under GNU Library GPL. See the file COPYING.
//

//
//  class Barrier implementation 
//
// ###poznamky - poradi aktivace - nastavitelne ??? FIFA/LIFA

////////////////////////////////////////////////////////////////////////////
//  interface
//

#include "simlib.h"
#include "internal.h"

////////////////////////////////////////////////////////////////////////////
//  implementation
//

SIMLIB_IMPLEMENTATION

////////////////////////////////////////////////////////////////////////////
//  constructors
//
Barrier::Barrier(unsigned N) : 
    waiting(0), n(0), maxn(N)
{
  dprintf(("Barrier::Barrier()"));
  Init();
}

Barrier::Barrier(const char *name, unsigned N) : 
    waiting(0), n(0), maxn(N)
{
  dprintf(("Barrier::Barrier(\"%s\")",name));
  SetName(name);
  Init();
}


////////////////////////////////////////////////////////////////////////////
//  destructor
//
Barrier::~Barrier()
{
  dprintf(("Barrier::~Barrier()  // \"%s\" ", Name()));
  delete[] waiting;
}

////////////////////////////////////////////////////////////////////////////
// Enter - input
//
void Barrier::Enter(Entity *e)  // without parameter??? Current?
{
  dprintf(("%s.Enter(%s)", Name(), e->Name() ));
  if (n<maxn-1)
  {
    waiting[n++] = e;
    e->Passivate();
  }
  else
  {
    Break();
    Current->Activate();          // reactivation ###??? last
  }
}

////////////////////////////////////////////////////////////////////////////
// Break - activation of all waiting entities
//
// returns: number of activated entities
//
int Barrier::Break() {
  int ret = n;
  if(n==0)
    return ret;
  for(unsigned i=0; i<n; i++) // order of activation???!!!### FIFO
  {
    waiting[i]->Activate();
    waiting[i] = 0;
  }
  n = 0;
//  Current->Activate();          // reactivation ###??? last ####^^^
  return ret;
}

////////////////////////////////////////////////////////////////////////////
// Init - private barrier initializtion
//
void Barrier::Init()
{
  dprintf(("%s.Init()", Name()));
  waiting = new Entity* [maxn]; // allocation   maxn-1 ???
  if(!waiting)
    SIMLIB_error(MemoryError);  // without exceptions !!!###
  Clear();
}

////////////////////////////////////////////////////////////////////////////
// Clear - barrier reinitializtion
//
void Barrier::Clear()
{
  dprintf(("%s.Clear()", Name()));
  n = 0;
  for(unsigned i=0; i<maxn; i++)
    waiting[i] = 0;
}

////////////////////////////////////////////////////////////////////////////
// Output - barrier status print
//
void Barrier::Output()
{
  Print("Barrier: %s\n", Name());
  for(unsigned i=0; i<maxn; i++)
    Print("%d:  [%p]\n", i, waiting[i]);
  Print("\n");
}

////////////////////////////////////////////////////////////////////////////
// end of BARRIER.CPP
////////////////////////////////////////////////////////////////////////////



syntax highlighted by Code2HTML, v. 0.9.1