From d042018dab0a1850091b3a4fc4ebd6f729320943 Mon Sep 17 00:00:00 2001 From: lunarcleint <88809950+lunarcleint@users.noreply.github.com> Date: Sat, 25 Mar 2023 20:45:22 -0700 Subject: [PATCH] HiddenProccess works + MenoryUtil.getTotalMem() is used --- source/funkin/native/HiddenProcess.hx | 120 ++++++++++++++++++- source/funkin/system/framerate/SystemInfo.hx | 5 +- source/funkin/utils/MemoryUtil.hx | 63 ++-------- source/funkin/windows/WindowsAPI.hx | 12 -- 4 files changed, 128 insertions(+), 72 deletions(-) diff --git a/source/funkin/native/HiddenProcess.hx b/source/funkin/native/HiddenProcess.hx index b765f48e..5b07cf5a 100644 --- a/source/funkin/native/HiddenProcess.hx +++ b/source/funkin/native/HiddenProcess.hx @@ -1,3 +1,121 @@ package funkin.native; -typedef HiddenProcess = sys.io.Process; \ No newline at end of file +#if cpp +/* +* Copyright (C)2005-2019 Haxe Foundation +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +* DEALINGS IN THE SOFTWARE. +*/ + +import cpp.NativeProcess; + +private class Stdin extends haxe.io.Output { + var p:Dynamic; + var buf:haxe.io.Bytes; + + public function new(p:Dynamic) { + this.p = p; + buf = haxe.io.Bytes.alloc(1); + } + + public override function close() { + super.close(); + NativeProcess.process_stdin_close(p); + } + + public override function writeByte(c) { + buf.set(0, c); + writeBytes(buf, 0, 1); + } + + public override function writeBytes(buf:haxe.io.Bytes, pos:Int, len:Int):Int { + try { + return NativeProcess.process_stdin_write(p, buf.getData(), pos, len); + } catch (e:Dynamic) { + throw new haxe.io.Eof(); + } + return 0; + } +} + +private class Stdout extends haxe.io.Input { + var p:Dynamic; + var out:Bool; + var buf:haxe.io.Bytes; + + public function new(p:Dynamic, out) { + this.p = p; + this.out = out; + buf = haxe.io.Bytes.alloc(1); + } + + public override function readByte() { + if (readBytes(buf, 0, 1) == 0) + throw haxe.io.Error.Blocked; + return buf.get(0); + } + + public override function readBytes(str:haxe.io.Bytes, pos:Int, len:Int):Int { + var result:Int; + try { + result = out ? NativeProcess.process_stdout_read(p, str.getData(), pos, len) : NativeProcess.process_stderr_read(p, str.getData(), pos, len); + } catch (e:Dynamic) { + throw new haxe.io.Eof(); + } + if (result == 0) + throw new haxe.io.Eof(); + return result; + } +} + +class HiddenProcess { + var p:Dynamic; + + public var stdout(default, null):haxe.io.Input; + public var stderr(default, null):haxe.io.Input; + public var stdin(default, null):haxe.io.Output; + + public function new(cmd:String, ?args:Array, ?detached:Bool):Void { + if (detached) + throw "Detached process is not supported on this platform"; + p = try NativeProcess.process_run_with_show(cmd, args, 0) catch (e:Dynamic) throw "Process creation failure : " + cmd; + stdin = new Stdin(p); + stdout = new Stdout(p, true); + stderr = new Stdout(p, false); + } + + public function getPid():Int { + return NativeProcess.process_pid(p); + } + + public function exitCode(block:Bool = true):Null { + return NativeProcess.process_exit(p); + } + + public function close():Void { + NativeProcess.process_close(p); + } + + public function kill():Void { + NativeProcess.process_kill(p); + } +} +#else +typedef HiddenProcess = sys.io.Process; +#end \ No newline at end of file diff --git a/source/funkin/system/framerate/SystemInfo.hx b/source/funkin/system/framerate/SystemInfo.hx index 47fb13f9..969cc0cd 100644 --- a/source/funkin/system/framerate/SystemInfo.hx +++ b/source/funkin/system/framerate/SystemInfo.hx @@ -1,6 +1,5 @@ package funkin.system.framerate; -import funkin.windows.WindowsAPI; import funkin.native.HiddenProcess; import funkin.utils.MemoryUtil; @@ -41,9 +40,7 @@ class SystemInfo extends FramerateCategory { } #if cpp - var total = WindowsAPI.getTotalRam(); - trace("Total Ram: " + total); - totalMem = Std.string(total / 1024) + " GB"; + totalMem = Std.string(MemoryUtil.getTotalMem() / 1024) + " GB"; #end memType = MemoryUtil.getMemType(); } diff --git a/source/funkin/utils/MemoryUtil.hx b/source/funkin/utils/MemoryUtil.hx index 855a75eb..d56d60f3 100644 --- a/source/funkin/utils/MemoryUtil.hx +++ b/source/funkin/utils/MemoryUtil.hx @@ -14,21 +14,6 @@ import openfl.system.System; using StringTools; -#if cpp -@:cppFileCode(" -#if defined(HX_WINDOWS) - #include -#endif - -#if defined(HX_MAC) - #include -#endif - -#if defined(HX_LINUX) - #include -#endif -") -#end class MemoryUtil { public static var disableCount:Int = 0; @@ -78,50 +63,18 @@ class MemoryUtil { #end } - #if cpp - @:functionCode(" - #if defined(HX_WINDOWS) - unsigned long long allocatedRAM = 0; - GetPhysicallyInstalledSystemMemory(&allocatedRAM); - return (allocatedRAM / 1024); - #endif - - #if defined(HX_MAC) - int mib [] = { CTL_HW, HW_MEMSIZE }; - int64_t value = 0; - size_t length = sizeof(value); - - if(-1 == sysctl(mib, 2, &value, &length, NULL, 0)) - return -1; // An error occurred - - return value / 1024 / 1024; - #endif - - #if defined(HX_LINUX) - FILE *meminfo = fopen('/proc/meminfo', 'r'); - - if(meminfo == NULL) return -1; - - char line[256]; - while(fgets(line, sizeof(line), meminfo)) - { - int ram; - if(sscanf(line, 'MemTotal: %d kB', &ram) == 1) - { - fclose(meminfo); - return (ram / 1024); - } - } - - fclose(meminfo); - return -1; - #endif - ") public static function getTotalMem():Float { + #if windows + return funkin.native.Windows.getTotalRam(); + #elseif mac + return funkin.native.Mac.getTotalRam(); + #elseif linux + return funkin.native.Linux.getTotalRam(); + #else return 0; + #end } - #end public static inline function currentMemUsage() { #if cpp diff --git a/source/funkin/windows/WindowsAPI.hx b/source/funkin/windows/WindowsAPI.hx index 37feaa24..204e57c9 100644 --- a/source/funkin/windows/WindowsAPI.hx +++ b/source/funkin/windows/WindowsAPI.hx @@ -62,18 +62,6 @@ class WindowsAPI { #end } - public static function getTotalRam() { - #if windows - return Windows.getTotalRam(); - #elseif mac - return Mac.getTotalRam(); - #elseif linux - return Linux.getTotalRam(); - #else - return 0; - #end - } - public static function consoleColorToOpenFL(color:ConsoleColor) { return switch(color) { case BLACK: 0xFF000000;