summaryrefslogtreecommitdiffstats
path: root/testsuites/libtests/malloc04/init.c
blob: 00355dabd449f89430fbdfe6f8006586a343950f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 *  COPYRIGHT (c) 1989-2011.
 *  On-Line Applications Research Corporation (OAR).
 *
 *  The license and distribution terms for this file may be
 *  found in the file LICENSE in this distribution or at
 *  http://www.rtems.com/license/LICENSE.
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <tmacros.h>
#include "test_support.h"
#include <rtems/libcsupport.h>
#include <rtems/malloc.h>
#include <errno.h>

/* configuration information */
/* At top of file to have access to configuration variables */

#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER

#define CONFIGURE_MAXIMUM_TASKS             1
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE

#define CONFIGURE_INIT
#include <rtems/confdefs.h>
/* end of configuration */

#ifndef CONFIGURE_MALLOC_BSP_SUPPORTS_SBRK
void *rtems_heap_null_extend(
  Heap_Control *heap,
  size_t alloc_size
)
{
  return rtems_heap_extend_via_sbrk( heap, alloc_size );
}
#endif

char Malloc_Heap[ 128 ] CPU_STRUCTURE_ALIGNMENT;
int sbrk_count;
Heap_Control TempHeap;

size_t offset;

void * sbrk(ptrdiff_t incr)
{
  void *p = (void *) -1;

  printf( "sbrk(%td)\n", incr );
  if ( sbrk_count == -1 ) {
    p = (void *) (NULL - 2);
  } else if ( offset + incr < sizeof(Malloc_Heap) ) {
     p = &Malloc_Heap[ offset ];
     offset += incr;
  } else {
    if ( sbrk_count == 0 )
      p = (void *) rtems_task_create;
    sbrk_count++;
  }

  sbrk_count++;
  return p;
}

void *p1, *p2, *p3, *p4;

rtems_task Init(
  rtems_task_argument argument
)
{
  Heap_Control *real_heap;
  Heap_Area area;

  sbrk_count = 0;
  offset     = 0;

  puts( "\n\n*** TEST MALLOC 04 ***" );

  /* Safe information on real heap */
  real_heap = malloc_get_heap_pointer();
  malloc_set_heap_pointer( &TempHeap );

  rtems_heap_set_sbrk_amount( 64 );

  puts( "Initialize heap with some memory" );
  offset     = 64;
  sbrk_count = 0;
  area.begin = &Malloc_Heap [0];
  area.size = 64;
  RTEMS_Malloc_Initialize( &area, 1, NULL );
  p1 = malloc(64);
  p2 = malloc(64);
  p3 = malloc(48);
  p4 = malloc(48);
  
  puts( "Initialize heap with some memory - return address out of heap" );
  area.begin = &Malloc_Heap [1];
  area.size = 64;
  RTEMS_Malloc_Initialize( &area, 1, NULL );
  offset     = 64;
  sbrk_count = -1;
  p1 = malloc( 127 );
  rtems_test_assert( p1 == (void *) NULL );
  rtems_test_assert( errno == ENOMEM );
  

  area.begin = &Malloc_Heap [0];
  area.size = 64;
  RTEMS_Malloc_Initialize( &area, 1, NULL );
  puts( "Initialize heap with some unaligned memory" );
  offset     = 65;
  sbrk_count = 0;
  area.begin = &Malloc_Heap [1];
  area.size = 64;
  RTEMS_Malloc_Initialize( &area, 1, NULL );
  p1 = malloc(64);
  p2 = malloc(64);
  p3 = malloc(48);

  /* Restore information on real heap */
  malloc_set_heap_pointer( real_heap );

  puts( "*** END OF TEST MALLOC 04 ***" );

  rtems_test_exit(0);
}

/* end of file */