MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

update rss values to reflect true usage

+70 -23
+52 -2
examples/test262/index.js
··· 58 58 memoryOffset: 0, 59 59 memoryStatus: '', 60 60 memoryStatusAt: 0, 61 + fullClearNextRender: false, 61 62 searchMode: false, 62 63 searchQuery: '' 63 64 }; ··· 123 124 'bytes', 124 125 'cstack', 125 126 'rss', 127 + 'residentSize', 128 + 'physFootprint', 126 129 'virtualSize' 127 130 ]); 128 131 ··· 210 213 return state.memoryCache; 211 214 } 212 215 216 + function hasGcMarkProfileControls() { 217 + return Ant.raw 218 + && typeof Ant.raw.gcMarkProfile === 'function' 219 + && typeof Ant.raw.gcMarkProfileEnable === 'function' 220 + && typeof Ant.raw.gcMarkProfileReset === 'function'; 221 + } 222 + 223 + function toggleGcMarkProfile() { 224 + if (!hasGcMarkProfileControls()) { 225 + setMemoryStatus(`${c.red}GC mark profiler unavailable${c.reset}`); 226 + return false; 227 + } 228 + 229 + const current = Ant.raw.gcMarkProfile(); 230 + const enabled = Ant.raw.gcMarkProfileEnable(!current.enabled); 231 + refreshMemoryCache(); 232 + setMemoryStatus(enabled 233 + ? `${c.green}GC mark profiler enabled${c.reset}` 234 + : `${c.yellow}GC mark profiler disabled${c.reset}`); 235 + return true; 236 + } 237 + 238 + function resetGcMarkProfile() { 239 + if (!hasGcMarkProfileControls()) { 240 + setMemoryStatus(`${c.red}GC mark profiler unavailable${c.reset}`); 241 + return false; 242 + } 243 + 244 + Ant.raw.gcMarkProfileReset(); 245 + refreshMemoryCache(); 246 + setMemoryStatus(`${c.green}GC mark profiler reset${c.reset}`); 247 + return true; 248 + } 249 + 213 250 function memoryStatusText() { 214 251 if (!state.memoryStatus) return ''; 215 252 if (Date.now() - state.memoryStatusAt > 4000) { ··· 361 398 lines.push(' '.repeat(cols)); 362 399 const status = memoryStatusText(); 363 400 lines.push(pad( 364 - `${c.dim}โ†‘โ†“ scroll ยท PgUp/PgDn ยท g/G top/bottom ยท r refresh ยท c copy ยท m browse ยท q quit${c.reset} ${c.dim}[${state.memoryOffset + 1}-${end}/${memoryLines.length}]${c.reset} ${status}${status ? ' ' : ''}${c.cyan}${fps.current} fps${c.reset}`, 401 + `${c.dim}โ†‘โ†“ scroll ยท PgUp/PgDn ยท g/G top/bottom ยท r refresh ยท e profiler ยท R reset profiler ยท c copy ยท m browse ยท q quit${c.reset} ${c.dim}[${state.memoryOffset + 1}-${end}/${memoryLines.length}]${c.reset} ${status}${status ? ' ' : ''}${c.cyan}${fps.current} fps${c.reset}`, 365 402 cols 366 403 )); 367 404 linesArePadded = true; ··· 374 411 if (pendingRender) return; 375 412 fps.update(); 376 413 const screen = buildScreen(); 377 - const ok = process.stdout.write(`${term.syncStart}${term.hideCursor}${term.home}${screen}${term.syncEnd}`); 414 + const clear = state.fullClearNextRender ? term.clearScreen : ''; 415 + state.fullClearNextRender = false; 416 + const ok = process.stdout.write(`${term.syncStart}${term.hideCursor}${term.home}${clear}${screen}${term.syncEnd}`); 378 417 if (!ok) pendingRender = true; 379 418 } 380 419 ··· 503 542 state.mode = 'browse'; 504 543 } else { 505 544 state.mode = 'memory'; 545 + state.fullClearNextRender = true; 506 546 state.memoryOffset = 0; 507 547 refreshMemoryCache(); 508 548 setMemoryStatus(`${c.green}Refreshed memory stats${c.reset}`); ··· 514 554 refreshMemoryCache(); 515 555 setMemoryStatus(`${c.green}Refreshed memory stats${c.reset}`); 516 556 needsRender = true; 557 + } 558 + break; 559 + case 'e': 560 + if (state.mode === 'memory') { 561 + needsRender = toggleGcMarkProfile() || needsRender; 562 + } 563 + break; 564 + case 'R': 565 + if (state.mode === 'memory') { 566 + needsRender = resetGcMarkProfile() || needsRender; 517 567 } 518 568 break; 519 569 case 'c':
+7 -20
examples/tui/index.js
··· 1 - import { 2 - Screen, 3 - List, 4 - ProgressBar, 5 - Input, 6 - Table, 7 - colors, 8 - box, 9 - keys, 10 - codes, 11 - modal, 12 - confirm, 13 - pad, 14 - padCenter, 15 - truncate, 16 - visibleLength 17 - } from './tuey.js'; 1 + import { Screen, List, ProgressBar, Input, colors, box, keys, codes, modal, confirm, pad, padCenter, truncate, visibleLength } from './tuey.js'; 18 2 19 3 const screen = new Screen({ fullscreen: true, hideCursor: true }); 20 4 ··· 386 370 if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(2) + ' KB'; 387 371 return (bytes / 1024 / 1024).toFixed(2) + ' MB'; 388 372 }; 373 + const fmtMaybe = value => (typeof value === 'number' ? fmt(value) : 'n/a'); 389 374 390 375 modal(screen, { 391 376 id: 'memory', 392 377 width: 40, 393 - height: 10, 378 + height: 11, 394 379 title: 'Memory Usage', 395 380 titleStyle: colors.bold + colors.yellow, 396 381 borderStyle: box.rounded, ··· 408 393 buf.writeStyled(ox, oy + y++, ` Pools: ${colors.bold}${fmt(mem.pools.totalUsed)} / ${fmt(mem.pools.totalCapacity)}${codes.reset}`); 409 394 buf.writeStyled(ox, oy + y++, ` Alloc: ${colors.bold}${fmt(mem.alloc.total)}${codes.reset} (${mem.alloc.objectCount} objects)`); 410 395 buf.writeStyled(ox, oy + y++, ` External: ${colors.bold}${fmt(mem.external.total)}${codes.reset}`); 411 - buf.writeStyled(ox, oy + y++, ` RSS: ${colors.bold}${fmt(mem.rss)}${codes.reset}`); 396 + buf.writeStyled(ox, oy + y++, ` RSS: ${colors.bold}${fmtMaybe(mem.rss)}${codes.reset}`); 397 + buf.writeStyled(ox, oy + y++, ` Resident: ${colors.bold}${fmtMaybe(mem.residentSize)}${codes.reset}`); 398 + buf.writeStyled(ox, oy + y++, ` Footprint:${colors.bold}${fmtMaybe(mem.physFootprint)}${codes.reset}`); 412 399 y++; 413 400 414 401 buf.writeStyled(ox, oy + y, colors.dim + ' m/Esc: Close' + codes.reset); ··· 613 600 } 614 601 return false; 615 602 }, 616 - render: (buf, w, h, ox, oy) => { 603 + render: (buf, _w, _h, ox, oy) => { 617 604 buf.writeStyled(ox, oy + 1, ' Name: ' + nameInput.render()); 618 605 buf.writeStyled(ox, oy + 3, colors.dim + ' Enter: Save Esc: Cancel' + codes.reset); 619 606 }
+11 -1
src/modules/builtin.c
··· 319 319 struct mach_task_basic_info info; 320 320 mach_msg_type_number_t count = MACH_TASK_BASIC_INFO_COUNT; 321 321 if (task_info(mach_task_self(), MACH_TASK_BASIC_INFO, (task_info_t)&info, &count) == KERN_SUCCESS) { 322 - js_set(js, result, "rss", js_mknum((double)info.resident_size)); 322 + js_set(js, result, "residentSize", js_mknum((double)info.resident_size)); 323 323 js_set(js, result, "virtualSize", js_mknum((double)info.virtual_size)); 324 + } 325 + 326 + task_vm_info_data_t vm_info; 327 + mach_msg_type_number_t vm_count = TASK_VM_INFO_COUNT; 328 + if (task_info(mach_task_self(), TASK_VM_INFO, (task_info_t)&vm_info, &vm_count) == KERN_SUCCESS) { 329 + js_set(js, result, "rss", js_mknum((double)vm_info.phys_footprint)); 330 + js_set(js, result, "physFootprint", js_mknum((double)vm_info.phys_footprint)); 331 + } else if (vtype(js_get(js, result, "rss")) == T_UNDEF) { 332 + ant_value_t resident = js_get(js, result, "residentSize"); 333 + if (vtype(resident) != T_UNDEF) js_set(js, result, "rss", resident); 324 334 } 325 335 #elif defined(__linux__) 326 336 struct rusage usage;