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 }