#include "common.h"
#include <pthread.h>
#include <queue>

static queue<int> events;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t condvar = PTHREAD_COND_INITIALIZER;

void* reply( void* ) {
   int rsq;
   while( true ) {
      if( events.empty() )
         pthread_cond_wait( &condvar, &mutex );
      rsq = events.front();
      events.pop();
      if( debug ) cout << '-' << rsq << '.' << flush;
      pthread_mutex_unlock( &mutex );
      retrans( rsq );
      close( rsq );
   };
}
    
// последовательный ретранслятор c очередью обслуживания
int main( int argc, char *argv[] ) {
   int ls = getsocket( QUEUE_PORT );
   setv( argc, argv );
   pthread_t tid;
   if( pthread_create( &tid, NULL, &reply, NULL ) != EOK )
      errx( "thread create error" );
   sched_yield();  // дать выбирающему потоку заблокироваться   
   while( true ) {
      int rs = accept( ls, NULL, NULL );
      if( rs < 0 ) errx( "accept error" ); 
      pthread_mutex_lock( &mutex );
      events.push( rs );
      pthread_cond_signal( &condvar ); // сообщать о наличии работы
      if( debug ) cout << '+' << rs << '.' << flush;
      pthread_mutex_unlock( &mutex );
   };
   exit( EXIT_SUCCESS );
};
