FreeCalypso > hg > freecalypso-sw
comparison gsm-fw/gpf/osl/os_mem_fl.c @ 397:f5b9c6d63718
os_mem_fl.c: os_CreatePartitionPool() done
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Fri, 13 Jun 2014 19:44:27 +0000 |
parents | c82d093a2b89 |
children | 2dc9f34e3036 |
comparison
equal
deleted
inserted
replaced
396:c82d093a2b89 | 397:f5b9c6d63718 |
---|---|
291 *Buffer = 0; | 291 *Buffer = 0; |
292 return(OS_ERROR); | 292 return(OS_ERROR); |
293 } | 293 } |
294 } | 294 } |
295 } | 295 } |
296 | |
297 GLOBAL LONG | |
298 os_CreatePartitionPool(OS_HANDLE TaskHandle, char *GroupName, void *Addr, | |
299 USHORT Num, ULONG Size, OS_HANDLE *GroupHandle) | |
300 { | |
301 STATUS sts; | |
302 T_OS_PART_POOL *part_group_head, *opool, *npool; | |
303 USHORT part_group; | |
304 USHORT i, j; | |
305 char PoolName[8], *cp; | |
306 | |
307 sts = NU_Obtain_Semaphore(&MemSemCB, NU_SUSPEND); | |
308 j = 0; | |
309 part_group = 0; | |
310 part_group_head = 0; | |
311 for (i = 0; i <= MaxPoolGroups; i++) { | |
312 if (!PartGrpTable[i].grp_head || !PartGrpTable[i].name[0]) { | |
313 part_group = i; | |
314 break; | |
315 } | |
316 if (!strncmp(GroupName, PartGrpTable[i].name, | |
317 RESOURCE_NAMELEN - 1)) { | |
318 part_group_head = PartGrpTable[i].grp_head; | |
319 part_group = i; | |
320 opool = part_group_head; | |
321 j++; | |
322 while (opool->next) { | |
323 opool = opool->next; | |
324 j++; | |
325 } | |
326 break; | |
327 } | |
328 } | |
329 if (part_group > MaxPoolGroups) { | |
330 release_sem_return_err: | |
331 if (sts == NU_SUCCESS) | |
332 NU_Release_Semaphore(&MemSemCB); | |
333 return(OS_ERROR); | |
334 } | |
335 if (!part_group_head) { | |
336 strncpy(PartGrpTable[part_group].name, GroupName, | |
337 RESOURCE_NAMELEN); | |
338 PartGrpTable[part_group].name[RESOURCE_NAMELEN-1] = 0; | |
339 } | |
340 if (os_AllocateMemory(OS_NOTASK, (T_VOID_STRUCT **) &npool, | |
341 sizeof(T_OS_PART_POOL), OS_NO_SUSPEND, | |
342 os_ext_pool_handle) != OS_OK) | |
343 goto release_sem_return_err; | |
344 sprintf(PoolName, "POOL%1d%1d", part_group + 1, j); | |
345 Size &= ~3; | |
346 npool->pool_mem = Addr; | |
347 if (NU_Create_Partition_Pool(&npool->pcb, PoolName, npool->pool_mem, | |
348 POOL_SIZE(Num, Size), Size + 4, NU_FIFO) | |
349 != NU_SUCCESS) | |
350 goto release_sem_return_err; | |
351 if (!part_group_head) | |
352 PartGrpTable[part_group].grp_head = npool; | |
353 else | |
354 opool->next = npool; | |
355 npool->size = Size; | |
356 npool->next = 0; | |
357 *GroupHandle = part_group; | |
358 cp = (char *) npool->pool_mem; | |
359 if (PoolBorder[part_group].Start >= cp) | |
360 PoolBorder[part_group].Start = cp; | |
361 cp += POOL_SIZE(Num, Size); | |
362 if (PoolBorder[part_group].End < cp) | |
363 PoolBorder[part_group].End = cp; | |
364 os_InitPartitionCheck(npool); | |
365 if (sts == NU_SUCCESS) | |
366 NU_Release_Semaphore(&MemSemCB); | |
367 return(OS_OK); | |
368 } |