Err show_heap_info() { Err err; UInt16 numHeaps, numRAMHeaps, version; UInt16 heapNo, heapId; UInt32 free, max, heapSize; Char tmp_text[100], tmp_textd1[100], tmp_textd2[100]; FormPtr form; // Initialize the form. form = FrmInitForm(formID_heap_info); // Initialize the form. if (cardNo > MemNumCards()) { FrmAlert(alertID_no_card); return err; } numHeaps = MemNumHeaps(cardNo-1); StrPrintF(tmp_text, "Num. heaps: %u", numHeaps); show_lab(form, labelID_num_heaps, tmp_text); numRAMHeaps = MemNumRAMHeaps(cardNo-1); StrPrintF(tmp_text, "Num. RAM heaps: %u", numRAMHeaps); show_lab(form, labelID_num_RAM_heaps, tmp_text); for (heapNo=0; heapNo < numHeaps && heapNo < 3; heapNo++) { heapId = MemHeapID(cardNo-1,heapNo); heapSize = MemHeapSize(heapId); err = MemHeapFreeBytes(heapId, &free, &max); if (err) return err; if (heapNo < numRAMHeaps) { StrPrintF(tmp_text, "RAM Heap %d is %s", heapNo, (MemHeapDynamic(heapId))?("dynamic"):("non-dynamic")); StrPrintF(tmp_textd1, "Free: %lu Kb.", free); StrPrintF(tmp_textd2, "Max. chunk: %lu Kb.", max); } else { StrPrintF(tmp_text, "ROM Heap %d", heapNo); StrPrintF(tmp_textd1, "Free: %lu Kb.", free); StrPrintF(tmp_textd2, "Max chunk: %lu Kb.", max); } switch (heapNo) { case 0: show_lab(form, labelID_heap1, tmp_text); show_lab(form, labelID_heap1d1, tmp_textd1); show_lab(form, labelID_heap1d2, tmp_textd2); case 1: show_lab(form, labelID_heap2, tmp_text); show_lab(form, labelID_heap2d1, tmp_textd1); show_lab(form, labelID_heap2d2, tmp_textd2); default: show_lab(form, labelID_heap3, tmp_text); show_lab(form, labelID_heap3d1, tmp_textd1); show_lab(form, labelID_heap3d2, tmp_textd2); } } display_modal_form(form); return err; }
// Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX) wxMemorySize wxGetFreeMemory() { uint32_t freeTotal = 0; uint32_t freeHeap; uint32_t freeChunk; // executed twice: for the dynamic heap, and for the non-secure RAM storage heap for ( uint16_t i = 0; i < POS_MemNumRAMHeaps(); i ++) { status_t err = MemHeapFreeBytes(i, &freeHeap, &freeChunk); if( err != errNone ) return -1; freeTotal+=freeHeap; } return (wxMemorySize)freeTotal; }
Regionpage *mem_ptr_new() { UInt32 free, max; Err err; Regionpage *rp; err = MemHeapFreeBytes(heapId, &free, &max); if (err) panic("mem_ptr_new: MemHeapFreeBytes"); if (max < 5*1024) { // Use storage memory panic("Use storage memory."); rp = NULL; } else { // Use dynamic memory rp = (Regionpage *)MemPtrNew(sizeof(Regionpage)); if (rp == NULL) panic("mem_ptr_new: I cound not allocate more memory"); } return rp; }