Example #1
0
int KSG_Queue_Task_Scheduler_Impl::notify_new_task()
{
	int count;
	// reload sleeping queue
	{
		// 
		//ACE_MT(ACE_GUARD_RETURN(ACE_Thread_Mutex,mon,_head_of_waiting->_mutex,-1));
		//ACE_MT(ACE_GUARD_RETURN(ACE_Thread_Mutex,mon1,_head_of_sleeping->_mutex,-1));
		KSG_Task_Queue *queue,*pre;
		count = 0;
		for(queue = _head_of_sleeping->_head->next();
			queue != _head_of_sleeping->_head;)
		{
			if(queue->count_of_tasks() > 0)
			{
				pre = remove_queue(_head_of_sleeping,queue);
				//ACE_DEBUG((LM_DEBUG,"push queue to waiting queue!"));
				push_back_queue(_head_of_waiting,queue);
				count++;
			}
			else
				pre = queue;
			// 应该不会出现这种情况
			if(!pre)
				goto L_END; 
			queue = pre->next();
		}
	}
L_END:
	if(count > 0)
		return 0;
	return -1;
}
Example #2
0
int KSG_Queue_Task_Scheduler_Impl::push_queue(KSG_Task_Queue *queue)
{
	Queue_Head *q;
	// 记录到 blocking 队列
	if(queue->status() == KSG_Task_Queue::tq_blocking)
	{
		// the blocking queue must be test 
		// TODO : 检查 blocking 队列中的设备
		//q = _head_of_blocking;
		q = _head_of_sleeping;
	}
	else if(queue->count_of_tasks() > 0)
	{
		// 记录到 waiting 队列
		// now , there are some tasks left in the queue , so we put it into the waiting queue list
		q = _head_of_waiting;
	}
	else
	{
		// 记录到 sleeping 队列
		// here , we should monitor the sleeping queue.
		q = _head_of_sleeping;
	}
	{
		ACE_MT(ACE_GUARD_RETURN(ACE_Thread_Mutex,mon,q->_mutex,-1));
		push_back_queue(q,queue);
	}
	return 0;
}
Example #3
0
int KSG_Queue_Task_Scheduler_Impl::push_queue(KSG_Task_Queue *queue)
{
	Queue_Head *q;
	int restart_schd = 0;
	// 记录到 blocking 队列
	if(queue->status() == KSG_Task_Queue::tq_blocking)
	{
		// the blocking queue must be test 
		// TODO : 检查 blocking 队列中的设备
		//q = _head_of_blocking;
		q = _head_of_sleeping;
	}
	else if(queue->count_of_preemptive_tasks()>0)
	{
		ACE_DEBUG((LM_DEBUG,"队列有抢占式任务count[%d]",queue->count_of_preemptive_tasks()));
		q = _head_of_running;
		restart_schd = 1;
	}
	else if(queue->count_of_tasks() > 0)
	{
		// 记录到 waiting 队列
		// now , there are some tasks left in the queue , so we put it into the waiting queue list
		ACE_DEBUG((LM_DEBUG,"队列进入等待count[%d]",queue->count_of_tasks()));
		q = _head_of_waiting;
		restart_schd = 1;
	}
	else
	{
		// 记录到 sleeping 队列
		// here , we should monitor the sleeping queue.
		ACE_DEBUG((LM_DEBUG,"队列无任务"));
		q = _head_of_sleeping;
	}
	{
		//ACE_MT(ACE_GUARD_RETURN(ACE_Thread_Mutex,mon,q->_mutex,-1));
		push_back_queue(q,queue);
	}
	if(restart_schd)
	{
		// 还有任务,唤醒
		//notify_new_task();
		Task_Queue_Pool::instance()->singal_queue(_queue_key,queue);
		ACE_DEBUG((LM_TRACE,"调度线程唤醒队列......"));
	}
	return 0;
}
Example #4
0
int KSG_Queue_Task_Scheduler_Impl::wait_for_wake_up(long time_out)
{
	int ret = Task_Queue_Pool::instance()->wait_for_queue(_queue_key,time_out);
	if(!ret)
		return ret;
	int count;
	// reload sleeping queue
	{
		// 
		ACE_GUARD_RETURN(ACE_Thread_Mutex,mon,_head_of_waiting->_mutex,-1);
		ACE_GUARD_RETURN(ACE_Thread_Mutex,mon1,_head_of_sleeping->_mutex,-1);
		KSG_Task_Queue *queue,*pre;
		count = 0;
		for(queue = _head_of_sleeping->_head->next();
			queue != _head_of_sleeping->_head;)
		{
			if(queue->count_of_tasks() > 0)
			{
				pre = remove_queue(_head_of_sleeping,queue);
				push_back_queue(_head_of_waiting,queue);
				count++;
			}
			else
				pre = queue;
			// 应该不会出现这种情况
			if(!pre)
				goto L_END; 
			queue = pre->next();
		}
	}
L_END:
	if(count > 0)
		return 0;
	// 处理失败
	return -1;
}
Example #5
0
QueueNode* enqueue_queue(Queue* queue, void* data)
{
  return push_back_queue(queue, data);
}