void DaemonInstance::StateThreads (Layer3 * l3, Logs * t, ClientConnection * c, pth_event_t stop) { uchar buf[3]; EIBSETTYPE (buf, EIB_STATE_REQ_THREADS); buf[2] = 0; c->sendmessage (sizeof(buf), buf, stop); pth_ctrl(PTH_CTRL_DUMPSTATE, stdout); for ( Thread::pthset::iterator i= Thread::get_running_threads().begin(); i!= Thread::get_running_threads().end(); ++i) { unsigned char *n; static pth_time_t t; static pth_attr_t tr; int dispatches; tr=pth_attr_of(*i); pth_attr_get(tr,PTH_ATTR_NAME,&n); pth_attr_get(tr,PTH_ATTR_TIME_RAN,&t); pth_attr_get(tr,PTH_ATTR_DISPATCHES,&dispatches); printf("0x%lx %32s:%6d:\t", (unsigned long) *i, n, (int) dispatches); printf("%ld.%ld\n", (unsigned long) t.tv_sec, (unsigned long) t.tv_usec/1000); } }
bool Thread::isFinished () { if (tid ==0) return true; pth_attr_t a = pth_attr_of (tid); int state; pth_attr_get (a, PTH_ATTR_STATE, &state); pth_attr_destroy (a); return (state == PTH_STATE_DEAD); }
void Thread::StopDelete () { autodel = true; pth_sem_inc (&should_stop, FALSE); if (!tid) return; pth_attr_t at = pth_attr_of (tid); pth_attr_set (at, PTH_ATTR_JOINABLE, FALSE); pth_attr_destroy (at); }
void Thread::Start () { if (tid) { pth_attr_t a = pth_attr_of (tid); int state; pth_attr_get (a, PTH_ATTR_STATE, &state); pth_attr_destroy (a); if (state != PTH_STATE_DEAD) return; Stop (); } pth_attr_t attr = pth_attr_new (); pth_attr_set (attr, PTH_ATTR_PRIO, prio); tid = pth_spawn (attr, &ThreadWrapper, this); pth_attr_destroy (attr); }
void Thread::Start (bool detach) { if (joinable && tid) { pth_attr_t a = pth_attr_of (tid); int state; pth_attr_get (a, PTH_ATTR_STATE, &state); pth_attr_destroy (a); if (state != PTH_STATE_DEAD) return; Stop (); } pth_sem_init (&should_stop); pth_attr_t attr = pth_attr_new (); pth_attr_set (attr, PTH_ATTR_PRIO, prio); joinable = !detach; if (detach) pth_attr_set (attr, PTH_ATTR_JOINABLE, FALSE); tid = pth_spawn (attr, &ThreadWrapper, this); pth_attr_destroy (attr); }