static ssize_t proc_read(FAR struct file *filep, FAR char *buffer, size_t buflen) { FAR struct proc_file_s *procfile; FAR struct tcb_s *tcb; irqstate_t flags; ssize_t ret; fvdbg("buffer=%p buflen=%d\n", buffer, (int)buflen); /* Recover our private data from the struct file instance */ procfile = (FAR struct proc_file_s *)filep->f_priv; DEBUGASSERT(procfile); /* Verify that the thread is still valid */ flags = irqsave(); tcb = sched_gettcb(procfile->pid); if (!tcb) { fdbg("ERROR: PID %d is not valid\n", (int)procfile->pid); irqrestore(flags); return -ENODEV; } /* Provide the requested data */ switch (procfile->node->node) { case PROC_STATUS: /* Task/thread status */ ret = proc_status(procfile, tcb, buffer, buflen, filep->f_pos); break; case PROC_CMDLINE: /* Task command line */ ret = proc_cmdline(procfile, tcb, buffer, buflen, filep->f_pos); break; #ifdef CONFIG_SCHED_CPULOAD case PROC_LOADAVG: /* Average CPU utilization */ ret = proc_loadavg(procfile, tcb, buffer, buflen, filep->f_pos); break; #endif case PROC_STACK: /* Task stack info */ ret = proc_stack(procfile, tcb, buffer, buflen, filep->f_pos); break; case PROC_GROUP_STATUS: /* Task group status */ ret = proc_groupstatus(procfile, tcb, buffer, buflen, filep->f_pos); break; case PROC_GROUP_FD: /* Group file descriptors */ ret = proc_groupfd(procfile, tcb, buffer, buflen, filep->f_pos); break; default: ret = -EINVAL; break; } irqrestore(flags); /* Update the file offset */ if (ret > 0) { filep->f_pos += ret; } return ret; }
static ssize_t proc_read(FAR struct file *filep, FAR char *buffer, size_t buflen) { FAR struct proc_file_s *procfile; FAR struct tcb_s *tcb; irqstate_t flags; ssize_t ret; finfo("buffer=%p buflen=%d\n", buffer, (int)buflen); /* Recover our private data from the struct file instance */ procfile = (FAR struct proc_file_s *)filep->f_priv; DEBUGASSERT(procfile != NULL); /* Verify that the thread is still valid */ flags = enter_critical_section(); tcb = sched_gettcb(procfile->pid); if (tcb == NULL) { ferr("ERROR: PID %d is not valid\n", (int)procfile->pid); leave_critical_section(flags); return -ENODEV; } /* Provide the requested data */ switch (procfile->node->node) { case PROC_STATUS: /* Task/thread status */ ret = proc_status(procfile, tcb, buffer, buflen, filep->f_pos); break; case PROC_CMDLINE: /* Task command line */ ret = proc_cmdline(procfile, tcb, buffer, buflen, filep->f_pos); break; #ifdef CONFIG_SCHED_CPULOAD case PROC_LOADAVG: /* Average CPU utilization */ ret = proc_loadavg(procfile, tcb, buffer, buflen, filep->f_pos); break; #endif case PROC_STACK: /* Task stack info */ ret = proc_stack(procfile, tcb, buffer, buflen, filep->f_pos); break; case PROC_GROUP_STATUS: /* Task group status */ ret = proc_groupstatus(procfile, tcb, buffer, buflen, filep->f_pos); break; case PROC_GROUP_FD: /* Group file descriptors */ ret = proc_groupfd(procfile, tcb, buffer, buflen, filep->f_pos); break; #if !defined(CONFIG_DISABLE_ENVIRON) && !defined(CONFIG_FS_PROCFS_EXCLUDE_ENVIRON) case PROC_GROUP_ENV: /* Group environment variables */ ret = proc_groupenv(procfile, tcb, buffer, buflen, filep->f_pos); break; #endif default: ret = -EINVAL; break; } leave_critical_section(flags); /* Update the file offset */ if (ret > 0) { filep->f_pos += ret; } return ret; }