bool run_test(const char *filename) { printf("----------------------------------\r\n"); printf("----------------------------- TEST %s \r\n", filename); char *buffer = read_file(filename); if (!buffer) exit(1); jshInit(); jsvInit(); jsiInit(false /* do not autoload!!! */); addNativeFunction("quit", nativeQuit); addNativeFunction("interrupt", nativeInterrupt); jsvUnLock(jspEvaluate(buffer, true)); isRunning = true; bool isBusy = true; while (isRunning && (jsiHasTimers() || isBusy)) isBusy = jsiLoop(); JsVar *result = jsvObjectGetChild(execInfo.root, "result", 0/*no create*/); bool pass = jsvGetBool(result); jsvUnLock(result); if (pass) printf("----------------------------- PASS %s\r\n", filename); else { printf("----------------------------------\r\n"); printf("----------------------------- FAIL %s <-------\r\n", filename); jsvTrace(execInfo.root, 0); printf("----------------------------- FAIL %s <-------\r\n", filename); printf("----------------------------------\r\n"); } printf("BEFORE: %d Memory Records Used\r\n", jsvGetMemoryUsage()); // jsvTrace(execInfo.root, 0); jsiKill(); printf("AFTER: %d Memory Records Used\r\n", jsvGetMemoryUsage()); jsvGarbageCollect(); unsigned int unfreed = jsvGetMemoryUsage(); printf("AFTER GC: %d Memory Records Used (should be 0!)\r\n", unfreed); jsvShowAllocated(); jsvKill(); jshKill(); if (unfreed) { printf("FAIL because of unfreed memory.\r\n"); pass = false; } //jsvDottyOutput(); printf("\r\n"); free(buffer); return pass; }
JsVar *jswrap_process_memory() { jsvGarbageCollect(); JsVar *obj = jsvNewWithFlags(JSV_OBJECT); if (obj) { unsigned int history = 0; JsVar *historyVar = jsvObjectGetChild(execInfo.hiddenRoot, JSI_HISTORY_NAME, 0); if (historyVar) { history = (unsigned int)jsvCountJsVarsUsed(historyVar); // vars used to store history jsvUnLock(historyVar); } unsigned int usage = jsvGetMemoryUsage() - history; unsigned int total = jsvGetMemoryTotal(); jsvUnLock(jsvObjectSetChild(obj, "free", jsvNewFromInteger((JsVarInt)(total-usage)))); jsvUnLock(jsvObjectSetChild(obj, "usage", jsvNewFromInteger((JsVarInt)usage))); jsvUnLock(jsvObjectSetChild(obj, "total", jsvNewFromInteger((JsVarInt)total))); jsvUnLock(jsvObjectSetChild(obj, "history", jsvNewFromInteger((JsVarInt)history))); #ifdef ARM jsvUnLock(jsvObjectSetChild(obj, "stackEndAddress", jsvNewFromInteger((JsVarInt)(unsigned int)&_end))); jsvUnLock(jsvObjectSetChild(obj, "flash_start", jsvNewFromInteger((JsVarInt)FLASH_START))); jsvUnLock(jsvObjectSetChild(obj, "flash_binary_end", jsvNewFromInteger((JsVarInt)(unsigned int)&_etext))); jsvUnLock(jsvObjectSetChild(obj, "flash_code_start", jsvNewFromInteger((JsVarInt)FLASH_SAVED_CODE_START))); jsvUnLock(jsvObjectSetChild(obj, "flash_length", jsvNewFromInteger((JsVarInt)FLASH_TOTAL))); #endif } return obj; }
JsVar *jswrap_interface_memory() { jsvGarbageCollect(); JsVar *obj = jsvNewWithFlags(JSV_OBJECT); if (obj) { unsigned int history = 0; JsVar *historyVar = jsvObjectGetChild(jsiGetParser()->root, JSI_HISTORY_NAME, 0); if (historyVar) { history = (unsigned int)jsvCountJsVarsUsed(historyVar); // vars used to store history jsvUnLock(historyVar); } unsigned int usage = jsvGetMemoryUsage() - history; unsigned int total = jsvGetMemoryTotal(); JsVar *v; v = jsvNewFromInteger(total-usage); jsvUnLock(jsvAddNamedChild(obj, v, "free")); jsvUnLock(v); v = jsvNewFromInteger(usage); jsvUnLock(jsvAddNamedChild(obj, v, "usage")); jsvUnLock(v); v = jsvNewFromInteger(total); jsvUnLock(jsvAddNamedChild(obj, v, "total")); jsvUnLock(v); v = jsvNewFromInteger(history); jsvUnLock(jsvAddNamedChild(obj, v, "history")); jsvUnLock(v); #ifdef ARM v = jsvNewFromInteger((JsVarInt)(unsigned int)&_end); jsvUnLock(jsvAddNamedChild(obj, v, "stackEndAddress")); jsvUnLock(v); #endif } return obj; }
/*JSON{ "type" : "staticmethod", "class" : "process", "name" : "memory", "generate" : "jswrap_process_memory", "return" : ["JsVar","Information about memory usage"] } Run a Garbage Collection pass, and return an object containing information on memory usage. * `free` : Memory that is available to be used (in blocks) * `usage` : Memory that has been used (in blocks) * `total` : Total memory (in blocks) * `history` : Memory used for command history - that is freed if memory is low. Note that this is INCLUDED in the figure for 'free' * `gc` : Memory freed during the GC pass * `gctime` : Time taken for GC pass (in milliseconds) * `stackEndAddress` : (on ARM) the address (that can be used with peek/poke/etc) of the END of the stack. The stack grows down, so unless you do a lot of recursion the bytes above this can be used. * `flash_start` : (on ARM) the address of the start of flash memory (usually `0x8000000`) * `flash_binary_end` : (on ARM) the address in flash memory of the end of Espruino's firmware. * `flash_code_start` : (on ARM) the address in flash memory of pages that store any code that you save with `save()`. * `flash_length` : (on ARM) the amount of flash memory this firmware was built for (in bytes). **Note:** Some STM32 chips actually have more memory than is advertised. Memory units are specified in 'blocks', which are around 16 bytes each (depending on your device). See http://www.espruino.com/Performance for more information. **Note:** To find free areas of flash memory, see `require('Flash').getFree()` */ JsVar *jswrap_process_memory() { JsSysTime time1 = jshGetSystemTime(); int gc = jsvGarbageCollect(); JsSysTime time2 = jshGetSystemTime(); JsVar *obj = jsvNewObject(); if (obj) { unsigned int history = 0; JsVar *historyVar = jsvObjectGetChild(execInfo.hiddenRoot, JSI_HISTORY_NAME, 0); if (historyVar) { history = (unsigned int)jsvCountJsVarsUsed(historyVar); // vars used to store history jsvUnLock(historyVar); } unsigned int usage = jsvGetMemoryUsage() - history; unsigned int total = jsvGetMemoryTotal(); jsvObjectSetChildAndUnLock(obj, "free", jsvNewFromInteger((JsVarInt)(total-usage))); jsvObjectSetChildAndUnLock(obj, "usage", jsvNewFromInteger((JsVarInt)usage)); jsvObjectSetChildAndUnLock(obj, "total", jsvNewFromInteger((JsVarInt)total)); jsvObjectSetChildAndUnLock(obj, "history", jsvNewFromInteger((JsVarInt)history)); jsvObjectSetChildAndUnLock(obj, "gc", jsvNewFromInteger((JsVarInt)gc)); jsvObjectSetChildAndUnLock(obj, "gctime", jsvNewFromFloat(jshGetMillisecondsFromTime(time2-time1))); #ifdef ARM extern uint32_t LINKER_END_VAR; // end of ram used (variables) - should be 'void', but 'int' avoids warnings extern uint32_t LINKER_ETEXT_VAR; // end of flash text (binary) section - should be 'void', but 'int' avoids warnings jsvObjectSetChildAndUnLock(obj, "stackEndAddress", jsvNewFromInteger((JsVarInt)(unsigned int)&LINKER_END_VAR)); jsvObjectSetChildAndUnLock(obj, "flash_start", jsvNewFromInteger((JsVarInt)FLASH_START)); jsvObjectSetChildAndUnLock(obj, "flash_binary_end", jsvNewFromInteger((JsVarInt)(unsigned int)&LINKER_ETEXT_VAR)); jsvObjectSetChildAndUnLock(obj, "flash_code_start", jsvNewFromInteger((JsVarInt)FLASH_SAVED_CODE_START)); jsvObjectSetChildAndUnLock(obj, "flash_length", jsvNewFromInteger((JsVarInt)FLASH_TOTAL)); #endif } return obj; }
bool run_test(const char *filename) { printf("----------------------------------\r\n"); printf("----------------------------- TEST %s \r\n", filename); char *buffer = (char *)read_file(filename); if (!buffer) return (false); jshInit(); jsiInit(false /* do not autoload!!! */); jspAddNativeFunction(jsiGetParser(), "function quit()", nativeQuit); jspAddNativeFunction(jsiGetParser(), "function interrupt()", nativeInterrupt); jsvUnLock(jspEvaluate(jsiGetParser(), buffer )); isRunning = true; while (isRunning && jsiHasTimers()) jsiLoop(); JsVar *result = jsvObjectGetChild(jsiGetParser()->root, "result", 0/*no create*/); bool pass = jsvGetBool(result); jsvUnLock(result); if (pass) printf("----------------------------- PASS %s\r\n", filename); else { printf("----------------------------------\r\n"); printf("----------------------------- FAIL %s <-------\r\n", filename); jsvTrace(jsvGetRef(jsiGetParser()->root), 0); printf("----------------------------- FAIL %s <-------\r\n", filename); printf("----------------------------------\r\n"); } printf("BEFORE: %d Memory Records Used\r\n", jsvGetMemoryUsage()); // jsvTrace(jsiGetParser()->root, 0); jsiKill(); printf("AFTER: %d Memory Records Used\r\n", jsvGetMemoryUsage()); jsvGarbageCollect(); printf("AFTER GC: %d Memory Records Used (should be 0!)\r\n", jsvGetMemoryUsage()); jsvShowAllocated(); jshKill(); //jsvDottyOutput(); printf("\r\n"); free(buffer); return pass; }
void jsWarnHeap(char * whereAmI){ jsWarn("%s Heap:%d, jsVars:%d\n",whereAmI,esp_get_free_heap_size(),jsvGetMemoryUsage()); }