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); }
/*** ** 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; }