void sendGetSW(int sock, struct sockaddr_in from) { packet *p; // check if the target chunkHash has been transferred by other peers // allow concurrent download while (queue_contains(peers[nodeInMap]->chunkHash) == EXIT_FAILURE) { if (peers[nodeInMap]->next == NULL ) { if (queue_empty() == EXIT_SUCCESS) { dprintf(STDOUT_FILENO, "JOB is done\n"); numDataMisses[nodeInMap] = -1; } return; } linkNode *temp = peers[nodeInMap]; peers[nodeInMap] = peers[nodeInMap]->next; free(temp); } if (peers[nodeInMap]->chunkHash == NULL ) { dprintf(STDOUT_FILENO, "sending chunk equals zero\n"); return; } p = packet_factory(GET); p->packet_length = 20 + BT_CHUNKS_SIZE; p->ack_num = 0; p->payload[0] = 1; p->payload[1] = '\0'; p->payload[2] = '\0'; p->payload[3] = '\0'; strncpy(p->payload + 4, peers[nodeInMap]->chunkHash, BT_CHUNKS_SIZE); spiffy_sendto(sock, p, p->packet_length, 0, (struct sockaddr *) &from, sizeof(from)); jobs[nodeInMap] = getChunkId(peers[nodeInMap]->chunkHash, chunkf); dprintf(STDOUT_FILENO, "Requesting chunk ID: %d from %d\n", jobs[nodeInMap], nodeInMap); nextExpected[nodeInMap] = 1; GETTTL[nodeInMap] = 0; free(p); // chunk is transferring, remove it from work queue so that // other peers won't transfer this again queue_remove(getChunkHash(jobs[nodeInMap], chunkf)); }
int queue_enqueue(Queue * q, void * data) { if(!queue_isfull(q) && !queue_contains(q, data)) { q->data[q->write_ptr++] = (int) data; if(q->write_ptr == q->size){ q->write_ptr = 0; } q->count++; return 1; } return 0; }
int mapper(workQ *queue, work w){ //return 1 if queue_to_reduce already contains this work, otherwise returns 0 int work_pos; //printf("mapping %s\n",w.str); work_pos = queue_contains(queue, w); if(work_pos >= 0){ queue->works[work_pos].count++; return 1; }else{ putWork(queue, w); return 0; } }
fifoQ* reducer(fifoQ *to_reduce){ fifoQ* reduced = initQ(10000,"reduced"); int i; int work_pos; for(i=0;i<=to_reduce->in;i++){ work_pos = queue_contains(reduced, to_reduce->works[i]); if(work_pos >= 0){ reduced->works[work_pos].count += to_reduce->works[i].count; }else{ putWork(reduced, to_reduce->works[i]); } } return reduced; }
int mapper(fifoQ *queue, work w){ //return 1 if queue_to_reduce already contains this work, otherwise returns 0 int work_pos; work_pos = queue_contains(queue, w); if(work_pos >= 0){ //printf("mapping %s, found same\n",w.str); omp_set_lock(&mapperlock); queue->works[work_pos].count++; //printf("%s: %d\n", queue->works[work_pos].str,queue->works[work_pos].count); omp_unset_lock(&mapperlock); return 1; }else{ //printf("mapping %s, found nothing\n",w.str); putWork(queue, w); //omp_unset_lock(&mapperlock); return 0; } }