pcsl_chunkheap.c
来自「This is a resource based on j2me embedde」· C语言 代码 · 共 161 行
C
161 行
/* * * * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). * * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. *//** * @file * * PCSL chunk memory functions for use by the CLDC Java heap. * * Memory allocated via these methods is manged outside of * the pcls_memory pool. These functions exist to support * the JVM's use of a dynamicly sized Java heap. * * Note: This implementation is based on pcsl_mem_malloc(). If your * platform supports dynamic memory page management, see * ../chunk_mmap/pcsl_chunkmem.c for an example. */#include <pcsl_memory.h>#include <pcsl_print.h>/* * ChunkInfo data structure stores details about allocated memory chunks. */typedef struct _ChunkInfo { void* ptr; void* aligned_start_address; unsigned int cur_size; unsigned int max_size; struct _ChunkInfo *next;} ChunkInfo;static ChunkInfo *chunks = NULL;static ChunkInfo *get_chunk_info(void* chunk_ptr) { ChunkInfo *ci; for (ci = chunks; ci; ci = ci->next) { if (ci->aligned_start_address == chunk_ptr) { return ci; } }#ifdef PCSL_DEBUG /* should not reach here */ pcsl_print("ERROR: get_chunk_info failed to find requested chunk\n");#endif return NULL;}/* * Converts <code>ptr</code> to a multiple of <code>alignment</code> equal * to or greater than <code>ptr</code> */void* align_size_up(void *ptr, unsigned int alignment) { return (void*)(((unsigned int)ptr + alignment - 1) & ~(alignment - 1));}/* * Allocate a memory chunk that can be shrunk, or expanded (up to max_size) * The returned pointer is <alignment>-bytes aligned. * Returns NULL if unsuccessful */void* pcsl_mem_allocate_chunk(unsigned int initial_size, unsigned int max_size, unsigned int alignment){ ChunkInfo *ci; void *ptr; ci = (ChunkInfo*)pcsl_mem_malloc(sizeof(ChunkInfo)); if (ci == NULL) { return NULL; } ptr = pcsl_mem_malloc(max_size + alignment); if (ptr == NULL) { pcsl_mem_free(ci); return NULL; } ci->ptr = ptr; ci->aligned_start_address = align_size_up(ptr, alignment); ci->max_size = max_size; ci->cur_size = initial_size; ci->next = chunks; chunks = ci; return ci->aligned_start_address;} /* * Expand or shrink a chunk returned by allocate_chunk(). * The chunk is never moved. * * Returns 0 if fail to expand (shrink will always succeed). Returns old * size if successful. */unsigned int pcsl_mem_adjust_chunk(void *chunk_ptr, unsigned int new_size){ unsigned int old_size; ChunkInfo* ci = get_chunk_info(chunk_ptr); if (new_size > ci->max_size) {#ifdef PCSL_DEBUG pcsl_print("DEBUG: pcsl_mem_adjust_chunk size check failed\n");#endif return 0; } old_size = ci->cur_size; ci->cur_size = new_size; return old_size;}/* * Free a chunk returned by pcsl_mem_allocate_chunk() */void pcsl_mem_free_chunk(void *chunk_ptr){ ChunkInfo *ci; ChunkInfo *last = NULL; for (ci = chunks; ci; last = ci, ci = ci->next) { if (ci->aligned_start_address == chunk_ptr) { if (last == NULL) { chunks = ci->next; } else { last->next = ci->next; } pcsl_mem_free((void*)ci->ptr); pcsl_mem_free((void*)ci); return; } }#ifdef PCSL_DEBUG /* should not reach here! */ pcsl_print("ERROR: pcsl_free_chunk() could not find the required chunk to free\n");#endif}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?