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; }
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 }
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; }