2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 | File: vsi_mem.c
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 | Copyright 2002 Texas Instruments Berlin, AG
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 | All rights reserved.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 | This file is confidential and a trade secret of Texas
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 | Instruments Berlin, AG
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 | The receipt of or possession of this file does not convey
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 | any rights to reproduce or disclose its contents or to
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 | manufacture, use, or sell anything it may describe, in
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 | whole, or in part, without the specific written consent of
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 | Texas Instruments Berlin, AG.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 +-----------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 | Purpose : This Module defines the virtual system interface part
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 | for the dynamic memory pools.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 +-----------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 #ifndef __VSI_MEM_C__
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 #define __VSI_MEM_C__
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 /*==== INCLUDES ===================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 #include "string.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 #include "typedefs.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 #include "vsi.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 #include "os.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 #include "frm_defs.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 #include "frm_types.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 #include "frm_glob.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 #ifdef NU_DEBUG
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 #include "frame.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 #ifdef MEMORY_SUPERVISION
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 #include "tools.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 /*==== CONSTANTS ==================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 char const *waited_str = "Waited for partition";
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 char const *bigger_str = "Bigger partition allocated than requested";
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 char const *free_str = "Partition Deallocation failed";
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 extern char const *waited_str;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 extern char const *bigger_str;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 extern char const *free_str;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 #ifdef NU_DEBUG
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 extern char const *freed_str;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 /*==== TYPES ======================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 /*==== EXTERNALS ==================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 /* -------------- S H A R E D - BEGIN ---------------- */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 #ifdef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 #pragma data_seg("FRAME_SHARED")
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 #if !defined (_TOOLS_) && !defined (_LINUX_) && !defined (_SOLARIS_)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 extern const T_FRM_PARTITION_GROUP_CONFIG partition_grp_config[];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 /*==== VARIABLES ==================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 char init_partition_memory = DISABLE_PARTITON_INIT;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 char init_partition_pattern = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 T_HANDLE vsi_m_sem_handle = VSI_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 extern char init_partition_memory;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 extern char init_partition_pattern;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 extern T_HANDLE vsi_m_sem_handle;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 #ifdef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 #pragma data_seg()
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 /* -------------- S H A R E D - END ---------------- */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 /*==== FUNCTIONS ==================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 #ifndef RUN_FLASH
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 | PROJECT : GSM-Frame (8415) MODULE : VSI_MEM |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 | STATE : code ROUTINE : vsi_m_new |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 PURPOSE : allocate a partition of a pool defined by the parameter type
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 T_VOID_STRUCT * vsi_m_new (ULONG Size, ULONG type FILE_LINE_TYPE)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 LONG Status;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 T_VOID_STRUCT *prim;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 OS_HANDLE pool;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 T_HANDLE Caller;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 ULONG flags;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 ULONG suspend;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 Caller = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 pool = type & VSI_MEM_POOL_MASK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 flags = type & VSI_MEM_FLAG_MASK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 if ( flags & VSI_MEM_NON_BLOCKING )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 suspend = OS_NO_SUSPEND;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 suspend = OS_SUSPEND;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 Status = os_AllocatePartition ( Caller, &prim, Size, suspend, pool );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 switch ( Status )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 case OS_OK:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 case OS_WAITED:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 #ifdef NU_DEBUG
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 Caller = e_running[os_MyHandle()];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 pf_handle_warning ( OS_SYST_WRN_WAIT_PARTITION, "%s %s, entity %s, Size %d, %s(%d)",
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 syst_wrn, waited_str, pf_TaskTable[Caller].Name, Size FILE_LINE_MACRO_PASSED );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 case OS_ERROR:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 case OS_TIMEOUT:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 if ( !(flags & VSI_MEM_NON_BLOCKING) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 /* fatal error for blocking allocation and 'HISR' caller */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 Caller = e_running[os_MyHandle()];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 vsi_o_assert ( NO_TASK, OS_SYST_ERR_NO_PARTITION FILE_LINE_MACRO_PASSED,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 "No Partition available, entity %s, size %d",
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 pf_TaskTable[Caller].Name, Size );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 return NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 /*lint -e527 suppress Warning -- Unreachable */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 /*lint +e527 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 case OS_ALLOCATED_BIGGER:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 #ifdef NU_DEBUG
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 Caller = e_running[os_MyHandle()];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 pf_handle_warning ( OS_SYST_WRN_BIG_PARTITION, "%s %s, entity %s, Size %d, %s(%d)",
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 syst_wrn, bigger_str, pf_TaskTable[Caller].Name, Size FILE_LINE_MACRO_PASSED );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 default:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 return NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 /*lint -e527 suppress Warning -- Unreachable */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 /*lint +e527 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 prim = prim + PPM_OFFSET;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 if ( init_partition_memory )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 memset( (char*)prim, init_partition_pattern, (unsigned int)Size );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 #ifdef MEMORY_SUPERVISION
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 * Pools registered via vsi_m_register_pool() cannot be handle by the partition supervision. The
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 * id therefor is set to 0, to allow the supervision functions to ignore them.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 if ( pool == DmemGroupHandle )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 /* for primitive vsi_ppm_new() is called after the opc has been entered in the header */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 Caller = e_running[os_MyHandle()];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 vsi_ppm_new ( Caller, Size, (T_PRIM_HEADER*)prim, file, line );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 #endif /* MEMORY_SUPERVISION */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 return prim;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 | PROJECT : GSM-Frame (8415) MODULE : VSI_MEM |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 | STATE : code ROUTINE : vsi_m_new_size |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 PURPOSE : allocate partition and retern partition size
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 T_VOID_STRUCT *vsi_m_new_size ( ULONG size, ULONG type,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 ULONG *partition_size FILE_LINE_TYPE)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 T_FRM_PARTITION_POOL_CONFIG * pool_config;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 T_VOID_STRUCT *prim;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 if ( ( prim = vsi_m_new ( size, type FILE_LINE ) ) != NULL )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 #if defined (_TOOLS_) || defined (_LINUX_) || defined (_SOLARIS_)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 *partition_size = size;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 pool_config = (T_FRM_PARTITION_POOL_CONFIG*)partition_grp_config[PrimGroupHandle].grp_config;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 while ( pool_config != NULL )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 if ( size <= pool_config->part_size )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 *partition_size = pool_config->part_size;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 pool_config++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 return (prim);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227 #ifndef RUN_FLASH
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
228 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230 | PROJECT : GSM-Frame (8415) MODULE : VSI_MEM |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231 | STATE : code ROUTINE : vsi_m_free |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
232 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
234 PURPOSE : deallocate a partition
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
235
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
236 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
237
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
238 int vsi_m_free (T_VOID_STRUCT **Msg FILE_LINE_TYPE)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
239 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
240 T_HANDLE Caller;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 #ifdef MEMORY_SUPERVISION
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 Caller = e_running[os_MyHandle()];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 vsi_ppm_free ( Caller, (T_PRIM_HEADER*)*Msg, file, line );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
245
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246 Caller = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
247 if ( os_DeallocatePartition ( Caller, *Msg - PPM_OFFSET ) != OS_ERROR )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
248 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
249 *Msg = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
250 return VSI_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
251 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
252 #ifdef NU_DEBUG
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
253 Caller = e_running[os_MyHandle()];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
254 pf_handle_warning ( OS_SYST_WRN_FREE_FAILED, "%s %s in %s, %s(%d)",
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
255 syst_wrn, free_str, pf_TaskTable[Caller].Name FILE_LINE_MACRO_PASSED );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
256 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
257 return VSI_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
258 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
259 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
260
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
261 #ifndef RUN_FLASH
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
262 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
263 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
264 | PROJECT : GSM-Frame (8415) MODULE : VSI_MEM |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
265 | STATE : code ROUTINE : vsi_m_cnew |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
266 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
267
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
268 PURPOSE : allocate a memory with reference counter
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
269
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
270 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
271
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
272 T_VOID_STRUCT * vsi_m_cnew (ULONG size, ULONG type FILE_LINE_TYPE)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
273 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
274 T_M_HEADER *mem;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
275 #ifdef MEMORY_SUPERVISION
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
276 T_HANDLE caller;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
277 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
278
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
279 if ( (mem = (T_M_HEADER*)vsi_m_new ( size+sizeof(T_M_HEADER), type FILE_LINE )) != NULL )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
280 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
281 /* set reference counter */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
282 mem->ref_cnt = 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
283 /* set descriptor type */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
284 mem->desc_type = (SHORT)((type & VSI_MEM_DESC_MASK) >> 16);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
285 /* return pointer to user data */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
286 #ifdef MEMORY_SUPERVISION
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
287 caller = e_running[os_MyHandle()];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
288 vsi_ppm_new ( caller, size+sizeof(T_M_HEADER), (T_PRIM_HEADER*)mem, file, line );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
289 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
290 return (T_VOID_STRUCT*)(mem + 1);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
291 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
292 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
293 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
294 return NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
295 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
296
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
297 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
298 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
299
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
300 #ifndef RUN_FLASH
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
301 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
302 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
303 | PROJECT : GSM-Frame (8415) MODULE : VSI_MEM |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
304 | STATE : code ROUTINE : vsi_m_cfree |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
305 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
306
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
307 PURPOSE : allocate a memory with reference counter
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
308
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
309 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
310
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
311 int vsi_m_cfree (T_VOID_STRUCT **ptr FILE_LINE_TYPE)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
312 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
313 T_HANDLE caller = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
314 LONG sts;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
315 T_M_HEADER *mem;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
316
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
317 /* get pointer to start of partition. Here is the reference counter */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
318 mem = (T_M_HEADER*)*ptr - 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
319
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
320 #ifdef NU_DEBUG
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
321 if ( os_is_valid_partition ((T_VOID_STRUCT*)mem) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
322 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
323 /* free to non-partition memory */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
324 caller = e_running[os_MyHandle()];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
325 vsi_o_assert ( NO_TASK, OS_SYST_ERR FILE_LINE_MACRO_PASSED,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
326 "MFREE to non-partition memory, entity %s, ptr 0x%x", pf_TaskTable[caller].Name, *ptr );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
327 return VSI_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
328 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
329 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
330
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
331 sts = os_ObtainSemaphore (caller, vsi_m_sem_handle, OS_SUSPEND);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
332 if ( sts == OS_ERROR || sts == OS_TIMEOUT )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
333 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
334 /* Semaphore invalid or overrun */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
335 caller = e_running[os_MyHandle()];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
336 vsi_o_assert ( NO_TASK, OS_SYST_ERR FILE_LINE_MACRO_PASSED,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
337 "Ref Cnt Semaphore overrun, entity %s", pf_TaskTable[caller].Name );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
338 return VSI_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
339 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
340 if ( mem->ref_cnt <= 0 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
341 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
342 #ifdef NU_DEBUG
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
343 /* partition already freed */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
344 caller = e_running[os_MyHandle()];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
345 pf_handle_warning ( OS_SYST_WRN_MULTIPLE_FREE, "%s %s in %s, %s(%d)",
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
346 syst_wrn, freed_str, pf_TaskTable[caller].Name FILE_LINE_MACRO_PASSED );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
347 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
348 os_ReleaseSemaphore (caller, vsi_m_sem_handle);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
349 return VSI_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
350 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
351 if ( --(mem->ref_cnt) == 0 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
352 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
353 #ifdef _NUCLEUS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
354 #ifdef NU_DEBUG
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
355
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
356 if ( os_PartitionCheck( (ULONG*)mem ) == OS_PARTITION_GUARD_PATTERN_DESTROYED )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
357 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
358 caller = e_running[os_MyHandle()];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
359 os_ReleaseSemaphore (caller, vsi_m_sem_handle);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
360 vsi_o_assert ( caller, OS_SYST_ERR_PCB_PATTERN FILE_LINE_MACRO_PASSED,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
361 "Partition Guard Pattern destroyed (MFREE),Task %s,Partition 0x%x",
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
362 pf_TaskTable[caller].Name, mem );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
363 return VSI_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
364 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
365 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
366 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
367 if (vsi_m_free ( (T_VOID_STRUCT**)&mem FILE_LINE ) != VSI_OK)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
368 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
369 os_ReleaseSemaphore (caller, vsi_m_sem_handle);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
370 return VSI_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
371 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
372
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
373 *ptr=NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
374 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
375 os_ReleaseSemaphore (caller, vsi_m_sem_handle);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
376 return VSI_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
377
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
378 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
379 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
380
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
381 #ifndef RUN_FLASH
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
382 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
383 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
384 | PROJECT : GSM-Frame (8415) MODULE : VSI_MEM |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
385 | STATE : code ROUTINE : vsi_m_cfree |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
386 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
387
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
388 PURPOSE : allocate a memory with reference counter
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
389
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
390 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
391
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
392 int vsi_m_attach (T_VOID_STRUCT *ptr FILE_LINE_TYPE)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
393 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
394 T_HANDLE caller = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
395 LONG sts;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
396 T_M_HEADER *mem;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
397
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
398 /* get pointer to start of partition. Here is the reference counter */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
399 mem = (T_M_HEADER*)ptr - 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
400
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
401 #ifdef NU_DEBUG
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
402 if ( os_is_valid_partition ((T_VOID_STRUCT*)mem) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
403 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
404 /* attach to non-partition memory */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
405 caller = e_running[os_MyHandle()];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
406 vsi_o_assert ( NO_TASK, OS_SYST_ERR FILE_LINE_MACRO_PASSED,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
407 "MATTACH to non-partition memory, entity %s, ptr 0x%x", pf_TaskTable[caller].Name, ptr );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
408 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
409 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
410 sts = os_ObtainSemaphore (caller, vsi_m_sem_handle, OS_SUSPEND);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
411 if ( sts == OS_ERROR || sts == OS_TIMEOUT )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
412 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
413 /* Semaphore invalid or overrun */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
414 caller = e_running[os_MyHandle()];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
415 vsi_o_assert ( NO_TASK, OS_SYST_ERR FILE_LINE_MACRO_PASSED,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
416 "Ref Cnt Semaphore overrun, entity %s", pf_TaskTable[caller].Name );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
417 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
418 if ( mem->ref_cnt <= 0 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
419 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
420 /* attach to non allocated memory */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
421 caller = e_running[os_MyHandle()];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
422 vsi_o_assert ( NO_TASK, OS_SYST_ERR FILE_LINE_MACRO_PASSED,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
423 "MATTACH to free memory, entity %s, ptr 0x%x", pf_TaskTable[caller].Name, ptr );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
424 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
425 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
426 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
427 /* increment reference counter */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
428 mem->ref_cnt++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
429 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
430 os_ReleaseSemaphore (caller, vsi_m_sem_handle);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
431 return VSI_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
432
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
433 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
434 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
435
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
436 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
437 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
438 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
439 | PROJECT : GSM-Frame (8415) MODULE : VSI_MEM |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
440 | STATE : code ROUTINE : vsi_m_status |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
441 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
442
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
443 PURPOSE : retrieve number of used/available partitions
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
444
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
445 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
446
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
447 GLOBAL int vsi_m_status ( T_HANDLE caller, ULONG size, USHORT type, USHORT *free, USHORT *alloc )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
448 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
449 #ifdef _NUCLEUS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
450 OS_HANDLE pool;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
451
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
452 pool = type & VSI_MEM_POOL_MASK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
453
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
454 if ( os_GetPartitionPoolStatus ( size, pool, free, alloc ) == OS_OK )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
455 return VSI_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
456 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
457 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
458 return VSI_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
459 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
460 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
461
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
462 #ifndef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
463 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
464 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
465 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
466 | PROJECT : GSM-Frame (8415) MODULE : VSI_MEM |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
467 | STATE : code ROUTINE : vsi_m_register_pool |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
468 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
469
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
470 PURPOSE : register a new partition pool group to be accessable via VSI
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
471
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
472 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
473
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
474 GLOBAL int vsi_m_register_pool ( char * name, T_HANDLE * pool_gr_id )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
475 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
476 OS_HANDLE pool_gr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
477
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
478 if ( os_GetPartitionGroupHandle (OS_NOTASK, name, &pool_gr) == OS_OK )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
479 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
480 *pool_gr_id = (T_HANDLE)pool_gr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
481 return VSI_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
482 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
483 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
484 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
485 return VSI_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
486 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
487 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
488 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
489 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
490
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
491 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
492 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
493 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
494 | PROJECT : GSM-Frame (8415) MODULE : VSI_MEM |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
495 | STATE : code ROUTINE : vsi_m_init |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
496 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
497
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
498 PURPOSE : retrieve number of used/available partitions
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
499
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
500 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
501
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
502 GLOBAL int vsi_m_init ( char enable_init, char pattern )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
503 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
504
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
505 init_partition_memory = enable_init;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
506 init_partition_pattern = pattern;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
507 os_CreateSemaphore ( 0, (char*)"VSI_MSEM", 1, &vsi_m_sem_handle, 0 );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
508
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
509 return VSI_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
510 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
511 #endif
|