STATUS taskGetInfo(TASK_ID task_id, TASK_DESC *desc) { int vfirst, vlast, ret; struct wind_task *task; struct WIND_TCB *tcb; pthread_attr_t attr; size_t stacksize; void *stackbase; task = get_wind_task(task_id); if (task == NULL) { errno = S_objLib_OBJ_ID_ERROR; return ERROR; } tcb = task->tcb; desc->td_tid = task_id; desc->td_priority = wind_task_get_priority(task); desc->td_status = get_task_status(task); desc->td_flags = tcb->flags; strncpy(desc->td_name, task->name, sizeof(desc->td_name)); desc->td_entry = tcb->entry; desc->td_errorStatus = *task->thobj.errno_pointer; ret = pthread_getattr_np(task->thobj.tid, &attr); put_wind_task(task); /* * If the target does not support pthread_getattr_np(), we are * out of luck for determining the stack information. We just * zero it. */ if (ret) { /* No idea, buddy. */ desc->td_stacksize = 0; desc->td_pStackBase = NULL; } else { pthread_attr_getstack(&attr, &stackbase, &stacksize); desc->td_stacksize = stacksize; desc->td_pStackBase = stackbase; if (&vfirst < &vlast) /* Stack grows upward. */ desc->td_pStackEnd = (caddr_t)stackbase + stacksize; else /* Stack grows downward. */ desc->td_pStackEnd = (caddr_t)stackbase - stacksize; } return OK; }
static size_t task_registry_read(struct fsobj *fsobj, char *buf, size_t size, off_t offset) { struct wind_task *task; char sbuf[64]; size_t len; task = container_of(fsobj, struct wind_task, fsobj); len = sprintf(buf, "name = %s\n", task->name); len += sprintf(buf + len, "errno = %d\n", threadobj_get_errno(&task->thobj)); len += sprintf(buf + len, "status = %s\n", task_decode_status(task, sbuf)); len += sprintf(buf + len, "priority = %d\n", wind_task_get_priority(task)); len += sprintf(buf + len, "lock_depth = %d\n", threadobj_get_lockdepth(&task->thobj)); return len; }