Esempio n. 1
0
File: egchan.c Progetto: 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;
}
Esempio 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
    }
Esempio n. 3
0
File: egchan.c Progetto: 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;
}