Module: xenomai-rpm Branch: queue/vfile Commit: 8e7747c4b2225e281a17c3067425a9c0cc808260 URL: http://git.xenomai.org/?p=xenomai-rpm.git;a=commit;h=8e7747c4b2225e281a17c3067425a9c0cc808260
Author: Philippe Gerum <r...@xenomai.org> Date: Tue Jun 1 16:47:00 2010 +0200 uitron: convert to vfile --- ksrc/skins/uitron/flag.c | 123 ++++++++++++++++++++++++++++--------------- ksrc/skins/uitron/mbx.c | 119 +++++++++++++++++++++++++++---------------- ksrc/skins/uitron/module.c | 9 +--- ksrc/skins/uitron/sem.c | 118 +++++++++++++++++++++++++++--------------- 4 files changed, 231 insertions(+), 138 deletions(-) diff --git a/ksrc/skins/uitron/flag.c b/ksrc/skins/uitron/flag.c index c7f3c0d..1d74741 100644 --- a/ksrc/skins/uitron/flag.c +++ b/ksrc/skins/uitron/flag.c @@ -25,65 +25,102 @@ static xnmap_t *ui_flag_idmap; #ifdef CONFIG_PROC_FS -static int __flag_read_proc(char *page, - char **start, - off_t off, int count, int *eof, void *data) -{ - uiflag_t *flag = (uiflag_t *)data; - char *p = page; - int len; - spl_t s; +struct vfile_priv { + struct xnpholder *curr; + unsigned long value; +}; - xnlock_get_irqsave(&nklock, s); +struct vfile_data { + UINT wfmode; + UINT waiptn; + char name[XNOBJECT_NAME_LEN]; +}; - p += sprintf(p, "=0x%x, attr=%s\n", flag->flgvalue, - flag->flgatr & TA_WMUL ? "TA_WMUL" : "TA_WSGL"); +static int vfile_rewind(struct xnvfile_snapshot_iterator *it) +{ + struct vfile_priv *priv = xnvfile_snapshot_iterator_priv(it); + struct uiflag *flag = xnvfile_priv(it->vfile); - if (xnsynch_nsleepers(&flag->synchbase) > 0) { - xnpholder_t *holder; + priv->curr = getheadpq(xnsynch_wait_queue(&flag->synchbase)); + priv->value = flag->flgvalue; - /* Pended flag -- dump waiters. */ + return xnsynch_nsleepers(&flag->synchbase); +} - holder = getheadpq(xnsynch_wait_queue(&flag->synchbase)); +static int vfile_next(struct xnvfile_snapshot_iterator *it, void *data) +{ + struct vfile_priv *priv = xnvfile_snapshot_iterator_priv(it); + struct uiflag *flag = xnvfile_priv(it->vfile); + struct vfile_data *p = data; + struct xnthread *thread; + struct uitask *task; - while (holder) { - xnthread_t *sleeper = link2thread(holder, plink); - p += sprintf(p, "+%s\n", xnthread_name(sleeper)); - holder = nextpq(xnsynch_wait_queue(&flag->synchbase), holder); - } - } + priv->value = flag->flgvalue; /* Refresh as we collect. */ - xnlock_put_irqrestore(&nklock, s); + if (priv->curr == NULL) + return 0; /* We are done. */ + + /* Fetch current waiter, advance list cursor. */ + thread = link2thread(priv->curr, plink); + priv->curr = nextpq(xnsynch_wait_queue(&flag->synchbase), + priv->curr); - len = (p - page) - off; - if (len <= off + count) - *eof = 1; - *start = page + off; - if (len > count) - len = count; - if (len < 0) - len = 0; + /* Collect thread name to be output in ->show(). */ + strncpy(p->name, xnthread_name(thread), sizeof(p->name)); + task = thread2uitask(thread); + p->wfmode = task->wargs.flag.wfmode; + p->waiptn = task->wargs.flag.waiptn; - return len; + return 1; } -extern xnptree_t __uitron_ptree; +static int vfile_show(struct xnvfile_snapshot_iterator *it, void *data) +{ + struct vfile_priv *priv = xnvfile_snapshot_iterator_priv(it); + struct vfile_data *p = data; + + if (p == NULL) { /* Dump header. */ + /* Always dump current flag value. */ + xnvfile_printf(it, "=0x%lx\n", priv->value); + if (it->nrdata > 0) + xnvfile_printf(it, "\n%10s %4s %s\n", + "WAITPN", "WFMODE", "WAITER"); + } else + xnvfile_printf(it, "0x%-8x %4s %.*s\n", + p->waiptn, + p->wfmode & TWF_ORW ? "OR" : "AND", + (int)sizeof(p->name), p->name); + + return 0; +} -static xnpnode_t __flag_pnode = { +static struct xnvfile_snapshot_ops vfile_ops = { + .rewind = vfile_rewind, + .next = vfile_next, + .show = vfile_show, +}; - .dir = NULL, - .type = "flags", - .entries = 0, - .read_proc = &__flag_read_proc, - .write_proc = NULL, - .root = &__uitron_ptree, +extern struct xnptree __uitron_ptree; + +static struct xnpnode_file __flag_pnode = { + .node = { + .dirname = "flags", + .root = &__uitron_ptree, + .ops = &xnregistry_vfile_ops, + }, + .vfile = { + .privsz = sizeof(struct vfile_priv), + .datasz = sizeof(struct vfile_data), + .ops = &vfile_ops, + }, }; #else /* !CONFIG_PROC_FS */ -static xnpnode_t __flag_pnode = { - - .type = "flags" +static struct xnpnode_file __flag_pnode = { + .node = { + .dirname = "flags", + }, }; #endif /* !CONFIG_PROC_FS */ @@ -128,7 +165,7 @@ ER cre_flg(ID flgid, T_CFLG *pk_cflg) flag->flgatr = pk_cflg->flgatr; flag->flgvalue = pk_cflg->iflgptn; sprintf(flag->name, "flg%d", flgid); - xnregistry_enter(flag->name, flag, &flag->handle, &__flag_pnode); + xnregistry_enter(flag->name, flag, &flag->handle, &__flag_pnode.node); xnarch_memory_barrier(); flag->magic = uITRON_FLAG_MAGIC; diff --git a/ksrc/skins/uitron/mbx.c b/ksrc/skins/uitron/mbx.c index 746919c..e867277 100644 --- a/ksrc/skins/uitron/mbx.c +++ b/ksrc/skins/uitron/mbx.c @@ -25,66 +25,97 @@ static xnmap_t *ui_mbx_idmap; #ifdef CONFIG_PROC_FS -static int __mbx_read_proc(char *page, - char **start, - off_t off, int count, int *eof, void *data) -{ - uimbx_t *mbx = (uimbx_t *)data; - char *p = page; - int len; - spl_t s; +struct vfile_priv { + struct xnpholder *curr; + int mcount; + int bufcnt; + int mbxatr; +}; - xnlock_get_irqsave(&nklock, s); +struct vfile_data { + char name[XNOBJECT_NAME_LEN]; +}; - p += sprintf(p, "%d/%d message(s), attr=%s\n", - mbx->mcount, mbx->bufcnt, - mbx->mbxatr & TA_TPRI ? "TA_TPRI" : "TA_TFIFO"); +static int vfile_rewind(struct xnvfile_snapshot_iterator *it) +{ + struct vfile_priv *priv = xnvfile_snapshot_iterator_priv(it); + struct uimbx *mbx = xnvfile_priv(it->vfile); - if (xnsynch_pended_p(&mbx->synchbase)) { - xnpholder_t *holder; + priv->curr = getheadpq(xnsynch_wait_queue(&mbx->synchbase)); + priv->mcount = mbx->mcount; + priv->bufcnt = mbx->bufcnt; + priv->mbxatr = mbx->mbxatr; - /* Pended mbx -- dump waiters. */ + return xnsynch_nsleepers(&mbx->synchbase); +} - holder = getheadpq(xnsynch_wait_queue(&mbx->synchbase)); +static int vfile_next(struct xnvfile_snapshot_iterator *it, void *data) +{ + struct vfile_priv *priv = xnvfile_snapshot_iterator_priv(it); + struct uimbx *mbx = xnvfile_priv(it->vfile); + struct vfile_data *p = data; + struct xnthread *thread; - while (holder) { - xnthread_t *sleeper = link2thread(holder, plink); - p += sprintf(p, "+%s\n", xnthread_name(sleeper)); - holder = nextpq(xnsynch_wait_queue(&mbx->synchbase), holder); - } - } + if (priv->curr == NULL) + return 0; /* We are done. */ - xnlock_put_irqrestore(&nklock, s); + /* Fetch current waiter, advance list cursor. */ + thread = link2thread(priv->curr, plink); + priv->curr = nextpq(xnsynch_wait_queue(&mbx->synchbase), + priv->curr); - len = (p - page) - off; - if (len <= off + count) - *eof = 1; - *start = page + off; - if (len > count) - len = count; - if (len < 0) - len = 0; + /* Collect thread name to be output in ->show(). */ + strncpy(p->name, xnthread_name(thread), sizeof(p->name)); - return len; + return 1; } -extern xnptree_t __uitron_ptree; +static int vfile_show(struct xnvfile_snapshot_iterator *it, void *data) +{ + struct vfile_priv *priv = xnvfile_snapshot_iterator_priv(it); + struct vfile_data *p = data; + + if (p == NULL) { /* Dump header. */ + /* Always dump mailbox value. */ + xnvfile_printf(it, "%d/%d message(s), attr=%s\n", + priv->mcount, priv->bufcnt, + priv->mbxatr & TA_TPRI ? "TA_TPRI" : "TA_TFIFO"); + if (it->nrdata > 0) + xnvfile_printf(it, "--------------------\n"); + } else + xnvfile_printf(it, "%.*s\n", + (int)sizeof(p->name), p->name); + + return 0; +} -static xnpnode_t __mbx_pnode = { +static struct xnvfile_snapshot_ops vfile_ops = { + .rewind = vfile_rewind, + .next = vfile_next, + .show = vfile_show, +}; - .dir = NULL, - .type = "mailboxes", - .entries = 0, - .read_proc = &__mbx_read_proc, - .write_proc = NULL, - .root = &__uitron_ptree, +extern struct xnptree __uitron_ptree; + +static struct xnpnode_file __mbx_pnode = { + .node = { + .dirname = "mailboxes", + .root = &__uitron_ptree, + .ops = &xnregistry_vfile_ops, + }, + .vfile = { + .privsz = sizeof(struct vfile_priv), + .datasz = sizeof(struct vfile_data), + .ops = &vfile_ops, + }, }; #else /* !CONFIG_PROC_FS */ -static xnpnode_t __mbx_pnode = { - - .type = "mailboxes" +static struct xnpnode_file __mbx_pnode = { + .node = { + .dirname = "mailboxes", + }, }; #endif /* !CONFIG_PROC_FS */ @@ -150,7 +181,7 @@ ER cre_mbx(ID mbxid, T_CMBX *pk_cmbx) mbx->mcount = 0; mbx->ring = ring; sprintf(mbx->name, "mbx%d", mbxid); - xnregistry_enter(mbx->name, mbx, &mbx->handle, &__mbx_pnode); + xnregistry_enter(mbx->name, mbx, &mbx->handle, &__mbx_pnode.node); xnarch_memory_barrier(); mbx->magic = uITRON_MBX_MAGIC; diff --git a/ksrc/skins/uitron/module.c b/ksrc/skins/uitron/module.c index 26b5bf8..259be00 100644 --- a/ksrc/skins/uitron/module.c +++ b/ksrc/skins/uitron/module.c @@ -40,14 +40,7 @@ xntbase_t *ui_tbase; ui_rholder_t __ui_global_rholder; -#ifdef CONFIG_PROC_FS -xnptree_t __uitron_ptree = { - - .dir = NULL, - .name = "uitron", - .entries = 0, -}; -#endif /* CONFIG_PROC_FS */ +DEFINE_XNPTREE(__uitron_ptree, "uitron"); int SKIN_INIT(uitron) { diff --git a/ksrc/skins/uitron/sem.c b/ksrc/skins/uitron/sem.c index aceeaef..3032634 100644 --- a/ksrc/skins/uitron/sem.c +++ b/ksrc/skins/uitron/sem.c @@ -25,65 +25,97 @@ static xnmap_t *ui_sem_idmap; #ifdef CONFIG_PROC_FS -static int __sem_read_proc(char *page, - char **start, - off_t off, int count, int *eof, void *data) -{ - uisem_t *sem = (uisem_t *)data; - char *p = page; - int len; - spl_t s; +struct vfile_priv { + struct xnpholder *curr; + int semcnt; + int sematr; +}; - xnlock_get_irqsave(&nklock, s); +struct vfile_data { + char name[XNOBJECT_NAME_LEN]; +}; - p += sprintf(p, "=%d, attr=%s\n", sem->semcnt, - sem->sematr & TA_TPRI ? "TA_TPRI" : "TA_TFIFO"); +static int vfile_rewind(struct xnvfile_snapshot_iterator *it) +{ + struct vfile_priv *priv = xnvfile_snapshot_iterator_priv(it); + struct uisem *sem = xnvfile_priv(it->vfile); - if (xnsynch_pended_p(&sem->synchbase)) { - xnpholder_t *holder; + priv->curr = getheadpq(xnsynch_wait_queue(&sem->synchbase)); + priv->semcnt = sem->semcnt; + priv->sematr = sem->sematr; + + return xnsynch_nsleepers(&sem->synchbase); +} - /* Pended semaphore -- dump waiters. */ +static int vfile_next(struct xnvfile_snapshot_iterator *it, void *data) +{ + struct vfile_priv *priv = xnvfile_snapshot_iterator_priv(it); + struct uisem *sem = xnvfile_priv(it->vfile); + struct vfile_data *p = data; + struct xnthread *thread; - holder = getheadpq(xnsynch_wait_queue(&sem->synchbase)); + priv->semcnt = sem->semcnt; /* Refresh as we collect. */ - while (holder) { - xnthread_t *sleeper = link2thread(holder, plink); - p += sprintf(p, "+%s\n", xnthread_name(sleeper)); - holder = nextpq(xnsynch_wait_queue(&sem->synchbase), holder); - } - } + if (priv->curr == NULL) + return 0; /* We are done. */ - xnlock_put_irqrestore(&nklock, s); + /* Fetch current waiter, advance list cursor. */ + thread = link2thread(priv->curr, plink); + priv->curr = nextpq(xnsynch_wait_queue(&sem->synchbase), + priv->curr); - len = (p - page) - off; - if (len <= off + count) - *eof = 1; - *start = page + off; - if (len > count) - len = count; - if (len < 0) - len = 0; + /* Collect thread name to be output in ->show(). */ + strncpy(p->name, xnthread_name(thread), sizeof(p->name)); - return len; + return 1; } -extern xnptree_t __uitron_ptree; +static int vfile_show(struct xnvfile_snapshot_iterator *it, void *data) +{ + struct vfile_priv *priv = xnvfile_snapshot_iterator_priv(it); + struct vfile_data *p = data; + + if (p == NULL) { /* Dump header. */ + /* Always dump current semaphore value. */ + xnvfile_printf(it, "count=%d, attr=%s\n", + priv->semcnt, + priv->sematr & TA_TPRI ? "TA_TPRI" : "TA_TFIFO"); + if (it->nrdata > 0) + xnvfile_printf(it, "--------------------\n"); + } else + xnvfile_printf(it, "%.*s\n", + (int)sizeof(p->name), p->name); -static xnpnode_t __sem_pnode = { + return 0; +} - .dir = NULL, - .type = "semaphores", - .entries = 0, - .read_proc = &__sem_read_proc, - .write_proc = NULL, - .root = &__uitron_ptree, +static struct xnvfile_snapshot_ops vfile_ops = { + .rewind = vfile_rewind, + .next = vfile_next, + .show = vfile_show, }; -#else /* !CONFIG_PROC_FS */ +extern struct xnptree __uitron_ptree; + +static struct xnpnode_file __sem_pnode = { + .node = { + .dirname = "semaphores", + .root = &__uitron_ptree, + .ops = &xnregistry_vfile_ops, + }, + .vfile = { + .privsz = sizeof(struct vfile_priv), + .datasz = sizeof(struct vfile_data), + .ops = &vfile_ops, + }, +}; -static xnpnode_t __sem_pnode = { +#else /* !CONFIG_PROC_FS */ - .type = "semaphores" +static struct xnpnode_file __sem_pnode = { + .node = { + .dirname = "semaphores", + }, }; #endif /* !CONFIG_PROC_FS */ @@ -136,7 +168,7 @@ ER cre_sem(ID semid, T_CSEM *pk_csem) sem->semcnt = pk_csem->isemcnt; sem->maxsem = pk_csem->maxsem; sprintf(sem->name, "sem%d", semid); - xnregistry_enter(sem->name, sem, &sem->handle, &__sem_pnode); + xnregistry_enter(sem->name, sem, &sem->handle, &__sem_pnode.node); xnarch_memory_barrier(); sem->magic = uITRON_SEM_MAGIC; _______________________________________________ Xenomai-git mailing list Xenomai-git@gna.org https://mail.gna.org/listinfo/xenomai-git