Пример #1
0
Файл: peer.c Проект: SunnyQ/cmu
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));
}
Пример #2
0
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;
	}
}
Пример #4
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;
}
Пример #5
0
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;
	}
}