// thread relinquish use of the processor // and wait in the ready queuee void th_yield() { entry_section(); if (threads[curr]->state == RUNNING) rq_push(curr); else if (threads[curr]->state == WAITING) wq_push(curr); // transfer the control to the next thread if (rq_begin != rq_end) { int old = curr; curr = rq_front(); rq_pop(); threads[curr]->state = RUNNING; exit_section(); th_swap(threads[old], threads[curr]); entry_section(); recycle_dead(); } exit_section(); }
critical void getRepPacket(packet_t *thePacket) { uint8_t plen, i; uint8_t * packet_ptr = (uint8_t *) thePacket; plen = rq_front() + HEADER_SIZE; for (i = 0; i < plen; i++) { packet_ptr[i] = rq_pop(); } newRepPacket--; // XXX DEBUGGING //newUARTPacket++; }
void libevent_token_thread( int fd, short ev,void *arg){ uint64_t u; ssize_t s; s = read(token_efd, &u, sizeof(uint64_t)); if (s != sizeof(uint64_t)){ printf("s is error\n"); } notify_token_thread = NT_WORKING; do{ RQ *rq_item = rq_pop(); if(rq_item == NULL){ /* DEBUG("rq_item is null");*/ break; } if(rq_item->isjob == JOB_HAS) { WTQ *work_child = wtq_queue_tail; FIND_WTQ(work_child, JOB_FREE); if(work_child->isjob == JOB_FREE){ rq_item->isjob = JOB_WORKING; work_child->rq_item = rq_item; work_child->isjob = JOB_HAS; LIBEVENT_WORK_THREAD *thread; thread = work_threads + work_child->no; if(thread == NULL){ DEBUG("thread null "); rq_item->isjob = JOB_HAS; work_child->isjob = JOB_FREE; break; } if(write(thread->notify_write_fd, "", 1) != 1){ DEBUG("write thread error"); } } } else{ DEBUG("break"); break; } }while(1); notify_token_thread = NT_FREE; }