/* size is n kb */ int voole_read (const char *path, char *rbuf, size_t size, off_t offset, struct fuse_file_info *finfo) { finfo_t *fi = (finfo_t*)finfo->fh; session_t* psession = gdsl_list_get_head(fi->list_session); if (psession == NULL) return -ENOSYS; psession->fi = fi; int i = 0; printf("size:%zd,offset:%zd\n",size,offset); int index = offset/(16*1024); result_t *pr = NULL; int ret = 0; do{ i++; ret = tcp_cmd_download(i+index,0,psession,&pr); gdsl_list_insert_tail(fi->list_result,pr); }while(i*1024*16<size ); i=0; int sum = 0; do{ pr = gdsl_list_get_head(fi->list_result); printf("i am waiting sem 0x%x,seq %d\n",pr->psem,pr->seq); int ret = sem_wait(pr->psem); if (ret!=0) { perror("sem_wait error:\n"); sleep(10); continue; } if(pr->size <17 && pr->size!=-1) { perror("sem_wait size error:"); continue; } pthread_mutex_lock(&fi->flock); result_t* presult = gdsl_list_remove_head(fi->list_result); pthread_mutex_unlock(&fi->flock); tcp_sem_payback(pr->psem); printf("i have get a sem ,index %d,seq %d\n",i+1,presult->seq); if (presult->size <17) printf("get err\n"); sum += presult->size; if (pr->size != -1) memcpy(rbuf+i*1024*16,presult->pdata+17,(sum>size)?(size-sum+presult->size):presult->size); printf("this package size is %d\n",presult->size); mpfree(presult->pdata); mpfree(presult->preq); mpfree(presult); i++; }while(i*1024*16<size ); printf("i will go out of recv,%d bytes\n",(sum>size)?size:sum); return size; //(sum>size)?size:sum; }
gdsl_list_t token_set_expression_mod(gdsl_list_t tokens, ExpressionModality mod) { Token *token = (Token *) gdsl_list_get_head(tokens); token->mod.expression = mod; if (!token->name) token->name = expression_modality[mod]; return tokens; }
gdsl_list_t token_set_function_mod(gdsl_list_t tokens, FunctionModality mod) { Token *token = (Token *) gdsl_list_get_head(tokens); token->mod.function = mod; if (!token->name) token->name = function_modality[mod]; return tokens; }
gdsl_list_t token_set_temporal_mod(gdsl_list_t tokens, TemporalModality mod) { Token *token = (Token *) gdsl_list_get_head(tokens); token->mod.temporal = mod; return tokens; }
gdsl_list_t token_set_equality_mod(gdsl_list_t tokens, EqualityModality mod) { Token *token = (Token *) gdsl_list_get_head(tokens); token->mod.equality = mod; return tokens; }
gdsl_list_t token_set_sign_mod(gdsl_list_t tokens, SignModality mod) { Token *token = (Token *) gdsl_list_get_head(tokens); token->mod.sign = mod; return tokens; }
gdsl_list_t token_set_sub(gdsl_list_t tokens, gdsl_list_t sub) { Token *token = (Token *) gdsl_list_get_head(tokens); token->sub = sub; return tokens; }
int tcp_cmd_download_resp_handle (session_t* pse,result_t* presult,cdnmsg_t* msg) { uint32_t host; uint8_t isnewse; struct in_addr in; session_t *psession; cdnmsg_t *req; switch (msg->body.downloadres.status) { case 0: presult->signal = 1; presult->pdata = (uint8_t*)msg; presult->size = ntohl(msg->head.len)-17; // sem_post(presult->psem); printf("i will post a sem,seq %d,sem 0x%x, ret %d\n",msg->head.seq, presult->psem,sem_post(presult->psem)); break; case 1: break; case 2: break; case 3: if (presult->trytimes>5){ presult->signal = 1; presult->pdata = msg; presult->size = -1; // sem_post(presult->psem); printf("i will post a sem,seq %d,sem 0x%x, ret %d, but i haven't down anything!\n", msg->head.seq, presult->psem,sem_post(presult->psem)); break; } psession = gdsl_list_get_head(pse->fi->list_session); pthread_mutex_lock(&psession->send_lock); gdsl_list_insert_tail(psession->send_queue,presult->preq); if (!psession->wtev) { psession->wtev = mpcalloc(sizeof(struct event)); event_set(psession->wtev,psession->fd,EV_WRITE|EV_PERSIST,tcp_session_cback,psession); event_add(psession->wtev,&psession->tv); } pthread_mutex_unlock(&psession->send_lock); //presult->trytimes ++; break; case 4: host = ntohl(*(uint32_t*)((uint8_t*)msg+17)); pthread_mutex_lock(&pse->fi->flock); psession = gdsl_hash_search(pse->fi->hash_session,host); if (!psession) { psession = mpcalloc(sizeof(struct _cdn_msg_session)); if (!psession) { printf("i can't malloc psession\n"); abort(); return;// -ENOSYS; } //finfo->fh = (uint64_t)psession; psession->fi = pse->fi; psession->host = host; psession->port = *(uint16_t*)((uint8_t*)msg+21); in.s_addr= psession->host; printf("redirect host: %s,port:%d\n",inet_ntoa(in),ntohs(psession->port)); /*psession->fd = */tcp_session_open(psession); tcp_session_init(psession); if (!psession->pdev){ psession->pdev = mpcalloc(sizeof(struct event)); event_set(psession->pdev,psession->fd,EV_READ|EV_PERSIST,tcp_session_cback,psession); event_add(psession->pdev,&psession->tv); } gdsl_hash_insert(pse->fi->hash_session,&host); gdsl_list_insert_tail(pse->fi->list_session,psession); //gdsl_list_insert_tail(voolefs.access,psession); } else { psession = gdsl_list_search(pse->fi->list_session,gdsl_session_host_cmp,&host); } pthread_mutex_unlock(&pse->fi->flock); req = (cdnmsg_t*)presult->preq; pthread_mutex_lock(&psession->send_lock); uint32_t len = ntohl(req->head.len); presult->trytimes ++; if (!psession->eagain){ int ret = 0,sum=0; do{ ret = write(psession->fd,(void*)req,len); if( ret == -1 && (errno == EAGAIN || errno == EINTR)) { psession->eagain = 1; psession->besent = len-sum; psession->send_incomplete = req; printf("i met eagain\n"); //continue; gdsl_list_insert_tail(psession->send_queue,req); if (!psession->wtev) { psession->wtev = mpcalloc(sizeof(struct event)); event_set(psession->wtev,psession->fd,EV_WRITE|EV_PERSIST,tcp_session_cback,psession); event_add(psession->wtev,&psession->tv); } pthread_mutex_unlock(&psession->send_lock); /* pthread_mutex_lock(&voolefs.reglock), gdsl_queue_insert(voolefs.registration, INT2PTR(psession->fd)), pthread_mutex_unlock(&voolefs.reglock); if (write(voolefs.notify_send_fd, " ", 1) != 1) perror("Error writing to notify pipe"); */ break; } else if( ret == -1) { pthread_mutex_unlock(&psession->send_lock); tcp_session_close(psession); mpfree(req); //*ppres = NULL; abort(); return -1; //do clean connection. } sum += ret; printf("i have send %d from fd:%d\n",sum,psession->fd); printf("my pdev is 0x%x, event_base is 0x%x, event is 0x%x\n",psession->pdev, (psession->pdev)?((struct event*)psession->pdev)->ev_base:NULL, (psession->pdev)?((struct event*)psession->pdev)->ev_events:NULL); }while(sum<len); pthread_mutex_unlock(&psession->send_lock); } else{ gdsl_list_insert_tail(psession->send_queue,req); if (!psession->wtev) { psession->wtev = mpcalloc(sizeof(struct event)); event_set(psession->wtev,psession->fd,EV_WRITE|EV_PERSIST,tcp_session_cback,psession); event_add(psession->wtev,&psession->tv); } pthread_mutex_unlock(&psession->send_lock); /* pthread_mutex_lock(&voolefs.reglock), gdsl_queue_insert(voolefs.registration, INT2PTR(psession->fd)), pthread_mutex_unlock(&voolefs.reglock); if (write(voolefs.notify_send_fd, " ", 1) != 1) perror("Error writing to notify pipe"); */ } break; default: break; } return 0; }