Esempio n. 1
0
void
proxytask(void *v)
{
	int fd, remotefd;
	fd = (int)v;
	if((remotefd = netdial(TCP, server, port)) < 0) {
		close(fd);
		return;
	}
	fprintf(stderr, "connected to %s:%d\n", server, port);
	taskcreate(rwtask, mkfd2(fd, remotefd), STACK);
	taskcreate(rwtask, mkfd2(remotefd, fd), STACK);
}
Esempio n. 2
0
void taskmain(int argc, char **argv)
{
    dbg_set_log(stderr);
    int rc = 0;

    check(argc == 3 || argc == 4, "usage: %s config.sqlite server_uuid [config_module.so]", m2program);

    if(argc == 4) {
        log_info("Using configuration module %s to load configs.", argv[3]);
        rc = Config_module_load(argv[3]);
        check(rc != -1, "Failed to load the config module: %s", argv[3]);
    }

    Server_queue_init();

    Server *srv = load_server(argv[1], argv[2], NULL);
    check(srv != NULL, "Aborting since can't load server.");
    Server_queue_push(srv);

    SuperPoll_get_max_fd();

    rc = clear_pid_file(srv);
    check(rc == 0, "PID file failure, aborting rather than trying to start.");

    rc = attempt_chroot_drop(srv);
    check(rc == 0, "Major failure in chroot/droppriv, aborting."); 

    final_setup();

    taskcreate(tickertask, NULL, TICKER_TASK_STACK);

    struct ServerTask *srv_data = calloc(1, sizeof(struct ServerTask));
    srv_data->db_file = bfromcstr(argv[1]);
    srv_data->server_id = bfromcstr(argv[2]);

    taskcreate(reload_task, srv_data, RELOAD_TASK_STACK);

    rc = Server_run();
    check(rc != -1, "Server had a failure and exited early.");
    log_info("Server run exited, goodbye.");

    srv = Server_queue_latest();
    complete_shutdown(srv);

    return;

error:
    log_err("Exiting due to error.");
    taskexitall(1);
}
Esempio n. 3
0
int
main(int argc, char **argv)
{
	struct sigaction sa, osa;

	memset(&sa, 0, sizeof sa);
	sa.sa_handler = taskinfo;
	sa.sa_flags = SA_RESTART;
	sigaction(SIGQUIT, &sa, &osa);

#ifdef SIGINFO
	sigaction(SIGINFO, &sa, &osa);
#endif

	argv0 = argv[0];
	taskargc = argc;
	taskargv = argv;

	if(mainstacksize == 0)
		mainstacksize = 256*1024;
	taskcreate(taskmainstart, nil, mainstacksize);//创建初始协程,调用应用层的taskmain函数,此时taskmainstart协程还没有运行,等待调度
	taskscheduler();//进行协程调度
	fprint(2, "taskscheduler returned in main!\n");
	abort();
	return 0;
}
Esempio n. 4
0
void
fdwait(int fd, int rw)
{
	if(!startedfdtask){
		startedfdtask = 1;
        epfd = epoll_create(1);
        assert(epfd >= 0);
		taskcreate(fdtask, 0, 32768 * 10);
	}

	taskstate("fdwait for %s", rw=='r' ? "read" : rw=='w' ? "write" : "error");
    struct epoll_event ev = {0};
    ev.data.ptr = taskrunning;
	switch(rw){
	case 'r':
		ev.events |= EPOLLIN | EPOLLPRI;
		break;
	case 'w':
		ev.events |= EPOLLOUT;
		break;
	}

    int r = epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev);
    int duped = 0;
    if (r < 0 || errno == EEXIST) {
        duped = 1;
        fd = dup(fd);
        int r = epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev);
        assert(r == 0);
    }
	taskswitch();
    epoll_ctl(epfd, EPOLL_CTL_DEL, fd, &ev);
    if (duped)
        close(fd);
}
Esempio n. 5
0
void Thread::start()
{
    ASSERT(m_state == JOINED);
    m_state = STARTING;
    Log::debug("clc.thread", "Thread \"%s\" is starting", m_name.c_str());

    bool ok;
#ifdef USE_LIBTASK
    taskcreate(bootstrap, this, 32768);
    ok = true;
#elif defined(__BEOS__) || defined(__HAIKU__)
    m_stateChange.lock();
    m_thread = spawn_thread(bootstrap, m_name.c_str(), B_NORMAL_PRIORITY, this);
    ok = (m_thread != B_NO_MORE_THREADS && m_thread != B_NO_MEMORY);
    if (ok)
        resume_thread(m_thread);
    m_stateChange.unlock();
#else
    m_stateChange.lock();
    ok = (pthread_create(&m_thread, NULL, bootstrap, this) == 0);
    m_stateChange.unlock();
#endif
    if (! ok) {
        Log::debug("clc.thread", "Thread \"%s\" failed to start; is joined", m_name.c_str());
        m_state = JOINED;
        m_thread = 0;
        throw std::bad_alloc();
    }
}
Esempio n. 6
0
void server_task(void* arg) {
    struct cornet_config_t* config;
    struct client_config_t  cconfig;
    int cfd, fd;
    char remote[16];
    int rport;

    config = (struct cornet_config_t*)arg;
    if (!config->name) {
        config->name = "server_task";
    }
    taskname(config->name);
    if ((fd = netannounce(config->istcp, config->server, config->port)) < 0) {
        fprintf(stderr, "cannot announce on tcp port %d: %s\n", config->port, strerror(errno));
        taskexitall(1);
    }

    cconfig.h = config->h;

    while((cfd = netaccept(fd, remote, &rport)) >= 0){
        fprintf(stderr, "connection from %s:%d\n", remote, rport);
        cconfig.fd = cfd;
        taskcreate(client_task, &cconfig, config->stack_size);
    }

    close(fd);
    printf("Exiting server task: %d\n", taskid());
}
Esempio n. 7
0
int
main(int argc, char **argv)
{
    struct sigaction sa, osa;

    memset(&sa, 0, sizeof sa);
    sa.sa_handler = taskinfo;
    sa.sa_flags = SA_RESTART;
    sigaction(SIGQUIT, &sa, &osa);

#ifdef SIGINFO
    sigaction(SIGINFO, &sa, &osa);
#endif

    taskargc = argc;
    taskargv = argv;

    if (mainstacksize == 0)
        mainstacksize = 256 * 1024;
    taskcreate(taskmainstart, nil, mainstacksize);
    taskscheduler();
    fprintf(stderr, "taskscheduler returned in main!\n");
    abort();
    return 0;
}
Esempio n. 8
0
int
main(int argc, char **argv)
{
	struct sigaction sa, osa;

	memset(&sa, 0, sizeof sa);

    // 设置 quit 信号时,对应处理函数为 taskinfo
    // 这个函数会在收到退出信号时, 打印当前的所有协程信息
	sa.sa_handler = taskinfo;
	sa.sa_flags = SA_RESTART;
	sigaction(SIGQUIT, &sa, &osa);

#ifdef SIGINFO
	sigaction(SIGINFO, &sa, &osa);
#endif

	argv0 = argv[0];
	taskargc = argc;
	taskargv = argv;

    // 设置默认的最小栈大小
	if(mainstacksize == 0)
		mainstacksize = 256*1024;

    // 创建一个主协程
	taskcreate(taskmainstart, nil, mainstacksize);
    // 开始协程调度
	taskscheduler();

	fprint(2, "taskscheduler returned in main!\n");
	abort();
	return 0;
}
Esempio n. 9
0
int Connection_accept(Connection *conn)
{
    check(Register_connect(IOBuf_fd(conn->iob), (void*)conn) != -1,
            "Failed to register connection.");

    check(taskcreate(Connection_task, conn, CONNECTION_STACK) != -1,
            "Failed to create connection task.");
    
    check(taskcreate(Connection_deliver_task, conn, CONNECTION_STACK) != -1,
            "Failed to create connection task.");
    conn->deliverTaskStatus=DT_RUNNING;
    return 0;
error:
    IOBuf_register_disconnect(conn->iob);
    return -1;
}
Esempio n. 10
0
int Server_start_handlers(Server *srv, Server *copy_from)
{
    int i = 0;
    int rc = 0;

    if(copy_from != NULL) {
        rc = Server_copy_active_handlers(srv, copy_from);
        check(rc != -1, "Failed to copy old handlers to new server config.");
    }

    for(i = 0; i < darray_end(srv->handlers); i++) {
        Handler *handler = darray_get(srv->handlers, i);
        check(handler != NULL, "Invalid handler, can't be NULL.");

        if(!handler->running) {
            log_info("LOADING Handler %s", bdata(handler->send_spec));
            rc = taskcreate(Handler_task, handler, HANDLER_STACK);
            check(rc != -1, "Failed to start handler task.");
            handler->running = 1;
        }
    }

    return 0;
error:
    return -1;
}
Esempio n. 11
0
static inline void startfdtask()
{
    if(!STARTED_FDTASK) {
        FDSTACK = Setting_get_int("limits.fdtask_stack", 100 * 1024);
        log_info("MAX limits.fdtask_stack=%d", FDSTACK);

        POLL = SuperPoll_create();
        STARTED_FDTASK = 1;
        taskcreate(fdtask, 0, FDSTACK);
    }
}
Esempio n. 12
0
void
fdwait(int fd, int rw)
{
	int bits;

#ifdef maysam_dbg
	fprintf(stderr,"fdwait on fd=%d 1 startedfdtask=%d\n",fd, startedfdtask);
#endif
	if(!startedfdtask){
		startedfdtask = 1;
		taskcreate(fdtask, 0, 32768);
	}
#ifdef maysam_dbg
	fprintf(stderr,"fdwait on fd=%d 2\n",fd);
#endif

	if(npollfd >= MAXFD){
		fprint(2, "too many poll file descriptors\n");
		abort();
	}
	
#ifdef maysam_dbg
	fprintf(stderr,"fdwait on fd=%d 3\n",fd);
#endif
	taskstate("fdwait for %s", rw=='r' ? "read" : rw=='w' ? "write" : "error");
	bits = 0;
	switch(rw){
	case 'r':
		bits |= POLLIN;
		break;
	case 'w':
		bits |= POLLOUT;
		break;
	}

#ifdef maysam_dbg
	fprintf(stderr,"fdwait on fd=%d 4\n",fd);
#endif
	polltask[npollfd] = taskrunning;
	pollfd[npollfd].fd = fd;
	pollfd[npollfd].events = bits;
	pollfd[npollfd].revents = 0;
	npollfd++;
#ifdef maysam_dbg
	fprintf(stderr,"fdwait on fd=%d before taskswitch\n");
#endif
	taskswitch();
}
Esempio n. 13
0
uint
taskdelay(uint ms)
{
	uvlong when, now;
	Task *t;
	
	if(!startedfdtask){
		startedfdtask = 1;
        epfd = epoll_create(1);
        assert(epfd >= 0);		
		taskcreate(fdtask, 0, 32768 * 10);
	}

	now = nsec();
	when = now+(uvlong)ms*1000000;
	for(t=sleeping.head; t!=nil && t->alarmtime < when; t=t->next)
		;

	if(t){
		taskrunning->prev = t->prev;
		taskrunning->next = t;
	}else{
		taskrunning->prev = sleeping.tail;
		taskrunning->next = nil;
	}
	
	t = taskrunning;
	t->alarmtime = when;
	if(t->prev)
		t->prev->next = t;
	else
		sleeping.head = t;
	if(t->next)
		t->next->prev = t;
	else
		sleeping.tail = t;

	if(!t->system && sleepingcounted++ == 0)
		taskcount++;
	taskswitch();

	return (nsec() - now)/1000000;
}
Esempio n. 14
0
void taskmain(int argc, char **argv)
{
    int i, n;

    if (argc != 4) {
        fprintf(stderr, "usage: httpload n server url\n");
        taskexitall(1);
    }
    n = atoi(argv[1]);
    server = argv[2];
    url = argv[3];

    for (i = 0; i < n; i++) {
        taskcreate(fetchtask, 0, STACK); // 创建协程, 设置为可以运行的状态
        // 其实fetchtask不是上下文切换的第一个函数, taskstart才是, 后者立即调用fetchtask
        while (taskyield() > 1)  // 主动释放CPU, 这里循环其实是为了给其他协程足够的机会
            ;
        sleep(1);
    }
}
Esempio n. 15
0
void
taskmain(int argc, char **argv)
{
	int i, n;

	if(argc != 4){
		fprintf(stderr, "usage: httpload n server url\n");
		taskexitall(1);
	}
	n = atoi(argv[1]);
	server = argv[2];
	url = argv[3];

	for(i=0; i<n; i++){
		taskcreate(fetchtask, 0, STACK);
		while(taskyield() > 1)
			;
		sleep(1);
	}
}
Esempio n. 16
0
static void
taskmain(ltctx *lt, void *unused)
{
    int i, n;

    if(argc != 4) {
        fprintf(stderr, "usage: httpload n server url\n");
        fprintf(stderr, "   ex: httpload 4 127.0.0.1 /\n");
        taskexit(lt, 1);
    }
    n = atoi(argv[1]);
    server = argv[2];
    url = argv[3];

    for(i=0; i<n; i++) {
        taskcreate(lt, fetchtask, 0, STACK);
        while(taskyield(lt) > 1)
            ;
        //taskdelay(lt, 1/*ms*/);
    }
}
Esempio n. 17
0
void
taskmain(int argc, char **argv)
{
    int i, n;

    c = chancreate(sizeof(unsigned long), 0);

    n = 0;
    for (i = 1; i < argc; i++) {
        n++;
        printf("x");
        taskcreate(delaytask, (void *) atoi(argv[i]), STACK);
    }

    /* wait for n tasks to finish */
    for (i = 0; i < n; i++) {
        printf("y");
        chanrecvul(c);
    }
    taskexitall(0);
}
Esempio n. 18
0
void
taskmain(int argc, char **argv)
{
	int cfd, fd;
	int rport;
	char remote[16];
	
	if(argc != 2){
		fprintf(stderr, "usage: tcplongconnection localport \n");
		taskexitall(1);
	}

	if((fd = netannounce(TCP, 0, atoi(argv[1]))) < 0){
		fprintf(stderr, "cannot announce on tcp port %d: %s\n", atoi(argv[1]), strerror(errno));
		taskexitall(1);
	}
	fdnoblock(fd);
	while((cfd = netaccept(&fd, remote, &rport)) >= 0){
		fprintf(stderr, "connection from %s:%d\n", remote, rport);
		taskcreate(proxytask, (void*)cfd, STACK);
	}
}
Esempio n. 19
0
void
taskmain(int argc, char **argv)
{
	int i, n;
	
	if(argc != 4){
		fprintf(stderr, "usage: httpload n server url\n");
		taskexitall(1);
	}
	n = atoi(argv[1]);
	server = argv[2];
	url = argv[3];

	for(i=0; i<n; i++){
		taskcreate(fetchtask, 0, STACK);
		//while(taskyield() > 1)
		//	;
		//taskdelay(500);
	}
	for(;;){
		taskdelay(1000);
		fprintf(stderr,"sucess:%d, fail:%d,rate:%f%%\n",sucess,fail,((float)sucess)/(sucess+fail)*100);
	}
}
Esempio n. 20
0
int cornet_add_server(struct cornet_config_t* config) {
    return taskcreate(server_task, config, config->stack_size);
}
Esempio n. 21
0
void Connection_accept(Connection *conn)
{
    taskcreate(Connection_task, conn, CONNECTION_STACK);
}
Esempio n. 22
0
void Action_start(Action *action)
{
    taskcreate(Action_task, action, 32 * 1024);
}