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; }
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; }
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; }
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; }
QueueNode* enqueue_queue(Queue* queue, void* data) { return push_back_queue(queue, data); }