Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:15

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  *  @file
0005  *
0006  *  @brief Malloc Deferred Support
0007  *  @ingroup libcsupport
0008  */
0009 
0010 /*
0011  *  Process free requests deferred because they were from ISR
0012  *  or other critical section.
0013  *
0014  *  COPYRIGHT (c) 1989-2007.
0015  *  On-Line Applications Research Corporation (OAR).
0016  *
0017  * Redistribution and use in source and binary forms, with or without
0018  * modification, are permitted provided that the following conditions
0019  * are met:
0020  * 1. Redistributions of source code must retain the above copyright
0021  *    notice, this list of conditions and the following disclaimer.
0022  * 2. Redistributions in binary form must reproduce the above copyright
0023  *    notice, this list of conditions and the following disclaimer in the
0024  *    documentation and/or other materials provided with the distribution.
0025  *
0026  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0027  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0028  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0029  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0030  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0031  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0032  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0033  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0034  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0035  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0036  * POSSIBILITY OF SUCH DAMAGE.
0037  */
0038 
0039 #ifdef HAVE_CONFIG_H
0040 #include "config.h"
0041 #endif
0042 
0043 #ifdef RTEMS_NEWLIB
0044 #include <stdlib.h>
0045 #include <string.h>
0046 
0047 #include "malloc_p.h"
0048 
0049 #include <rtems/score/sysstate.h>
0050 #include <rtems/score/threaddispatch.h>
0051 
0052 Malloc_System_state _Malloc_System_state( void )
0053 {
0054   System_state_Codes state = _System_state_Get();
0055 
0056   if ( _System_state_Is_up( state ) ) {
0057     if ( _Thread_Dispatch_is_enabled() ) {
0058       return MALLOC_SYSTEM_STATE_NORMAL;
0059     } else {
0060       return MALLOC_SYSTEM_STATE_NO_ALLOCATION;
0061     }
0062   } else if ( _System_state_Is_before_multitasking( state ) ) {
0063     return MALLOC_SYSTEM_STATE_NORMAL;
0064   } else {
0065     return MALLOC_SYSTEM_STATE_NO_PROTECTION;
0066   }
0067 }
0068 
0069 RTEMS_WEAK void _Malloc_Process_deferred_frees( void )
0070 {
0071   /*
0072    * Do nothing by default.  If free() is used by the application, then a
0073    * strong implementation of this function will be provided.
0074    */
0075 }
0076 
0077 void *rtems_heap_allocate_aligned_with_boundary(
0078   size_t    size,
0079   uintptr_t alignment,
0080   uintptr_t boundary
0081 )
0082 {
0083   Heap_Control *heap = RTEMS_Malloc_Heap;
0084   void *p;
0085 
0086   switch ( _Malloc_System_state() ) {
0087     case MALLOC_SYSTEM_STATE_NORMAL:
0088       _RTEMS_Lock_allocator();
0089       _Malloc_Process_deferred_frees();
0090       p = _Heap_Allocate_aligned_with_boundary(
0091         heap,
0092         size,
0093         alignment,
0094         boundary
0095       );
0096       _RTEMS_Unlock_allocator();
0097       break;
0098     case MALLOC_SYSTEM_STATE_NO_PROTECTION:
0099       p = _Heap_Allocate_aligned_with_boundary(
0100         heap,
0101         size,
0102         alignment,
0103         boundary
0104       );
0105       break;
0106     default:
0107       /*
0108        *  Do not attempt to allocate memory if not in correct system state.
0109        */
0110       return NULL;
0111   }
0112 
0113   if ( p == NULL && alignment == 0 && boundary == 0 ) {
0114     p = (*rtems_malloc_extend_handler)( heap, size );
0115   }
0116 
0117   /*
0118    *  If the user wants us to dirty the allocated memory, then do it.
0119    */
0120   if ( p != NULL && rtems_malloc_dirty_helper != NULL )
0121     (*rtems_malloc_dirty_helper)( p, size );
0122 
0123   return p;
0124 }
0125 
0126 void *rtems_malloc( size_t size )
0127 {
0128   if ( size == 0 ) {
0129     return NULL;
0130   }
0131 
0132   return rtems_heap_allocate_aligned_with_boundary( size, 0, 0 );
0133 }
0134 #endif