diff packages/services/memalloc/common/current/src/kapi.cxx @ 115:6ed91473a1cd ecos-sw-2000-08-21

Merge from eCos master repository on 2000-08-21-22:40:54-BST
author jlarmour
date Fri, 25 Aug 2000 17:32:38 +0000
parents
children e0c0827131d1
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/services/memalloc/common/current/src/kapi.cxx
@@ -0,0 +1,349 @@
+//==========================================================================
+//
+//      kapi.cxx
+//
+//      Implementation of kernel C API functions for memory pools
+//
+//==========================================================================
+//####COPYRIGHTBEGIN####
+//                                                                          
+// -------------------------------------------                              
+// The contents of this file are subject to the Red Hat eCos Public License 
+// Version 1.1 (the "License"); you may not use this file except in         
+// compliance with the License.  You may obtain a copy of the License at    
+// http://www.redhat.com/                                                   
+//                                                                          
+// Software distributed under the License is distributed on an "AS IS"      
+// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the 
+// License for the specific language governing rights and limitations under 
+// the License.                                                             
+//                                                                          
+// The Original Code is eCos - Embedded Configurable Operating System,      
+// released September 30, 1998.                                             
+//                                                                          
+// The Initial Developer of the Original Code is Red Hat.                   
+// Portions created by Red Hat are                                          
+// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.                             
+// All Rights Reserved.                                                     
+// -------------------------------------------                              
+//                                                                          
+//####COPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    nickg, dsm, jlarmour
+// Contributors: 
+// Date:         2000-06-12
+// Description:  Implementation of kernel C API functions for memory pools
+// Usage:        
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+// CONFIGURATION
+
+#include <pkgconf/memalloc.h>
+#include <pkgconf/system.h>
+#ifdef CYGPKG_KERNEL
+# include <pkgconf/kernel.h>
+#endif
+
+#ifdef CYGFUN_MEMALLOC_KAPI
+
+// INCLUDES
+
+#include <cyg/infra/cyg_type.h>        // types
+#include <cyg/infra/cyg_ass.h>         // assertion macros
+#include <cyg/infra/cyg_trac.h>        // tracing macros
+#include <cyg/kernel/ktypes.h>         // base kernel types
+
+#include <cyg/memalloc/memvar.hxx>
+#include <cyg/memalloc/memfixed.hxx>
+#include <cyg/memalloc/common.hxx>     // status flags
+
+#include <cyg/kernel/kapi.h>           // C API
+
+// MACROS
+
+#ifdef CYGDBG_USE_ASSERTS
+
+#define CYG_ASSERT_SIZES(cstruct, cxxstruct)                      \
+CYG_MACRO_START                                                   \
+    char *msg = "Size of C struct " #cstruct                      \
+                       " != size of C++ struct " #cxxstruct ;     \
+    CYG_ASSERT( sizeof(cstruct) == sizeof(cxxstruct) , msg );     \
+CYG_MACRO_END
+
+#else
+
+#define CYG_ASSERT_SIZES(cstruct, cxxstruct)
+
+#endif
+
+// FUNCTIONS
+
+// -------------------------------------------------------------------------
+// Magic new function
+
+inline void *operator new(size_t size, void *ptr)
+{
+    CYG_CHECK_DATA_PTR( ptr, "Bad pointer" );
+    return ptr;
+}
+
+/*-----------------------------------------------------------------------*/
+/* Memory pools                                                          */
+
+/* Create a variable size memory pool */
+externC void cyg_mempool_var_create(
+    void            *base,              /* base of memory to use for pool */
+    cyg_int32       size,               /* size of memory in bytes        */
+    cyg_handle_t    *handle,            /* returned handle of memory pool */
+    cyg_mempool_var *var                /* space to put pool structure in */
+    )
+{
+    CYG_ASSERT_SIZES( cyg_mempool_var, Cyg_Mempool_Variable );
+
+    Cyg_Mempool_Variable *t = new((void *)var) Cyg_Mempool_Variable (
+        (cyg_uint8 *)base,
+        size
+    );
+    t=t;
+
+    CYG_CHECK_DATA_PTR( handle, "Bad handle pointer" );
+    *handle = (cyg_handle_t)var;
+}
+
+/* Delete variable size memory pool */
+externC void cyg_mempool_var_delete(cyg_handle_t varpool)
+{
+    ((Cyg_Mempool_Variable *)varpool)->~Cyg_Mempool_Variable();
+}
+
+/* Allocates a block of length size.  This waits if the memory is not
+   currently available.  */
+#ifdef CYGSEM_MEMALLOC_ALLOCATOR_VARIABLE_THREADAWARE
+externC void *cyg_mempool_var_alloc(cyg_handle_t varpool, cyg_int32 size)
+{
+    return ((Cyg_Mempool_Variable *)varpool)->alloc(size);
+}
+
+# ifdef CYGFUN_KERNEL_THREADS_TIMER
+
+/* Allocates a block of length size.  This waits for up to delay
+   ticks, if the memory is not already available.  NULL is returned if
+   no memory is available. */
+externC void *cyg_mempool_var_timed_alloc(
+    cyg_handle_t     varpool,
+    cyg_int32        size,
+    cyg_tick_count_t abstime)
+{
+    return ((Cyg_Mempool_Variable *)varpool)->alloc(size, abstime);
+}
+
+# endif
+#endif
+
+/* Allocates a block of length size.  NULL is returned if no memory is
+   available. */
+externC void *cyg_mempool_var_try_alloc(
+    cyg_handle_t varpool,
+    cyg_int32    size)
+{
+    return ((Cyg_Mempool_Variable *)varpool)->try_alloc(size);
+}
+
+/* Frees memory back into variable size pool. */
+externC void cyg_mempool_var_free(cyg_handle_t varpool, void *p)
+{
+    cyg_bool b;
+    b = ((Cyg_Mempool_Variable *)varpool)->free((cyg_uint8 *)p, 0);
+    CYG_ASSERT( b, "Bad free");
+}
+
+
+/* Returns true if there are any threads waiting for memory in the
+   given memory pool. */
+externC cyg_bool_t cyg_mempool_var_waiting(cyg_handle_t varpool)
+{
+    Cyg_Mempool_Variable *v = (Cyg_Mempool_Variable *)varpool;
+    Cyg_Mempool_Status stat;
+
+    v->get_status( CYG_MEMPOOL_STAT_WAITING, stat );
+    return (stat.waiting != 0);
+}
+
+/* Puts information about a variable memory pool into the structure
+   provided. */
+externC void cyg_mempool_var_get_info(
+    cyg_handle_t varpool,
+    cyg_mempool_info *info)
+{
+    Cyg_Mempool_Variable *v = (Cyg_Mempool_Variable *)varpool;
+    Cyg_Mempool_Status stat;
+
+    v->get_status( CYG_MEMPOOL_STAT_ARENASIZE|
+                   CYG_MEMPOOL_STAT_TOTALFREE|
+                   CYG_MEMPOOL_STAT_ARENABASE|
+                   CYG_MEMPOOL_STAT_ORIGSIZE|
+                   CYG_MEMPOOL_STAT_MAXFREE, stat );
+
+    info->totalmem = stat.arenasize;
+    info->freemem  = stat.totalfree;
+    info->size = stat.origsize;
+    info->base = const_cast<cyg_uint8 *>(stat.arenabase);
+    info->blocksize  = -1;
+    info->maxfree = stat.maxfree;
+}
+
+
+/* Create a fixed size memory pool */
+externC void cyg_mempool_fix_create(
+    void            *base,              // base of memory to use for pool
+    cyg_int32       size,               // size of memory in byte
+    cyg_int32       blocksize,          // size of allocation in bytes
+    cyg_handle_t    *handle,            // handle of memory pool
+    cyg_mempool_fix *fix                // space to put pool structure in
+    )
+{
+    CYG_ASSERT_SIZES( cyg_mempool_fix, Cyg_Mempool_Fixed );
+
+    Cyg_Mempool_Fixed *t = new((void *)fix) Cyg_Mempool_Fixed (
+        (cyg_uint8 *)base,
+        size,
+        blocksize
+    );
+    t=t;
+
+    CYG_CHECK_DATA_PTR( handle, "Bad handle pointer" );
+    *handle = (cyg_handle_t)fix;
+}
+
+/* Delete fixed size memory pool */
+externC void cyg_mempool_fix_delete(cyg_handle_t fixpool)
+{
+    ((Cyg_Mempool_Fixed *)fixpool)->~Cyg_Mempool_Fixed();
+}
+
+#ifdef CYGSEM_MEMALLOC_ALLOCATOR_FIXED_THREADAWARE
+/* Allocates a block.  This waits if the memory is not
+   currently available.  */
+externC void *cyg_mempool_fix_alloc(cyg_handle_t fixpool)
+{
+    return ((Cyg_Mempool_Fixed *)fixpool)->alloc();
+}
+
+# ifdef CYGFUN_KERNEL_THREADS_TIMER
+
+/* Allocates a block.  This waits for up to delay ticks, if the memory
+   is not already available.  NULL is returned if no memory is
+   available. */
+externC void *cyg_mempool_fix_timed_alloc(
+    cyg_handle_t     fixpool,
+    cyg_tick_count_t abstime)
+{
+    return ((Cyg_Mempool_Fixed *)fixpool)->alloc(abstime);
+}
+
+# endif
+#endif
+
+/* Allocates a block.  NULL is returned if no memory is available. */
+externC void *cyg_mempool_fix_try_alloc(cyg_handle_t fixpool)
+{
+    return ((Cyg_Mempool_Fixed *)fixpool)->try_alloc();
+}
+
+/* Frees memory back into fixed size pool. */
+externC void cyg_mempool_fix_free(cyg_handle_t fixpool, void *p)
+{
+    cyg_bool b;
+    b = ((Cyg_Mempool_Fixed *)fixpool)->free((cyg_uint8 *)p);
+    CYG_ASSERT( b, "Bad free");
+}
+
+/* Returns true if there are any threads waiting for memory in the
+   given memory pool. */
+externC cyg_bool_t cyg_mempool_fix_waiting(cyg_handle_t fixpool)
+{
+    Cyg_Mempool_Fixed *f = (Cyg_Mempool_Fixed *)fixpool;
+    Cyg_Mempool_Status stat;
+
+    f->get_status( CYG_MEMPOOL_STAT_WAITING, stat );
+    return (stat.waiting != 0);
+}
+
+/* Puts information about a fixed block memory pool into the structure
+   provided. */
+externC void cyg_mempool_fix_get_info(
+    cyg_handle_t fixpool,
+    cyg_mempool_info *info)
+{
+    Cyg_Mempool_Fixed *f = (Cyg_Mempool_Fixed *)fixpool;
+    Cyg_Mempool_Status stat;
+
+    f->get_status( CYG_MEMPOOL_STAT_ARENASIZE|
+                   CYG_MEMPOOL_STAT_TOTALFREE|
+                   CYG_MEMPOOL_STAT_ARENABASE|
+                   CYG_MEMPOOL_STAT_ORIGSIZE|
+                   CYG_MEMPOOL_STAT_BLOCKSIZE|
+                   CYG_MEMPOOL_STAT_MAXFREE, stat );
+
+    info->totalmem = stat.arenasize;
+    info->freemem  = stat.totalfree;
+    info->size = stat.origsize;
+    info->base = const_cast<cyg_uint8 *>(stat.arenabase);
+    info->blocksize  = stat.blocksize;
+    info->maxfree = stat.maxfree;
+}
+
+// -------------------------------------------------------------------------
+// Check structure sizes.
+// This class and constructor get run automatically in debug versions
+// of the kernel and check that the structures configured in the C
+// code are the same size as the C++ classes they should match.
+
+#ifdef CYGPKG_INFRA_DEBUG
+
+class Cyg_Check_Mem_Structure_Sizes
+{
+    int dummy;
+public:    
+    Cyg_Check_Mem_Structure_Sizes( int x );
+
+};
+
+#define CYG_CHECK_SIZES(cstruct, cxxstruct)                               \
+if( sizeof(cstruct) != sizeof(cxxstruct) )                                \
+{                                                                         \
+    char *fmt = "Size of C struct " #cstruct                              \
+                " != size of C++ struct " #cxxstruct ;                    \
+    CYG_TRACE2(1, fmt, sizeof(cstruct) , sizeof(cxxstruct) );             \
+    fail = true;                                                          \
+    fmt = fmt;                                                            \
+}
+
+Cyg_Check_Mem_Structure_Sizes::Cyg_Check_Mem_Structure_Sizes(int x)
+{
+    cyg_bool fail = false;
+
+    dummy = x+1;
+    
+    CYG_CHECK_SIZES( cyg_mempool_var, Cyg_Mempool_Variable );
+    CYG_CHECK_SIZES( cyg_mempool_fix, Cyg_Mempool_Fixed );
+    
+    CYG_ASSERT( !fail, "Size checks failed");
+}
+
+static Cyg_Check_Mem_Structure_Sizes cyg_memalloc_check_structure_sizes(1);
+
+#endif
+
+// -------------------------------------------------------------------------
+
+
+#endif // ifdef CYGFUN_MEMALLOC_KAPI
+
+// End of kapi.cxx