Ejemplo n.º 1
0
Archivo: egchan.c Proyecto: nclack/chan
void* producer(void* arg)
{ Chan* writer;
  int*  buf;
  int id;
  
  id = GETID(arg);
  printf("Producer %d starting"ENDL,id);
  writer = Chan_Open(GETCHAN(arg),CHAN_WRITE);
  buf = (int*)Chan_Token_Buffer_Alloc(writer);
  do
  { buf[0] = InterlockedIncrement(&item);
    usleep(1);
    usleep(1);
    printf("Producer: item %4d [   + ] %d"ENDL, buf[0], id);
#pragma omp critical
    {
      mymax(&pmax,*buf);
    }
    Chan_Next(writer,(void**)&buf,sizeof(int));
  } while(!stop);
  Chan_Token_Buffer_Free(buf);
  Chan_Close(writer);
  printf("Producer %d exiting"ENDL,id);
  return NULL;
}
Ejemplo n.º 2
0
    unsigned int
    Terminator::run(IDevice *d)
    {
      Chan **q;   // input queues (all input channels)
      void **buf;  // array of token buffers
      size_t *szs; // array of buffer sizes
      unsigned int i, n, any;
      
      n = d->_in->nelem;
      q   = (Chan **) (Guarded_Malloc(n*sizeof(Chan*),
                                     "Worker device task - Terminator"));
      buf = (void**)  (Guarded_Malloc(n * sizeof(void*),
                                     "Worker device task - Terminator"));
      szs = (size_t*) (Guarded_Malloc(n * sizeof(size_t),
                                     "Worker device task - Terminator"));
      // alloc the token buffers
      for (i = 0; i < n; i++)
      { q[i]   = Chan_Open(d->_in->contents[i],CHAN_READ);
        buf[i] = Chan_Token_Buffer_Alloc(q[i]);
        szs[i] = Chan_Buffer_Size_Bytes(q[i]);
      }

      // main loop      
      
      do
      { 
#if 0
        if( !Chan_Is_Empty(q[0]) ) DBG("Convenient break point\r\n");
#endif
        any=0;
        for(i=0;i<n;++i)
        { any |= CHAN_SUCCESS(Chan_Next(q[i],buf+i,szs[i]));
          szs[i] = Chan_Buffer_Size_Bytes(q[i]);
        }        
      } while(any); // quits when all inputs fail to pop
      
      // cleanup
      for (i = 0; i < n; i++)
      { Chan_Token_Buffer_Free(buf[i]);
        Chan_Close(q[i]);
      }

      free(buf);
      return 0; // success
    }
Ejemplo n.º 3
0
Archivo: egchan.c Proyecto: nclack/chan
int main(int argc,char* argv[])
{ Chan *chan;
  Thread*  threads[N];
  input_t  inputs[N];

  stop=0;
  item=0;

  chan = Chan_Alloc(16,sizeof(int));

  stop=0;
  { size_t i;
    ThreadProc procs[N] = { 
      consumer,
      consumer,
      consumer,
      consumer,
      producer,
      producer,
      producer,
      producer,
      producer,
    };
    for(i=0;i<N;++i)
    { inputs[i].id   = i;
      inputs[i].chan = chan;
    }
    for(i=0;i<N;++i)
    { threads[i] = Thread_Alloc(procs[i],(void*)(inputs+i));
      usleep(10);
    }
  }

  //usleep(100);
  Chan_Wait_For_Ref_Count(chan,N+1);
  stop=1;
  printf("*** Main: triggered stop ***"ENDL);
  { int i=0;
    for(i=0;i<N;++i)
      Thread_Join(threads[i]);
  }
  Chan_Close(chan);
  printf("Balance: (%d,%d) %s"ENDL,pmax,cmax,(pmax==cmax)?"Ok!":"Mismatch *****");
  return 0;
}
Ejemplo n.º 4
0
Archivo: egchan.c Proyecto: nclack/chan
void* consumer(void* arg)
{ Chan* reader;
  int*  buf,id;
  
  id = GETID(arg);
  printf("Consumer %d starting\n",id);
  reader = Chan_Open(GETCHAN(arg),CHAN_READ);
  buf = (int*)Chan_Token_Buffer_Alloc(reader);
  while(CHAN_SUCCESS(Chan_Next(reader,(void**)&buf,sizeof(int))))
  { //i=InterlockedDecrement(&item);
    printf("Consumer: item %4d [ -   ] %d"ENDL, buf[0], id);
#pragma omp critical
    {
      mymax(&cmax,buf[0]);
    }
  } 
  Chan_Token_Buffer_Free(buf);
  Chan_Close(reader);
  printf("Consumer %d exiting"ENDL,id);
  return NULL;
}