From 9f01df47ea17f67e18b9c36d046bb268ccaa79a7 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Sat, 14 Dec 2013 08:53:23 -0600 Subject: [PATCH] Create procfs_utils.c; File missed from last commit; + remove warning from mm_memalign.c (how did this work before?) --- ChangeLog | 3 + arch/arm/src/a1x/chip/a1x_piocfg.h | 52 ++++++++++ fs/procfs/Make.defs | 2 +- fs/procfs/fs_procfsproc.c | 62 ++---------- fs/procfs/fs_procfsutil.c | 153 +++++++++++++++++++++++++++++ include/nuttx/fs/procfs.h | 45 ++++++++- mm/mm_memalign.c | 14 ++- mm/mm_realloc.c | 6 +- 8 files changed, 278 insertions(+), 59 deletions(-) create mode 100644 arch/arm/src/a1x/chip/a1x_piocfg.h create mode 100644 fs/procfs/fs_procfsutil.c diff --git a/ChangeLog b/ChangeLog index 4f1ca5b555..e69b87635d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6223,3 +6223,6 @@ * arch/arm/src/a1x/a1x_lowputc.c, a1x_serial.c, and a1x_serila.h: Beginning of an A10 serial driver. From Alan Carvalho de Assis (2013-12-13). + * fs/procfs/procfs_utils.c: Move some re-usable functions out of + fs_procfsproc.c into a utility file (2013-12-14). + diff --git a/arch/arm/src/a1x/chip/a1x_piocfg.h b/arch/arm/src/a1x/chip/a1x_piocfg.h new file mode 100644 index 0000000000..019eebf778 --- /dev/null +++ b/arch/arm/src/a1x/chip/a1x_piocfg.h @@ -0,0 +1,52 @@ +/************************************************************************************ + * arch/arm/src/a1x/chip/a1x_piocfg.h + * + * Copyright (C) 2013 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ************************************************************************************/ + +#ifndef __ARCH_ARM_SRC_A1X_CHIP_A1X_PIOCFG_H +#define __ARCH_ARM_SRC_A1X_CHIP_A1X_PIOCFG_H + +/************************************************************************************ + * Included Files + ************************************************************************************/ + +#include +#include + +#if defined(CONFIG_ARCH_CHIP_A10) +# include "chip/a10_piocfg.h" +#else +# error Unrecognized A1X architecture +#endif + +#endif /* __ARCH_ARM_SRC_A1X_CHIP_A1X_PIOCFG_H */ diff --git a/fs/procfs/Make.defs b/fs/procfs/Make.defs index b39fa782db..c29dce37c3 100644 --- a/fs/procfs/Make.defs +++ b/fs/procfs/Make.defs @@ -37,7 +37,7 @@ ifeq ($(CONFIG_FS_PROCFS),y) # Files required for procfs file system support ASRCS += -CSRCS += fs_procfs.c fs_procfsproc.c +CSRCS += fs_procfs.c fs_procfsproc.c fs_procfsutil.c # Include procfs build support diff --git a/fs/procfs/fs_procfsproc.c b/fs/procfs/fs_procfsproc.c index 172a19fb61..8721ce07e3 100644 --- a/fs/procfs/fs_procfsproc.c +++ b/fs/procfs/fs_procfsproc.c @@ -71,10 +71,6 @@ #define STATUS_LINELEN 32 -#ifndef MIN -# define MIN(a,b) ((a < b) ? a : b) -#endif - /**************************************************************************** * Private Types ****************************************************************************/ @@ -128,9 +124,6 @@ struct process_level1_s /* Helpers */ static int process_findattr(FAR const char *attr); -static size_t process_addline(FAR struct process_file_s *attr, - FAR char *buffer, size_t buflen, size_t linesize, - off_t *offset); static ssize_t process_status(FAR struct process_file_s *attr, FAR struct tcb_s *tcb, FAR char *buffer, size_t buflen, off_t offset); @@ -248,41 +241,6 @@ static int process_findattr(FAR const char *attr) return -ENOENT; } -/**************************************************************************** - * Name: process_addline - ****************************************************************************/ - -static size_t process_addline(FAR struct process_file_s *attr, - FAR char *buffer, size_t buflen, - size_t linesize, off_t *offset) -{ - size_t copysize; - size_t lnoffset; - - /* Will this line take us past the offset? */ - - lnoffset = *offset; - if (linesize < lnoffset) - { - /* No... decrement the offset and return without doing anything */ - - *offset -= linesize; - return 0; - } - - /* Handle the remaining offset */ - - linesize -= lnoffset; - buffer += lnoffset; - *offset = 0; - - /* Copy the line into the user buffer */ - - copysize = MIN(linesize, buflen); - memcpy(buffer, &attr->line[lnoffset], copysize); - return copysize; -} - /**************************************************************************** * Name: process_status ****************************************************************************/ @@ -309,7 +267,7 @@ static ssize_t process_status(FAR struct process_file_s *attr, #endif linesize = snprintf(attr->line, STATUS_LINELEN, "%-12s%s\n", "Name:", name); - copysize = process_addline(attr, buffer, remaining, linesize, &offset); + copysize = procfs_memcpy(attr->line, linesize, buffer, remaining, &offset); totalsize += copysize; buffer += copysize; @@ -325,7 +283,7 @@ static ssize_t process_status(FAR struct process_file_s *attr, linesize = snprintf(attr->line, STATUS_LINELEN, "%-12s%s\n", "Type:", g_ttypenames[(tcb->flags & TCB_FLAG_TTYPE_MASK) >> TCB_FLAG_TTYPE_SHIFT]); - copysize = process_addline(attr, buffer, remaining, linesize, &offset); + copysize = procfs_memcpy(attr->line, linesize, buffer, remaining, &offset); totalsize += copysize; buffer += copysize; @@ -340,7 +298,7 @@ static ssize_t process_status(FAR struct process_file_s *attr, linesize = snprintf(attr->line, STATUS_LINELEN, "%-12s%s\n", "State:", g_statenames[tcb->task_state]); - copysize = process_addline(attr, buffer, remaining, linesize, &offset); + copysize = procfs_memcpy(attr->line, linesize, buffer, remaining, &offset); totalsize += copysize; buffer += copysize; @@ -360,7 +318,7 @@ static ssize_t process_status(FAR struct process_file_s *attr, linesize = snprintf(attr->line, STATUS_LINELEN, "%-12s%d\n", "Priority:", tcb->sched_priority); #endif - copysize = process_addline(attr, buffer, remaining, linesize, &offset); + copysize = procfs_memcpy(attr->line, linesize, buffer, remaining, &offset); totalsize += copysize; buffer += copysize; @@ -375,7 +333,7 @@ static ssize_t process_status(FAR struct process_file_s *attr, linesize = snprintf(attr->line, STATUS_LINELEN, "%-12s%s\n", "Scheduler:", tcb->flags & TCB_FLAG_ROUND_ROBIN ? "SCHED_RR" : "SCHED_FIFO"); - copysize = process_addline(attr, buffer, remaining, linesize, &offset); + copysize = procfs_memcpy(attr->line, linesize, buffer, remaining, &offset); totalsize += copysize; buffer += copysize; @@ -391,7 +349,7 @@ static ssize_t process_status(FAR struct process_file_s *attr, #ifndef CONFIG_DISABLE_SIGNALS linesize = snprintf(attr->line, STATUS_LINELEN, "%-12s%08x\n", "SigMask:", tcb->sigprocmask); - copysize = process_addline(attr, buffer, remaining, linesize, &offset); + copysize = procfs_memcpy(attr->line, linesize, buffer, remaining, &offset); totalsize += copysize; #endif @@ -427,7 +385,7 @@ static ssize_t process_cmdline(FAR struct process_file_s *attr, #endif linesize = strlen(name); memcpy(attr->line, name, linesize); - copysize = process_addline(attr, buffer, remaining, linesize, &offset); + copysize = procfs_memcpy(attr->line, linesize, buffer, remaining, &offset); totalsize += copysize; buffer += copysize; @@ -446,7 +404,7 @@ static ssize_t process_cmdline(FAR struct process_file_s *attr, FAR struct pthread_tcb_s *ptcb = (FAR struct pthread_tcb_s *)tcb; linesize = snprintf(attr->line, STATUS_LINELEN, " 0x%p\n", ptcb->arg); - copysize = process_addline(attr, buffer, remaining, linesize, &offset); + copysize = procfs_memcpy(attr->line, linesize, buffer, remaining, &offset); totalsize += copysize; buffer += copysize; @@ -463,7 +421,7 @@ static ssize_t process_cmdline(FAR struct process_file_s *attr, for (argv = ttcb->argv + 1; *argv; argv++) { linesize = snprintf(attr->line, STATUS_LINELEN, " %s", *argv); - copysize = process_addline(attr, buffer, remaining, linesize, &offset); + copysize = procfs_memcpy(attr->line, linesize, buffer, remaining, &offset); totalsize += copysize; buffer += copysize; @@ -476,7 +434,7 @@ static ssize_t process_cmdline(FAR struct process_file_s *attr, } linesize = snprintf(attr->line, STATUS_LINELEN, "\n"); - copysize = process_addline(attr, buffer, remaining, linesize, &offset); + copysize = procfs_memcpy(attr->line, linesize, buffer, remaining, &offset); totalsize += copysize; return totalsize; diff --git a/fs/procfs/fs_procfsutil.c b/fs/procfs/fs_procfsutil.c new file mode 100644 index 0000000000..ea483e1804 --- /dev/null +++ b/fs/procfs/fs_procfsutil.c @@ -0,0 +1,153 @@ +/**************************************************************************** + * fs/procfs/fs_procfsutil.c + * + * Copyright (C) 2013 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include + +#if !defined(CONFIG_DISABLE_MOUNTPOINT) && defined(CONFIG_FS_PROCFS) + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#ifndef MIN +# define MIN(a,b) ((a < b) ? a : b) +#endif + +#ifndef MAX +# define MAX(a,b) ((a > b) ? a : b) +#endif + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: procfs_memcpy + * + * Description: + * procfs/ file data may be read by the user with different user buffer + * sizes to receive the data. If the amount of data to be returned is + * large or if the callers receive buffer is small, then multiple read + * operations will be required. + * + * If multiple read operations are required, then each read operation will + * be identical accept that file position (f_pos) will be incremented with + * each read: f_pos must be incremented by the read method after each + * read operation to provide the 'offset' for the next read. + * + * procfs_memcpy() is a helper function. Each read() method should + * provide data in a local data buffer ('src' and 'srclen'). This + * will transfer the data to the user receive buffer ('dest' and 'destlen'), + * respecting both (1) the size of the destination buffer so that it will + * write beyond the user receiver and (1) the file position, 'offset'. + * + * This function will skip over data until the under of bytes specified + * by 'offset' have been skipped. Then it will transfer data from the + * the procfs/ 'src' buffer into the user receive buffer. No more than + * 'destlen' bytes will be transferred. + * + * Input Parameters: + * src - The address of the intermediate procfs/ buffer containing the + * data to be returned. + * srclen - The number of bytes of data in the 'src' buffer + * dest - The address of the user's receive buffer. + * destlen - The size (in bytes) of the user's receive buffer. + * offset - On input, this is the number of bytes to skip before returning + * data; If bytes were skipped, this offset will be decremented. + * Data will not be transferred until this offset decrements to + * zero. + * + * Returned Value: + * The number of bytes actually transferred into the user's receive buffer. + * + ****************************************************************************/ + +size_t procfs_memcpy(FAR const char *src, size_t srclen, + FAR char *dest, size_t destlen, + off_t *offset) +{ + size_t copysize; + size_t lnoffset; + + /* Will this line take us past the offset? */ + + lnoffset = *offset; + if (srclen < lnoffset) + { + /* No... decrement the offset and return without doing anything */ + + *offset -= srclen; + return 0; + } + + /* Handle the remaining offset */ + + srclen -= lnoffset; + dest += lnoffset; + *offset = 0; + + /* Copy the line into the user destination buffer */ + + copysize = MIN(srclen, destlen); + memcpy(dest, src, copysize); + return copysize; +} + +#endif /* !CONFIG_DISABLE_MOUNTPOINT && CONFIG_FS_PROCFS */ diff --git a/include/nuttx/fs/procfs.h b/include/nuttx/fs/procfs.h index ed7c56f185..c5c844c1c0 100644 --- a/include/nuttx/fs/procfs.h +++ b/include/nuttx/fs/procfs.h @@ -134,7 +134,50 @@ extern "C" { #define EXTERN extern #endif -/* Nothing here yet */ +/**************************************************************************** + * Name: procfs_memcpy + * + * Description: + * procfs/ file data may be read by the user with different user buffer + * sizes to receive the data. If the amount of data to be returned is + * large or if the callers receive buffer is small, then multiple read + * operations will be required. + * + * If multiple read operations are required, then each read operation will + * be identical accept that file position (f_pos) will be incremented with + * each read: f_pos must be incremented by the read method after each + * read operation to provide the 'offset' for the next read. + * + * procfs_memcpy() is a helper function. Each read() method should + * provide data in a local data buffer ('src' and 'srclen'). This + * will transfer the data to the user receive buffer ('dest' and 'destlen'), + * respecting both (1) the size of the destination buffer so that it will + * write beyond the user receiver and (1) the file position, 'offset'. + * + * This function will skip over data until the under of bytes specified + * by 'offset' have been skipped. Then it will transfer data from the + * the procfs/ 'src' buffer into the user receive buffer. No more than + * 'destlen' bytes will be transferred. + * + * Input Parameters: + * src - The address of the intermediate procfs/ buffer containing the + * data to be returned. + * srclen - The number of bytes of data in the 'src' buffer + * dest - The address of the user's receive buffer. + * destlen - The size (in bytes) of the user's receive buffer. + * offset - On input, this is the number of bytes to skip before returning + * data; If bytes were skipped, this offset will be decremented. + * Data will not be transferred until this offset decrements to + * zero. + * + * Returned Value: + * The number of bytes actually transferred into the user's receive buffer. + * + ****************************************************************************/ + +size_t procfs_memcpy(FAR const char *src, size_t srclen, + FAR char *dest, size_t destlen, + off_t *offset); #undef EXTERN #ifdef __cplusplus diff --git a/mm/mm_memalign.c b/mm/mm_memalign.c index 03fccc7fd4..a420afe5ee 100644 --- a/mm/mm_memalign.c +++ b/mm/mm_memalign.c @@ -47,6 +47,16 @@ /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ +/* If multiple heaps are used, then the heap must be passed as a parameter to + * mm_malloc(). In the single heap case, mm_malloc() is not available and + * we have to use malloc() (which, internally, will use the same heap). + */ + +#ifdef CONFIG_MM_MULTIHEAP +# define MM_MALLOC(h,s) mm_malloc(h,s) +#else +# define MM_MALLOC(h,s) malloc(s) +#endif /**************************************************************************** * Private Functions @@ -83,7 +93,7 @@ FAR void *mm_memalign(FAR struct mm_heap_s *heap, size_t alignment, if (alignment <= MM_MIN_CHUNK) { - return mm_malloc(heap, size); + return MM_MALLOC(heap, size); } /* Adjust the size to account for (1) the size of the allocated node, (2) @@ -103,7 +113,7 @@ FAR void *mm_memalign(FAR struct mm_heap_s *heap, size_t alignment, /* Then malloc that size */ - rawchunk = (size_t)mm_malloc(heap, allocsize); + rawchunk = (size_t)MM_MALLOC(heap, allocsize); if (rawchunk == 0) { return NULL; diff --git a/mm/mm_realloc.c b/mm/mm_realloc.c index b738648f26..3bf927d9b2 100644 --- a/mm/mm_realloc.c +++ b/mm/mm_realloc.c @@ -49,10 +49,10 @@ /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ -/* If multiple heaps are used, then the heap must be passed as a paramter to - * mm_malloc() and mm_free(). If the single heap case, mm_malloc() and +/* If multiple heaps are used, then the heap must be passed as a parameter to + * mm_malloc() and mm_free(). In the single heap case, mm_malloc() and * mm_free() are not available and we have to use malloc() and free() (which, - * internally will use the same heap). + * internally, will use the same heap). */ #ifdef CONFIG_MM_MULTIHEAP