- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2014-12-15 16:51 编辑
windoze 发表于 2014-12-15 15:53 ![]()
回复 53# yulihua49
没错,fiber本来就省不下这些内存。
我的设想如下:
只有IO完不成的时候才产生fiber,完成后销毁,SendNet是透明的,异步不异步看环境,就是能找到ucontext就做异步。- int SendNet(int socket,char *buf,int n,int MTU,int TCB_no)
- {
- int bcount,br;
- int sz,i=0;
- int fflag;
- ucontext_t *uc=get_uc(TCB_no);
- unsigned long begin_stack,save_stack_size=0;
- if(socket<0) return SYSERR;
- fflag=fcntl(socket,F_GETFL,0);
- if(uc) {
- //计算所需的栈帧
- swapcontext(uc,uc);
- #if __WORDSIZE == 64
- begin_stack=uc->uc_link->uc_mcontext.gregs[REG_RSP];
- save_stack_size=(uc->uc_mcontext.gregs[REG_RSP]-begin_stack);
- #else
- if(uc->uc_mcontext.gregs[REG_SS] == uc->uc_link->uc_mcontext.gregs[REG_SS]) {
- begin_stack=uc->uc_link->uc_mcontext.gregs[REG_ESP];
- save_stack_size=(uc->uc_mcontext.gregs[REG_ESP]-begin_stack);
- }
- #endif
- if(save_stack_size > 0X200000) save_stack_size=0; //>2M,
- if(save_stack_size==0) { //如果需要保存的栈帧太大,就不要异步了
- uc=NULL;
- } else {
- fcntl(socket,F_SETFL,fflag|O_NONBLOCK); //异步操作
- }
- }
- bcount=0;
- br=0;
- if(MTU>500) SendSize=MTU;
- else SendSize=n;
- while(bcount<n){
- sz=MIN(n-bcount,SendSize);
- if((br=write(socket,buf,sz))>0){
- bcount+=br;
- buf+=br;
- continue;
- }
- if(br<0) break;
- if(bcount < n && uc) { //切换任务
- if(!uc->uc_stack.ss_size) {
- //创建fiber
- uc->uc_stack.ss_size=save_stack_size+256;
- uc->uc_stack.ss_sp=malloc(uc->uc_stack.ss_size);
- //保存线程栈帧 memcpy(uc->uc_stack.ss_sp-save_stack_size,begin_stack-save_stack_size,save_stack_size);
- swapcontext(uc,uc);
- //将REG_RSP,REG_RBP调整到新位置
- //将实际的rsp,rbp也调过来 这需要一段asm
- // ......
- }
- i=do_event(socket,1); //do_epoll EPOLLOUT
- swapcontext(uc,uc->uc_link); // thread escape
- }
- }
- if(uc) {
- if(uc->uc_stack.ss_sp) {// 销毁fiber
- //恢复线程栈帧 需要一点ASM
- //到新的uc->uc_link.uc_mcontext.gregs[REG_RSP];
- // ......
- free(uc->uc_stack.ss_sp);
- uc->uc_stack.ss_size=0;
- }
- fcntl(socket,F_SETFL,fflag);
- }
- return bcount==0?-1:bcount;
- }
复制代码 48,49行可能是不需要的。uc->uc_link是本线程返回点的context。
54行本线程完成了退栈,转其他任务。再回来时使用的fiber栈。
你提些看法。 |
|