module Memory::Leak::System

def self.memory_usage(process_id)

@returns [Array(Tuple(Integer, Integer))] The memory usage of the given process IDs.
@parameter process_ids [Array(Integer)] The process IDs to monitor.

Get the memory usage of the given process IDs.
def self.memory_usage(process_id)
	IO.popen(["ps", "-o", "rss=", "-p", process_id.to_s]) do |io|
		return io.read.to_i * 1024
	end
end

def self.memory_usages(process_ids)

@returns [Array(Tuple(Integer, Integer))] The memory usage of the given process IDs.
@parameter process_ids [Array(Integer)] The process IDs to monitor.

Get the memory usage of the given process IDs.
def self.memory_usages(process_ids)
	return to_enum(__method__, process_ids) unless block_given?
	
	if process_ids.any?
		IO.popen(["ps", "-o", "pid=,rss=", "-p", process_ids.join(",")]) do |io|
			io.each_line.map(&:split).each do |process_id, size|
				yield process_id.to_i, size.to_i * 1024
			end
		end
	end
end

def self.total_memory_size

@returns [Integer] The total memory size in bytes.
def self.total_memory_size
	File.foreach("/proc/meminfo") do |line|
		if /MemTotal:\s*(?<total>\d+)\s*kB/ =~ line
			return total.to_i * 1024
		end
	end
end

def self.total_memory_size

@returns [Integer] The total memory size in bytes.
def self.total_memory_size
	IO.popen(["sysctl", "hw.memsize"], "r") do |io|
		io.each_line do |line|
			if /hw.memsize:\s*(?<total>\d+)/ =~ line
				return total.to_i
			end
		end
	end
end