Esempio n. 1
0
thread_status_t Thread::bootstrap(void* _self)
{
    Thread* self = (Thread*)_self;
    Log::debug("clc.thread", "Thread \"%s\" bootstrap", self->m_name.c_str());

    self->m_stateChange.lock();
#ifdef USE_LIBTASK
    taskname((char*)"%s", self->m_name.c_str());
    if (self->m_flags & DAEMON)
        tasksystem();
#elif defined(__BEOS__) || defined(__HAIKU__)
    // nothing
#else
    if (self->m_flags & DAEMON)
        pthread_detach(self->m_thread);
#endif
    Log::debug("clc.thread", "Thread \"%s\" is running", self->m_name.c_str());
    self->m_state = RUNNING;
    self->m_stateChange.notify();
    self->m_stateChange.unlock();
    try {
        self->run();
    } catch (...) {
        Log::warn("clc.thread", "Thread \"%s\" threw exception", self->m_name.c_str());
    }
    Log::debug("clc.thread", "Thread \"%s\" is stopped", self->m_name.c_str());
    self->m_stateChange.lock();
    self->m_state = STOPPED;
    self->m_stateChange.notify();
    self->m_stateChange.unlock();
#ifndef USE_LIBTASK
    return 0;
#endif
}
Esempio n. 2
0
void fdtask(void *v)
{
    int i, ms;
    PollResult result;
    int rc = 0;
    FDTASK = taskself();
    
    rc = PollResult_init(POLL, &result);
    check(rc == 0, "Failed to initialize the poll result.");

    tasksystem();
    taskname("fdtask");

    for(;;){
        /* let everyone else run */
        while(taskyield() > 0)
            ;
        /* we're the only one runnable - poll for i/o */

        errno = 0;
        taskstate("poll");

        ms = next_task_sleeptime(500);

        if(task_was_signaled()) {
            fdtask_shutdown();
            task_clear_signal();
            break;
        } else {
            rc = SuperPoll_poll(POLL, &result, ms);
            check(rc != -1, "SuperPoll failure, aborting.");

            for(i = 0; i < rc; i++) {
                taskready(result.hits[i].data); 
            }

            wake_sleepers();
        }

    }

    PollResult_clean(&result);
    FDTASK = NULL;
    return;

error:
    taskexitall(1);
}
Esempio n. 3
0
void
fdtask(void *v)
{
    int i, ms;
    PollResult result;
    int rc = 0;
    
    rc = PollResult_init(POLL, &result);
    check(rc == 0, "Failed to initialize the poll result.");

    tasksystem();
    taskname("fdtask");

    for(;;){
        /* let everyone else run */
        while(taskyield() > 0)
            ;
        /* we're the only one runnable - poll for i/o */
        errno = 0;
        taskstate("poll");

        ms = next_task_sleeptime(500);

        if(SIGNALED) {
            for(i = 0; i < SuperPoll_active_hot(POLL); i++) {
                Task *target = (Task *)SuperPoll_data(POLL, i);
                if(target) taskready(target);
                SuperPoll_compact_down(POLL, i);
            }
        } else {
            rc = SuperPoll_poll(POLL, &result, ms);
            check(rc != -1, "SuperPoll failure, aborting.");

            for(i = 0; i < rc; i++) {
                taskready(result.hits[i].data); 
            }
        }

        wake_sleepers();
    }

    PollResult_clean(&result);
    taskexit(0);

error:
    taskexitall(1);
}
Esempio n. 4
0
void
fdtask(void *v)
{
	int i, ms;
	Task *t;
	uvlong now;
	
	tasksystem();
	taskname("fdtask");
	for(;;){
		//fprintf(stderr,"pooling0\n");
		/* let everyone else run */
	   taskyield();
		//fprintf(stderr,"\n after yield %d\n", maysamYieldRet);
		//while(taskyield() > 0);
		/* we're the only one runnable - poll for i/o */
		errno = 0;
		taskstate("poll");
		//Added by Maysam Yabandeh
		//taskname("fdtask(%d)",npollfd);
		if((t=sleeping.head) == nil)
			ms = -1;
		else{
			/* sleep at most 5s */
			now = nsec();
			if(now >= t->alarmtime)
				ms = 0;
			else if(now+5*1000*1000*1000LL >= t->alarmtime)
				ms = (t->alarmtime - now)/1000000;
			else
				ms = 5000;
		}
		//Added by Maysam Yabandeh
		//if (ms == -1 && maysamYieldRet == 0) ms = 0;
		if (ms == -1) ms = 0;
		//fprintf(stderr,"pooling ms is %d npollfd is %d\n", ms, npollfd);
#ifndef USE_SHM
		if(poll(pollfd, npollfd, ms) < 0){
		//fprintf(stderr,"pooling error\n");
			if(errno == EINTR)
				continue;
			fprint(2, "poll: %s\n", strerror(errno));
			taskexitall(0);
		}

		//fprintf(stderr,"pooling2\n");
		/* wake up the guys who deserve it */
		for(i=0; i<npollfd; i++){
			while(i < npollfd && pollfd[i].revents){
		//fprintf(stderr,"pooling3\n");
				taskready(polltask[i]);
				--npollfd;
				pollfd[i] = pollfd[npollfd];
				polltask[i] = polltask[npollfd];
			}
		}
#else
		/* wake up the guys who deserve it */
		//extern mpass::MessageEndPoint msg_end_point;
		mpass::MessageEndPoint *end_point = &mpass::msg_end_point;
		for(i=0; i<npollfd; i++){
		   int &fd = pollfd[i].fd;
			bool read = pollfd[i].events & POLLIN;
			mpass::Connection *conn = &end_point->conn_array[fd];
			if ( (read && !conn->rcv_q->is_empty()) || (!read && !conn->snd_q->is_full()) )
			{
				taskready(polltask[i]);
				--npollfd;
				pollfd[i] = pollfd[npollfd];
				polltask[i] = polltask[npollfd];
			}
		}
#endif
		
		//fprintf(stderr,"pooling4\n");
		now = nsec();
		while((t=sleeping.head) && now >= t->alarmtime){
		//fprintf(stderr,"pooling5\n");
			deltask(&sleeping, t);
			if(!t->system && --sleepingcounted == 0)
				taskcount--;
			taskready(t);
		}
	}
}
Esempio n. 5
0
void
fdtask(void *v)
{
	int i, ms;
	Task *t;
	uvlong now;

	tasksystem();
	taskname("fdtask");
    struct epoll_event events[20000];
	for(;;){
		/* let everyone else run */
		while(taskyield() > 0)
			;
		/* we're the only one runnable - epoll for i/o */
		errno = 0;
		taskstate("epoll");
		if(sleeping.head == nil && blocking.head == nil)
			ms = -1;
		else{
			/* sleep at most 100ms */
			now = nsec();
			if (t) {
				if(now >= t->alarmtime)
					ms = 0;
				else if(now+500*1000*1000LL >= t->alarmtime)
					ms = (t->alarmtime - now)/1000000;
				else
					ms = 500;			
			}else{
				ms = 500;
			}
	
		}
        int nevents;
		if((nevents = epoll_wait(epfd, events, 20000, ms)) < 0){
			if(errno == EINTR)
				continue;
			fprint(2, "epoll: %s\n", strerror(errno));
			taskexitall(0);
		}

		/* wake up the guys who deserve it */
		for(i=0; i<nevents; i++){
			//deleting it from blocking queue
			for (t = blocking.head; t!= nil && t!= events[i].data.ptr; t=t->next)
				;
			if(t==events[i].data.ptr)
				deltask(&blocking,t);
            taskready((Task *)events[i].data.ptr);
		}

		now = nsec();
		while((t=sleeping.head) && now >= t->alarmtime){
			deltask(&sleeping, t);
			if(!t->system && --sleepingcounted == 0)
				taskcount--;
			taskready(t);
		}

		/*wake up the guys who are blocked */

		while((t=blocking.head) && now >= t->alarmtime){
			deltask(&blocking, t);
			if(!t->system && --blockingcounted == 0)
				taskcount--;
			taskready(t);
		}
	}
}