File indexing completed on 2025-05-11 08:24:15
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
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
0073
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
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
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