免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: waruqi
打印 上一主题 下一主题

[C] tbox新增stackless协程支持 [复制链接]

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
21 [报告]
发表于 2017-01-23 20:26 |只看该作者
本帖最后由 yulihua49 于 2017-01-23 20:28 编辑

发了好几回都没了,一旦使用 code  帖子就丢了,白写了好多话。
static void *thread_work(void *param)
{
resource *rs=(resource *)param;
int ret,fds;
TCB *task=NULL;
struct epoll_event event;

        ShowLog(2,"%s:thread %lx start!",__FUNCTION__,pthread_self());
        getcontext(&rs->tc);
        if(task)  pthread_mutex_unlock(&task->lock);

        while(1) {
//从就绪队列取一个任务
                pthread_mutex_lock(&rpool.mut);
                while(!(task=rdy_get())) {
                        if(rpool.flg >= tpool.rdy_num) break;
                        rpool.flg++;
                        ret=pthread_cond_wait(&rpool.cond,&rpool.mut); //没有任务,等待
                         rpool.flg--;
                }
                pthread_mutex_unlock(&rpool.mut);
                if(task) {
                        if(!task->AIO_flg && !task->call_back) {
                                task->fd=task->conn.Socket;
                                ShowLog(5,"%s:tid=%lx,TCB_no=%d from rdy_queue",__FUNCTION__,
                                        pthread_self(),task->sv.TCB_no);
                                if(task->fd>=0) {
                                        do_epoll(task,0,0);
                                }
                                continue;
                        }
                } else  {
                        fds = epoll_wait(g_epoll_fd, &event, 1 , -1);
                        if(fds < 0){
                                        ShowLog(1,"%s:epoll_wait err=%d,%s",__FUNCTION__,errno,strerror(errno));
                                usleep(30000000);
                                continue;
                                }
                         task = (TCB *)event.data.ptr;
                        if(task->events) {
                            ShowLog(1,"%s:tid=%lx,TCB_no=%d,task->events=%08X,conflict!",__FUNCTION__,
                                    pthread_self(),task->sv.TCB_no,task->events);//发现惊群
                            task=NULL;
                            continue;//丢掉它
                        }
                        task->events=event.events;
                }
                rs->timestamp=now_usec();
                if(task->status>0) set_showid(task->ctx);//Showid 应该在会话上下文结构里
               
                if(task->AIO_flg) {//fiber task
                    task->uc.uc_link=&rs->tc;
                    rs->tc.uc_link=(ucontext_t *)task;
ShowLog(5,"%s:tid=%lx,resume to TCB_no=%d",__FUNCTION__,pthread_self(),task->sv.TCB_no);
                        pthread_mutex_lock(&task->lock);//防止其他线程提前闯入
                        setcontext(&task->uc);        //== longjmp()
                        continue;//no action,logic only
                }
                if(task->uc.uc_stack.ss_size>0) {//call_back模式,抢入了,进入同步模式
            rs->tc.uc_link=NULL;
ShowLog(5,"%s:tid %lx 抢入 SYNC",__FUNCTION__,pthread_self());
                        do_work(task->sv.TCB_no);
                        continue;
                }
                if(!rs->tc.uc_stack.ss_sp) {
ShowLog(5,"%s:%lx create fiber for TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);
                        task->uc.uc_stack.ss_sp=mmap(0, use_stack_size,
                                PROT_READ | PROT_WRITE | PROT_EXEC,
                                MAP_PRIVATE | MAP_ANON | MAP_GROWSDOWN, -1, 0);
                        if(task->uc.uc_stack.ss_sp==MAP_FAILED) {
                                task->uc.uc_stack.ss_sp=NULL;
                                do_work(task->sv.TCB_no); //进行你的服务,不使用AIO
                                continue;
                        }
                } else {
//ShowLog(5,"%s:%lx reuse fiber for TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);
                        task->uc.uc_stack.ss_sp=rs->tc.uc_stack.ss_sp;
                        rs->tc.uc_stack.ss_sp=NULL;
                        rs->tc.uc_stack.ss_size=0;
                }
                task->uc.uc_stack.ss_size=use_stack_size;
                task->uc.uc_link=&rs->tc;
                rs->tc.uc_link=(ucontext_t *)task;
                makecontext(&task->uc,(void (*)())do_work,1,task->sv.TCB_no);

                ret=swapcontext(&rs->tc,&task->uc);
                if(ret<0) {
                        ShowLog(1,"%s:swapcontext fault TCB_NO=%d,tid=%lx,errno=%d,%s",
                                __FUNCTION__,task->sv.TCB_no,pthread_self(),ret,strerror(abs(ret)));
                        rs->tc.uc_link=NULL;
                        task->uc.uc_link=NULL;
                        if(task->uc.uc_stack.ss_sp)
                                munmap(task->uc.uc_stack.ss_sp,task->uc.uc_stack.ss_size);
                        task->uc.uc_stack.ss_sp=NULL;
                        task->uc.uc_stack.ss_size=0;
                        do_work(task->sv.TCB_no);
                        mthr_showid_del(rs->tid);
                        continue;
                }
                if(!task) {
                        ShowLog(1,"%s:aft swapcontext task is NULL",__FUNCTION__);
                        continue;
                }
                if(!task->AIO_flg) {//service complate
                        if(!rs->tc.uc_stack.ss_size) {//回收fiber stack
//ShowLog(5,"%s:%lx release fiber from TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);
                                rs->tc.uc_stack.ss_sp=task->uc.uc_stack.ss_sp;
                                if(rs->tc.uc_stack.ss_sp)
                                         rs->tc.uc_stack.ss_size=use_stack_size;
                                else rs->tc.uc_stack.ss_size=0;
                        } else {
ShowLog(5,"%s:%lx destroy fiber from TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);
                                if(task->uc.uc_stack.ss_sp)
                                        munmap(task->uc.uc_stack.ss_sp,task->uc.uc_stack.ss_size);
                        }
                        task->uc.uc_stack.ss_sp=NULL;
                        rs->tc.uc_link=NULL;
                        task->uc.uc_link=NULL;
                        task->uc.uc_stack.ss_size=0;//mark fiber cpmplate
//ShowLog(5,"%s:TCB_no=%d,tid=%lx,timeout=%d,conn.timeout=%d",__FUNCTION__,task->sv.TCB_no,rs->tid,task->timeout,task->conn.timeout);
                } else {
                        pthread_mutex_unlock(&task->lock);

ShowLog(5,"%s:tid=%lx,fiber yield from TCB_no=%d",
                        __FUNCTION__,pthread_self(),task->sv.TCB_no);
                }
                mthr_showid_del(rs->tid);
        }
        ShowLog(1,"%s:tid=%lx canceled",__FUNCTION__,pthread_self());
        mthr_showid_del(rs->tid);
        rs->timestamp=now_usec();
        rs->status=0;
        rs->tid=0;
        if(rs->tc.uc_stack.ss_sp) {
                munmap(rs->tc.uc_stack.ss_sp,rs->tc.uc_stack.ss_size);
                rs->tc.uc_stack.ss_sp=NULL;
                rs->tc.uc_stack.ss_size=0;
        }
        return NULL;
}

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
22 [报告]
发表于 2017-01-23 20:29 |只看该作者
static void *thread_work(void *param)
{
resource *rs=(resource *)param;
int ret,fds;
TCB *task=NULL;
struct epoll_event event;

        ShowLog(2,"%s:thread %lx start!",__FUNCTION__,pthread_self());
        getcontext(&rs->tc);
        if(task)  pthread_mutex_unlock(&task->lock);

        while(1) {
//从就绪队列取一个任务
                pthread_mutex_lock(&rpool.mut);
                while(!(task=rdy_get())) {
                        if(rpool.flg >= tpool.rdy_num) break;
                        rpool.flg++;
                        ret=pthread_cond_wait(&rpool.cond,&rpool.mut); //没有任务,等待
                        rpool.flg--;
                }
                pthread_mutex_unlock(&rpool.mut);
                if(task) {
                        if(!task->AIO_flg && !task->call_back) {
                                task->fd=task->conn.Socket;
                                ShowLog(5,"%s:tid=%lx,TCB_no=%d from rdy_queue",__FUNCTION__,
                                        pthread_self(),task->sv.TCB_no);
                                if(task->fd>=0) {
                                        do_epoll(task,0,0);
                                }
                                continue;
                        }
                } else  {
                        fds = epoll_wait(g_epoll_fd, &event, 1 , -1);
                        if(fds < 0){
                                        ShowLog(1,"%s:epoll_wait err=%d,%s",__FUNCTION__,errno,strerror(errno));
                                usleep(30000000);
                                continue;
                                }
                         task = (TCB *)event.data.ptr;
                        if(task->events) {
                            ShowLog(1,"%s:tid=%lx,TCB_no=%d,task->events=%08X,conflict!",__FUNCTION__,
                                    pthread_self(),task->sv.TCB_no,task->events);//发现惊群
                            task=NULL;
                            continue;//丢掉它
                        }
                        task->events=event.events;
                }
                rs->timestamp=now_usec();
                if(task->status>0) set_showid(task->ctx);//Showid 应该在会话上下文结构里
               
                if(task->AIO_flg) {//fiber task
                    task->uc.uc_link=&rs->tc;
                    rs->tc.uc_link=(ucontext_t *)task;
ShowLog(5,"%s:tid=%lx,resume to TCB_no=%d",__FUNCTION__,pthread_self(),task->sv.TCB_no);
                        pthread_mutex_lock(&task->lock);//防止其他线程提前闯入
                        setcontext(&task->uc);        //== longjmp()
                        continue;//no action,logic only
                }
                if(task->uc.uc_stack.ss_size>0) {//call_back模式,抢入了,进入同步模式
            rs->tc.uc_link=NULL;
ShowLog(5,"%s:tid %lx 抢入 SYNC",__FUNCTION__,pthread_self());
                        do_work(task->sv.TCB_no);
                        continue;
                }
                if(!rs->tc.uc_stack.ss_sp) {
ShowLog(5,"%s:%lx create fiber for TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);
                        task->uc.uc_stack.ss_sp=mmap(0, use_stack_size,
                                PROT_READ | PROT_WRITE | PROT_EXEC,
                                MAP_PRIVATE | MAP_ANON | MAP_GROWSDOWN, -1, 0);
                        if(task->uc.uc_stack.ss_sp==MAP_FAILED) {
                                task->uc.uc_stack.ss_sp=NULL;
                                do_work(task->sv.TCB_no); //进行你的服务,不使用AIO
                                continue;
                        }
                } else {
//ShowLog(5,"%s:%lx reuse fiber for TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);
                        task->uc.uc_stack.ss_sp=rs->tc.uc_stack.ss_sp;
                        rs->tc.uc_stack.ss_sp=NULL;
                        rs->tc.uc_stack.ss_size=0;
                }
                task->uc.uc_stack.ss_size=use_stack_size;
                task->uc.uc_link=&rs->tc;
                rs->tc.uc_link=(ucontext_t *)task;
                makecontext(&task->uc,(void (*)())do_work,1,task->sv.TCB_no);

                ret=swapcontext(&rs->tc,&task->uc);
                if(ret<0) {
                        ShowLog(1,"%s:swapcontext fault TCB_NO=%d,tid=%lx,errno=%d,%s",
                                __FUNCTION__,task->sv.TCB_no,pthread_self(),ret,strerror(abs(ret)));
                        rs->tc.uc_link=NULL;
                        task->uc.uc_link=NULL;
                        if(task->uc.uc_stack.ss_sp)
                                munmap(task->uc.uc_stack.ss_sp,task->uc.uc_stack.ss_size);
                        task->uc.uc_stack.ss_sp=NULL;
                        task->uc.uc_stack.ss_size=0;
                        do_work(task->sv.TCB_no);
                        mthr_showid_del(rs->tid);
                        continue;
                }
                if(!task) {
                        ShowLog(1,"%s:aft swapcontext task is NULL",__FUNCTION__);
                        continue;
                }
                if(!task->AIO_flg) {//service complate
                        if(!rs->tc.uc_stack.ss_size) {//回收fiber stack
//ShowLog(5,"%s:%lx release fiber from TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);
                                rs->tc.uc_stack.ss_sp=task->uc.uc_stack.ss_sp;
                                if(rs->tc.uc_stack.ss_sp)
                                         rs->tc.uc_stack.ss_size=use_stack_size;
                                else rs->tc.uc_stack.ss_size=0;
                        } else {
ShowLog(5,"%s:%lx destroy fiber from TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);
                                if(task->uc.uc_stack.ss_sp)
                                        munmap(task->uc.uc_stack.ss_sp,task->uc.uc_stack.ss_size);
                        }
                        task->uc.uc_stack.ss_sp=NULL;
                        rs->tc.uc_link=NULL;
                        task->uc.uc_link=NULL;
                        task->uc.uc_stack.ss_size=0;//mark fiber cpmplate
//ShowLog(5,"%s:TCB_no=%d,tid=%lx,timeout=%d,conn.timeout=%d",__FUNCTION__,task->sv.TCB_no,rs->tid,task->timeout,task->conn.timeout);
                } else {
                        pthread_mutex_unlock(&task->lock);

ShowLog(5,"%s:tid=%lx,fiber yield from TCB_no=%d",
                        __FUNCTION__,pthread_self(),task->sv.TCB_no);
                }
                mthr_showid_del(rs->tid);
        }
        ShowLog(1,"%s:tid=%lx canceled",__FUNCTION__,pthread_self());
        mthr_showid_del(rs->tid);
        rs->timestamp=now_usec();
        rs->status=0;
        rs->tid=0;
        if(rs->tc.uc_stack.ss_sp) {
                munmap(rs->tc.uc_stack.ss_sp,rs->tc.uc_stack.ss_size);
                rs->tc.uc_stack.ss_sp=NULL;
                rs->tc.uc_stack.ss_size=0;
        }
        return NULL;
}

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
23 [报告]
发表于 2017-01-23 20:29 |只看该作者
本帖最后由 yulihua49 于 2017-01-23 20:31 编辑

不能说话,帖子会没。上述程序,你只要把一切IO写到do_work()里就可以,协程的事不用关心。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
24 [报告]
发表于 2017-01-23 20:32 |只看该作者
static void *thread_work(void *param)
{
resource *rs=(resource *)param;
int ret,fds;
TCB *task=NULL;
struct epoll_event event;

        ShowLog(2,"%s:thread %lx start!",__FUNCTION__,pthread_self());
        getcontext(&rs->tc);
        if(task)  pthread_mutex_unlock(&task->lock);

        while(1) {
//从就绪队列取一个任务
                pthread_mutex_lock(&rpool.mut);
                while(!(task=rdy_get())) {
                        if(rpool.flg >= tpool.rdy_num) break;
                        rpool.flg++;
                        ret=pthread_cond_wait(&rpool.cond,&rpool.mut); //没有任务,等待
                        rpool.flg--;
                }
                pthread_mutex_unlock(&rpool.mut);
                if(task) {
                        if(!task->AIO_flg && !task->call_back) {
                                task->fd=task->conn.Socket;
                                ShowLog(5,"%s:tid=%lx,TCB_no=%d from rdy_queue",__FUNCTION__,
                                        pthread_self(),task->sv.TCB_no);
                                if(task->fd>=0) {
                                        do_epoll(task,0,0);
                                }
                                continue;
                        }
                } else  {
                        fds = epoll_wait(g_epoll_fd, &event, 1 , -1);
                        if(fds < 0){
                                        ShowLog(1,"%s:epoll_wait err=%d,%s",__FUNCTION__,errno,strerror(errno));
                                usleep(30000000);
                                continue;
                                }
                         task = (TCB *)event.data.ptr;
                        if(task->events) {
                            ShowLog(1,"%s:tid=%lx,TCB_no=%d,task->events=%08X,conflict!",__FUNCTION__,
                                    pthread_self(),task->sv.TCB_no,task->events);//发现惊群
                            task=NULL;
                            continue;//丢掉它
                        }
                        task->events=event.events;
                }
                rs->timestamp=now_usec();
                if(task->status>0) set_showid(task->ctx);//Showid 应该在会话上下文结构里
               
                if(task->AIO_flg) {//fiber task
                    task->uc.uc_link=&rs->tc;
                    rs->tc.uc_link=(ucontext_t *)task;
ShowLog(5,"%s:tid=%lx,resume to TCB_no=%d",__FUNCTION__,pthread_self(),task->sv.TCB_no);
                        pthread_mutex_lock(&task->lock);//防止其他线程提前闯入
                        setcontext(&task->uc);        //== longjmp()
                        continue;//no action,logic only
                }
                if(task->uc.uc_stack.ss_size>0) {//call_back模式,抢入了,进入同步模式
            rs->tc.uc_link=NULL;
ShowLog(5,"%s:tid %lx 抢入 SYNC",__FUNCTION__,pthread_self());
                        do_work(task->sv.TCB_no);
                        continue;
                }
                if(!rs->tc.uc_stack.ss_sp) {
ShowLog(5,"%s:%lx create fiber for TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);
                        task->uc.uc_stack.ss_sp=mmap(0, use_stack_size,
                                PROT_READ | PROT_WRITE | PROT_EXEC,
                                MAP_PRIVATE | MAP_ANON | MAP_GROWSDOWN, -1, 0);
                        if(task->uc.uc_stack.ss_sp==MAP_FAILED) {
                                task->uc.uc_stack.ss_sp=NULL;
                                do_work(task->sv.TCB_no); //进行你的服务,不使用AIO
                                continue;
                        }
                } else {
//ShowLog(5,"%s:%lx reuse fiber for TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);
                        task->uc.uc_stack.ss_sp=rs->tc.uc_stack.ss_sp;
                        rs->tc.uc_stack.ss_sp=NULL;
                        rs->tc.uc_stack.ss_size=0;
                }
                task->uc.uc_stack.ss_size=use_stack_size;
                task->uc.uc_link=&rs->tc;
                rs->tc.uc_link=(ucontext_t *)task;
                makecontext(&task->uc,(void (*)())do_work,1,task->sv.TCB_no);

                ret=swapcontext(&rs->tc,&task->uc);
                if(ret<0) {
                        ShowLog(1,"%s:swapcontext fault TCB_NO=%d,tid=%lx,errno=%d,%s",
                                __FUNCTION__,task->sv.TCB_no,pthread_self(),ret,strerror(abs(ret)));
                        rs->tc.uc_link=NULL;
                        task->uc.uc_link=NULL;
                        if(task->uc.uc_stack.ss_sp)
                                munmap(task->uc.uc_stack.ss_sp,task->uc.uc_stack.ss_size);
                        task->uc.uc_stack.ss_sp=NULL;
                        task->uc.uc_stack.ss_size=0;
                        do_work(task->sv.TCB_no);
                        mthr_showid_del(rs->tid);
                        continue;
                }
                if(!task) {
                        ShowLog(1,"%s:aft swapcontext task is NULL",__FUNCTION__);
                        continue;
                }
                if(!task->AIO_flg) {//service complate
                        if(!rs->tc.uc_stack.ss_size) {//回收fiber stack
//ShowLog(5,"%s:%lx release fiber from TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);
                                rs->tc.uc_stack.ss_sp=task->uc.uc_stack.ss_sp;
                                if(rs->tc.uc_stack.ss_sp)
                                         rs->tc.uc_stack.ss_size=use_stack_size;
                                else rs->tc.uc_stack.ss_size=0;
                        } else {
ShowLog(5,"%s:%lx destroy fiber from TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);
                                if(task->uc.uc_stack.ss_sp)
                                        munmap(task->uc.uc_stack.ss_sp,task->uc.uc_stack.ss_size);
                        }
                        task->uc.uc_stack.ss_sp=NULL;
                        rs->tc.uc_link=NULL;
                        task->uc.uc_link=NULL;
                        task->uc.uc_stack.ss_size=0;//mark fiber cpmplate
//ShowLog(5,"%s:TCB_no=%d,tid=%lx,timeout=%d,conn.timeout=%d",__FUNCTION__,task->sv.TCB_no,rs->tid,task->timeout,task->conn.timeout);
                } else {
                        pthread_mutex_unlock(&task->lock);

ShowLog(5,"%s:tid=%lx,fiber yield from TCB_no=%d",
                        __FUNCTION__,pthread_self(),task->sv.TCB_no);
                }
                mthr_showid_del(rs->tid);
        }
        ShowLog(1,"%s:tid=%lx canceled",__FUNCTION__,pthread_self());
        mthr_showid_del(rs->tid);
        rs->timestamp=now_usec();
        rs->status=0;
        rs->tid=0;
        if(rs->tc.uc_stack.ss_sp) {
                munmap(rs->tc.uc_stack.ss_sp,rs->tc.uc_stack.ss_size);
                rs->tc.uc_stack.ss_sp=NULL;
                rs->tc.uc_stack.ss_size=0;
        }
        return NULL;
}

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
25 [报告]
发表于 2017-01-23 20:33 |只看该作者
本帖最后由 yulihua49 于 2017-01-23 20:34 编辑
yulihua49 发表于 2017-01-23 20:32
static void *thread_work(void *param)
{
resource *rs=(resource *)param;

帖子会没。。。。。。。。
static void *thread_work(void *param)
{
resource *rs=(resource *)param;
int ret,fds;
TCB *task=NULL;
struct epoll_event event;

        ShowLog(2,"%s:thread %lx start!",__FUNCTION__,pthread_self());
        getcontext(&rs->tc);
        if(task)  pthread_mutex_unlock(&task->lock);

        while(1) {
//从就绪队列取一个任务
                pthread_mutex_lock(&rpool.mut);
                while(!(task=rdy_get())) {
                        if(rpool.flg >= tpool.rdy_num) break;
                        rpool.flg++;
                        ret=pthread_cond_wait(&rpool.cond,&rpool.mut); //没有任务,等待
                        rpool.flg--;
                }
                pthread_mutex_unlock(&rpool.mut);
                if(task) {
                        if(!task->AIO_flg && !task->call_back) {
                                task->fd=task->conn.Socket;
                                ShowLog(5,"%s:tid=%lx,TCB_no=%d from rdy_queue",__FUNCTION__,
                                        pthread_self(),task->sv.TCB_no);
                                if(task->fd>=0) {
                                        do_epoll(task,0,0);
                                }
                                continue;
                        }
                } else  {
                        fds = epoll_wait(g_epoll_fd, &event, 1 , -1);
                        if(fds < 0){
                                        ShowLog(1,"%s:epoll_wait err=%d,%s",__FUNCTION__,errno,strerror(errno));
                                usleep(30000000);
                                continue;
                                }
                         task = (TCB *)event.data.ptr;
                        if(task->events) {
                            ShowLog(1,"%s:tid=%lx,TCB_no=%d,task->events=%08X,conflict!",__FUNCTION__,
                                    pthread_self(),task->sv.TCB_no,task->events);//发现惊群
                            task=NULL;
                            continue;//丢掉它
                        }
                        task->events=event.events;
                }
                rs->timestamp=now_usec();
                if(task->status>0) set_showid(task->ctx);//Showid 应该在会话上下文结构里
               
                if(task->AIO_flg) {//fiber task
                    task->uc.uc_link=&rs->tc;
                    rs->tc.uc_link=(ucontext_t *)task;
ShowLog(5,"%s:tid=%lx,resume to TCB_no=%d",__FUNCTION__,pthread_self(),task->sv.TCB_no);
                        pthread_mutex_lock(&task->lock);//防止其他线程提前闯入
                        setcontext(&task->uc);        //== longjmp()
                        continue;//no action,logic only
                }
                if(task->uc.uc_stack.ss_size>0) {//call_back模式,抢入了,进入同步模式
            rs->tc.uc_link=NULL;
ShowLog(5,"%s:tid %lx 抢入 SYNC",__FUNCTION__,pthread_self());
                        do_work(task->sv.TCB_no);
                        continue;
                }
                if(!rs->tc.uc_stack.ss_sp) {
ShowLog(5,"%s:%lx create fiber for TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);
                        task->uc.uc_stack.ss_sp=mmap(0, use_stack_size,
                                PROT_READ | PROT_WRITE | PROT_EXEC,
                                MAP_PRIVATE | MAP_ANON | MAP_GROWSDOWN, -1, 0);
                        if(task->uc.uc_stack.ss_sp==MAP_FAILED) {
                                task->uc.uc_stack.ss_sp=NULL;
                                do_work(task->sv.TCB_no); //进行你的服务,不使用AIO
                                continue;
                        }
                } else {
//ShowLog(5,"%s:%lx reuse fiber for TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);
                        task->uc.uc_stack.ss_sp=rs->tc.uc_stack.ss_sp;
                        rs->tc.uc_stack.ss_sp=NULL;
                        rs->tc.uc_stack.ss_size=0;
                }
                task->uc.uc_stack.ss_size=use_stack_size;
                task->uc.uc_link=&rs->tc;
                rs->tc.uc_link=(ucontext_t *)task;
                makecontext(&task->uc,(void (*)())do_work,1,task->sv.TCB_no);

                ret=swapcontext(&rs->tc,&task->uc);
                if(ret<0) {
                        ShowLog(1,"%s:swapcontext fault TCB_NO=%d,tid=%lx,errno=%d,%s",
                                __FUNCTION__,task->sv.TCB_no,pthread_self(),ret,strerror(abs(ret)));
                        rs->tc.uc_link=NULL;
                        task->uc.uc_link=NULL;
                        if(task->uc.uc_stack.ss_sp)
                                munmap(task->uc.uc_stack.ss_sp,task->uc.uc_stack.ss_size);
                        task->uc.uc_stack.ss_sp=NULL;
                        task->uc.uc_stack.ss_size=0;
                        do_work(task->sv.TCB_no);
                        mthr_showid_del(rs->tid);
                        continue;
                }
                if(!task) {
                        ShowLog(1,"%s:aft swapcontext task is NULL",__FUNCTION__);
                        continue;
                }
                if(!task->AIO_flg) {//service complate
                        if(!rs->tc.uc_stack.ss_size) {//回收fiber stack
//ShowLog(5,"%s:%lx release fiber from TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);
                                rs->tc.uc_stack.ss_sp=task->uc.uc_stack.ss_sp;
                                if(rs->tc.uc_stack.ss_sp)
                                         rs->tc.uc_stack.ss_size=use_stack_size;
                                else rs->tc.uc_stack.ss_size=0;
                        } else {
ShowLog(5,"%s:%lx destroy fiber from TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);
                                if(task->uc.uc_stack.ss_sp)
                                        munmap(task->uc.uc_stack.ss_sp,task->uc.uc_stack.ss_size);
                        }
                        task->uc.uc_stack.ss_sp=NULL;
                        rs->tc.uc_link=NULL;
                        task->uc.uc_link=NULL;
                        task->uc.uc_stack.ss_size=0;//mark fiber cpmplate
//ShowLog(5,"%s:TCB_no=%d,tid=%lx,timeout=%d,conn.timeout=%d",__FUNCTION__,task->sv.TCB_no,rs->tid,task->timeout,task->conn.timeout);
                } else {
                        pthread_mutex_unlock(&task->lock);

ShowLog(5,"%s:tid=%lx,fiber yield from TCB_no=%d",
                        __FUNCTION__,pthread_self(),task->sv.TCB_no);
                }
                mthr_showid_del(rs->tid);
        }
        ShowLog(1,"%s:tid=%lx canceled",__FUNCTION__,pthread_self());
        mthr_showid_del(rs->tid);
        rs->timestamp=now_usec();
        rs->status=0;
        rs->tid=0;
        if(rs->tc.uc_stack.ss_sp) {
                munmap(rs->tc.uc_stack.ss_sp,rs->tc.uc_stack.ss_size);
                rs->tc.uc_stack.ss_sp=NULL;
                rs->tc.uc_stack.ss_size=0;
        }
        return NULL;
}



论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
26 [报告]
发表于 2017-01-23 20:38 |只看该作者
yulihua49 发表于 2017-01-23 20:29
不能说话,帖子会没。上述程序,你只要把一切IO写到do_work()里就可以,协程的事不用关心。

不能说话,帖子会没。上述程序,你只要把一切IO写到do_work()里就可以,协cheng

发个代码帖子就丢了static void *thread_work(void *param){resource *rs=(resource *)param;int ret,fds;TCB *task=NULL;struct epoll_event event;
        ShowLog(2,"%s:thread %lx start!",__FUNCTION__,pthread_self());        getcontext(&rs->tc);        if(task)  pthread_mutex_unlock(&task->lock);
        while(1) {//从就绪队列取一个任务                pthread_mutex_lock(&rpool.mut);                while(!(task=rdy_get())) {                        if(rpool.flg >= tpool.rdy_num) break;                        rpool.flg++;                        ret=pthread_cond_wait(&rpool.cond,&rpool.mut); //没有任务,等待                         rpool.flg--;                }                pthread_mutex_unlock(&rpool.mut);                if(task) {                        if(!task->AIO_flg && !task->call_back) {                                task->fd=task->conn.Socket;                                ShowLog(5,"%s:tid=%lx,TCB_no=%d from rdy_queue",__FUNCTION__,                                        pthread_self(),task->sv.TCB_no);                                if(task->fd>=0) {                                        do_epoll(task,0,0);                                }                                continue;                        }                } else  {                        fds = epoll_wait(g_epoll_fd, &event, 1 , -1);                        if(fds < 0){                                        ShowLog(1,"%s:epoll_wait err=%d,%s",__FUNCTION__,errno,strerror(errno));                                usleep(30000000);                                continue;                                }                         task = (TCB *)event.data.ptr;                        if(task->events) {                            ShowLog(1,"%s:tid=%lx,TCB_no=%d,task->events=%08X,conflict!",__FUNCTION__,                                    pthread_self(),task->sv.TCB_no,task->events);//发现惊群                            task=NULL;                            continue;//丢掉它                        }                        task->events=event.events;                }                rs->timestamp=now_usec();                if(task->status>0) set_showid(task->ctx);//Showid 应该在会话上下文结构里                                 if(task->AIO_flg) {//fiber task                    task->uc.uc_link=&rs->tc;                    rs->tc.uc_link=(ucontext_t *)task;ShowLog(5,"%s:tid=%lx,resume to TCB_no=%d",__FUNCTION__,pthread_self(),task->sv.TCB_no);                        pthread_mutex_lock(&task->lock);//防止其他线程提前闯入                        setcontext(&task->uc);        //== longjmp()                        continue;//no action,logic only                }                if(task->uc.uc_stack.ss_size>0) {//call_back模式,抢入了,进入同步模式            rs->tc.uc_link=NULL;ShowLog(5,"%s:tid %lx 抢入 SYNC",__FUNCTION__,pthread_self());                        do_work(task->sv.TCB_no);                        continue;                }                if(!rs->tc.uc_stack.ss_sp) {ShowLog(5,"%s:%lx create fiber for TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);                        task->uc.uc_stack.ss_sp=mmap(0, use_stack_size,                                PROT_READ | PROT_WRITE | PROT_EXEC,                                MAP_PRIVATE | MAP_ANON | MAP_GROWSDOWN, -1, 0);                        if(task->uc.uc_stack.ss_sp==MAP_FAILED) {                                task->uc.uc_stack.ss_sp=NULL;                                do_work(task->sv.TCB_no); //进行你的服务,不使用AIO                                continue;                        }                } else {//ShowLog(5,"%s:%lx reuse fiber for TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);                        task->uc.uc_stack.ss_sp=rs->tc.uc_stack.ss_sp;                        rs->tc.uc_stack.ss_sp=NULL;                        rs->tc.uc_stack.ss_size=0;                }                task->uc.uc_stack.ss_size=use_stack_size;                task->uc.uc_link=&rs->tc;                rs->tc.uc_link=(ucontext_t *)task;                makecontext(&task->uc,(void (*)())do_work,1,task->sv.TCB_no);
                ret=swapcontext(&rs->tc,&task->uc);                if(ret<0) {                        ShowLog(1,"%s:swapcontext fault TCB_NO=%d,tid=%lx,errno=%d,%s",                                __FUNCTION__,task->sv.TCB_no,pthread_self(),ret,strerror(abs(ret)));                        rs->tc.uc_link=NULL;                        task->uc.uc_link=NULL;                        if(task->uc.uc_stack.ss_sp)                                munmap(task->uc.uc_stack.ss_sp,task->uc.uc_stack.ss_size);                        task->uc.uc_stack.ss_sp=NULL;                        task->uc.uc_stack.ss_size=0;                        do_work(task->sv.TCB_no);                        mthr_showid_del(rs->tid);                        continue;                }                if(!task) {                        ShowLog(1,"%s:aft swapcontext task is NULL",__FUNCTION__);                        continue;                }                if(!task->AIO_flg) {//service complate                        if(!rs->tc.uc_stack.ss_size) {//回收fiber stack//ShowLog(5,"%s:%lx release fiber from TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);                                rs->tc.uc_stack.ss_sp=task->uc.uc_stack.ss_sp;                                if(rs->tc.uc_stack.ss_sp)                                         rs->tc.uc_stack.ss_size=use_stack_size;                                else rs->tc.uc_stack.ss_size=0;                        } else {ShowLog(5,"%s:%lx destroy fiber from TCB_no=%d",__FUNCTION__,rs->tid,task->sv.TCB_no);                                if(task->uc.uc_stack.ss_sp)                                         munmap(task->uc.uc_stack.ss_sp,task->uc.uc_stack.ss_size);                        }                        task->uc.uc_stack.ss_sp=NULL;                        rs->tc.uc_link=NULL;                        task->uc.uc_link=NULL;                        task->uc.uc_stack.ss_size=0;//mark fiber cpmplate//ShowLog(5,"%s:TCB_no=%d,tid=%lx,timeout=%d,conn.timeout=%d",__FUNCTION__,task->sv.TCB_no,rs->tid,task->timeout,task->conn.timeout);                } else {                        pthread_mutex_unlock(&task->lock);
ShowLog(5,"%s:tid=%lx,fiber yield from TCB_no=%d",                        __FUNCTION__,pthread_self(),task->sv.TCB_no);                }                mthr_showid_del(rs->tid);        }        ShowLog(1,"%s:tid=%lx canceled",__FUNCTION__,pthread_self());        mthr_showid_del(rs->tid);        rs->timestamp=now_usec();        rs->status=0;        rs->tid=0;        if(rs->tc.uc_stack.ss_sp) {                munmap(rs->tc.uc_stack.ss_sp,rs->tc.uc_stack.ss_size);                rs->tc.uc_stack.ss_sp=NULL;                rs->tc.uc_stack.ss_size=0;        }        return NULL;}

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
27 [报告]
发表于 2017-01-23 20:39 |只看该作者
本帖最后由 yulihua49 于 2017-01-23 20:41 编辑
zylthinking 发表于 2017-01-23 16:18
你这个是怎么一个用法啊

corotine(char* addr) {

论坛什么鬼,发不出代码了。发了代码帖子就会丢。
就140行代码。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
28 [报告]
发表于 2017-01-25 13:08 来自手机 |只看该作者
唧个do work

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
29 [报告]
发表于 2017-01-28 20:59 |只看该作者
本帖最后由 yulihua49 于 2017-01-28 21:06 编辑

代码发不出来,没法讨论了。

开始是头疼医头,脚疼医脚,解决不了问题。后来是头疼医脸,脚疼也医脸,反正有面子就行。再后来,头疼堵嘴,脚疼也堵嘴。只要说不出来,这病就算治好了。
再后来,张三头疼,李四脚疼,都堵大夫的嘴,只要大夫不说,你们都没病。现在,不管谁有病,都堵我们大家的嘴,不管你说什么。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
30 [报告]
发表于 2017-01-29 15:32 |只看该作者
回复 16# yulihua49

tbox是我写的一个跨平台开发库,tboox只是我建的开源组织而已。还有其他一些开源项目。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP