Packages
Multi-surface application runtime for Elixir. One TEA module renders to terminal, browser (LiveView), SSH, and MCP (agents). 30+ widgets, flexbox + CSS grid, AI agent runtime, distributed swarm with CRDTs, time-travel debugging, session recording, sandboxed REPL, and agentic commerce.
Current section
Files
Jump to
Current section
Files
lib/raxol/terminal/screen_buffer/memory_utils.ex
defmodule Raxol.Terminal.ScreenBuffer.MemoryUtils do
@moduledoc """
Handles memory usage calculations for the terminal screen buffer.
This module provides utilities for estimating memory consumption of buffer components,
including cells, scrollback, selection state, and other buffer elements.
"""
@doc """
Gets the estimated memory usage of the screen buffer.
"""
def get_memory_usage(%{
cells: cells,
scrollback: scrollback,
selection: selection,
scroll_region: scroll_region,
damage_regions: damage_regions
}) do
# Calculate memory usage for main cells grid
cells_usage = calculate_cells_memory_usage(cells)
# Calculate memory usage for scrollback
scrollback_usage = calculate_cells_memory_usage(scrollback)
# Calculate memory usage for other components
# 4 integers * 8 bytes
selection_usage =
case selection do
nil -> 0
false -> 0
_ -> 32
end
# 2 integers * 8 bytes
scroll_region_usage =
case scroll_region do
nil -> 0
false -> 0
_ -> 16
end
# 4 integers * 8 bytes per region
damage_regions_usage = length(damage_regions) * 32
# Base struct overhead and other fields
# Rough estimate for struct overhead and other fields
base_usage = 256
cells_usage + scrollback_usage + selection_usage + scroll_region_usage +
damage_regions_usage + base_usage
end
# Private helper to calculate memory usage for a grid of cells
defp calculate_cells_memory_usage(cells) when is_list(cells) do
total_cells =
Enum.reduce(cells, 0, fn row, acc ->
acc + length(row)
end)
# Rough estimate: each cell is about 64 bytes (including overhead)
total_cells * 64
end
defp calculate_cells_memory_usage(_), do: 0
end