unit systemunit; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Math; function cpuUtilization: extended; function numCpus: int64; function momentanFreieCpus: int64; function belegterSpeicher: int64; function minCache: int64; function shellSubst(s: string): string; function mkTemp(s: string): string; implementation uses process, lowlevelunit; var _cpuLastUsed,_cpuLastIdle: int64; function cpuUtilization: extended; var procstat: textfile; s: string; used,idle: int64; i: integer; begin result:=0; s:=''; assignfile(procstat,'/proc/stat'); reset(procstat); while not eof(procstat) do begin readln(procstat,s); if pos('cpu ',s)=1 then break; end; closefile(procstat); if pos('cpu ',s)<>1 then exit; delete(s,1,pos(' ',s)); s:=trim(s); used:=0; idle:=0; for i:=0 to 3 do begin used:=used+idle; idle:=strtoint(copy(s,1,pos(' ',s)-1)); delete(s,1,pos(' ',s)); s:=trim(s); end; result:=(used-_cpuLastUsed)/max(1,used-_cpuLastUsed + idle-_cpuLastIdle); _cpuLastUsed:=used; _cpuLastIdle:=idle; end; function numCpus: int64; var procstat: textfile; s: string; begin result:=0; s:=''; assignfile(procstat,'/proc/stat'); reset(procstat); while not eof(procstat) do begin readln(procstat,s); if (pos('cpu',s)=1) and (pos('cpu ',s)<>1) then inc(result); end; closefile(procstat); end; function momentanFreieCpus: int64; begin result:=floor(numCpus*(1-cpuUtilization)); end; function belegterSpeicher: int64; var f: textFile; s: string; begin s:='/proc/'+inttostr(getProcessId)+'/smaps'; result:=0; if not fileexists(s) then exit; assignfile(f,s); reset(f); while not eof(f) do begin readln(f,s); if (leftStr(s,4)='Rss:') and (rightStr(s,3)=' kB') then result:=result+strtoint(trim(copy(s,5,length(s)-4-3))); end; closefile(f); end; function minCache: int64; var f: textFile; s: string; begin s:='/proc/cpuinfo'; result:=0; if not fileexists(s) then exit; assignfile(f,s); reset(f); while not eof(f) do begin readln(f,s); if (leftStr(s,10)='cache size') and (rightStr(s,3)=' kB') then begin delete(s,1,pos(':',s)); delete(s,length(s)-2,3); s:=trim(s); if result=0 then result:=strtoint(s) else result:=min(result,strtoint(s)); end; end; closefile(f); end; function shellSubst(s: string): string; var name: string; begin result:=s; while pos('${',result)>0 do begin s:=leftStr(result,pos('${',result)-1); delete(result,1,pos('${',result)-1+length('${')); name:=leftStr(result,pos('}',result)-1); delete(result,1,length(name+'}')); result:=s+GetEnvironmentVariable(name)+result; end; end; function mkTemp(s: string): string; var args: array of string; begin setlength(args,0); while s<>'' do begin setlength(args,length(args)+1); args[length(args)-1]:=erstesArgument(s); end; result:=''; if not runCommand('/usr/bin/mktemp',args,result) then raise exception.create('Fehler beim Ausführen von ''/usr/bin/mktemp '+s+'''!'); result:=trim(result); end; begin _cpuLastUsed:=0; _cpuLastIdle:=0; cpuUtilization; end.