int32_t function_exit(){
    register uint32_t currentRecord = *functionIndexAddr;
#ifndef EXCLUDE_TIMER
    //    PRINT_INSTR(stdout, "%s exit %d", functionNames[currentRecord], currentRecord);
    uint64_t tadd = popIndex(currentRecord, read_timestamp_counter());
    funcInfos[currentRecord].count++;
    funcInfos[currentRecord].timer_total += tadd;
#endif
    //    printFunctionInfo(currentRecord);
}
Ejemplo n.º 2
0
/***
 ** subthread main program
 ***/
void *soldier_mission(void *task) {
    /** set subthread unable cancel **/
    //int setcancel_rst;
    //int oldstate = 0;
    //int oldtype = 0;
    //setcancel_rst = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
    //setcancel_rst = pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);

    struct subthread_task local_task = *((struct subthread_task *)task);
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    struct sockaddr_in servaddr;
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(local_task.port);
    if(inet_pton(AF_INET, local_task.hostname, &servaddr.sin_addr) <= 0) {
        printf("[%s] is not avalid IP address!\n", local_task.hostname);
        return NULL;
    }
    if (connect(sockfd, (struct sockaddr*) &servaddr, sizeof(servaddr)) == -1) {
        perror("connect error");
        return NULL;
    }
    
    struct msg_synack syn_msg;
    struct synack syn_pack;

    syn_pack.downloadable = 1;
    syn_pack.thread_num = THREAD_LIMITION;
    syn_pack.file_info = local_task.file_info;

    syn_msg = pack_msg_synack(SYN, 0, sizeof(syn_pack), syn_pack);
    send(sockfd, &syn_msg, sizeof(struct msg_synack), 0);

    /** set socket timeout time **/
    struct timeval tv;
    tv.tv_sec = SOCK_TIMEOUT_SEC;
    tv.tv_usec = SOCK_TIMEOUT_USEC;
    if(setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0) {
        printf("socket option  SO_RCVTIMEO not support\n");
        close(sockfd);
        return NULL;
    }

    /*receive syn_ack from sever*/
    int times = 0;
    char temp_buf[MAXLEN];
    struct synack synack_pack;
    while(soldierLive == YES){
        int recv_len = recv(sockfd, temp_buf, sizeof(struct msg_synack) , 0);
        if(recv_len == -1) {
            printf("[thread: %d]timeout or read error\n", local_task.thread_no);
            send(sockfd, &syn_msg, sizeof(struct msg_synack), 0);
            if(++times > 3) {
                printf("[thread: %d] failed to receive syn_ack, transmit abort !\n", local_task.thread_no);
                return NULL;
            }
            continue;
        }
        struct message temp_msg = depack_msg(temp_buf, recv_len);
        if(temp_msg.type == SYN_ACK) {
            memcpy(&synack_pack, temp_msg.body, temp_msg.length);
            printf("[thread: %d] get syn_ack\n", local_task.thread_no);
            break;
        }else {
            printf("[thread: %d] received type: %d, not syn_ack we wanted, receive again\n", local_task.thread_no, temp_msg.type);
            continue;
        }
    }
    
    //setcancel_rst = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate);
    //setcancel_rst = pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
    //pthread_cleanup_push(close_cocket, &sockfd);

    int bytes_send = 0;
    int index = 0;
    int selfLive = YES;

    char target_full[100];
    strcpy(target_full, path);
    strcat(target_full, local_task.file_info.filename);

    FILE *targHandler = fopen(target_full, "rb");
    if(targHandler == NULL){
        printf("[thread: %d] open target file failed!\n", local_task.thread_no);
        return NULL;
    }
    while(soldierLive == YES && selfLive == YES){
        index = popIndex(NEW, PENDING, 1, local_task.thread_no);
        if(index == -1){
            printf("[thread: %d] reach the end index, exiting\n", local_task.thread_no);
            break;
        }
        char body[BODYLEN];
        int seekNum = index * BODYLEN;

        int seek_rst = fseek(targHandler, seekNum, SEEK_SET);
        int bytes_read = fread(body, sizeof(char), BODYLEN, targHandler);
        /*printf("[thread: %d] read length = %d, seek_rst = %d\n", local_task.thread_no, bytes_read, seek_rst);*/

        struct message ack_msg = pack_msg(DATA, index, bytes_read, body);
        bytes_send = sendto(sockfd, &ack_msg, sizeof(struct message), 0, (struct sockaddr *)&servaddr, sizeof(servaddr));
        //printf("[thread: %d] ========= send DATA index = %d, bytes = %d, \n", local_task.thread_no, index, bytes_send);
    }

    //printf("will enter second cycle in 5s ... \n");
    //sleep(5);
    ///* second cycle check */
    //while(soldierLive == YES && selfLive == YES){
        //if(index >= block_num){
            ////printf("[thread: %d] reach the end index, exiting\n", local_task.thread_no);
            //continue;
        //}
        //index = popIndex(PENDING, OLD_TASK, 2, local_task.thread_no);
        //char body[BODYLEN];
        //int seekNum = index * BODYLEN;

        //int seek_rst = fseek(targHandler, seekNum, SEEK_SET);
        //int bytes_read = fread(body, sizeof(char), BODYLEN, targHandler);

        //struct message ack_msg = pack_msg(DATA, index, bytes_read, body);
        //bytes_send = sendto(sockfd, &ack_msg, sizeof(struct message), 0, (struct sockaddr *)&servaddr, sizeof(servaddr));
        //printf("[thread: %d] ========= send DATA index = %d, bytes = %d, \n", local_task.thread_no, index, bytes_send);
    //}

    /** send FIN pack to server **/
    struct synack fin_pack ;
    struct msg_synack fin_msg = pack_msg_synack(FIN, 0, sizeof(struct synack), fin_pack);
    sendto(sockfd, &fin_msg, sizeof(struct msg_synack), 0, (struct sockaddr *)&servaddr, sizeof(servaddr));
    printf("[thread: %d] send FIN to finish transmition...\n", local_task.thread_no);

    fclose(targHandler);
    close(sockfd);
    //pthread_cleanup_pop(1);
    //thread_cleanup_pop(1);
    return NULL;
}