/* 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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
Exemple #4
0
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;
}
Exemple #5
0
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;
}
Exemple #6
0
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;
}
Exemple #7
0
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;
}