This commit is contained in:
Pavel 2022-12-02 22:37:45 +03:00
parent 3e52a4c912
commit 8af26489c3
6 changed files with 143 additions and 81 deletions

View File

@ -149,6 +149,11 @@ begin
if (a>b) then Result:=a else Result:=b; if (a>b) then Result:=a else Result:=b;
end; end;
function Min(a,b:QWORD):QWORD; inline;
begin
if (a<b) then Result:=a else Result:=b;
end;
// //
Function TDirectAdrNode.GetOffset:QWORD; Function TDirectAdrNode.GetOffset:QWORD;
@ -303,7 +308,7 @@ begin
end; end;
C_LE:if ((rkey.Offset+rkey.Size)<=cmp) then Exit; C_LE:if ((rkey.Offset+rkey.Size)<=cmp) then Exit;
C_BE:if (rkey.Offset<=cmp) then Exit; C_BE:if (rkey.Offset>=cmp) then Exit;
else else
Exit; Exit;
@ -669,16 +674,17 @@ var
begin begin
Result:=False; Result:=False;
FEndN:=Offset+Size;
if _FetchNode_m(M_LE or C_LE,Offset,key) then if _FetchNode_m(M_LE or C_LE,Offset,key) then
begin begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(Offset,Size,key); _Devide(Offset,Size,key);
Result:=True; Result:=True;
end else end else
if _FetchNode_m(M_BE or C_BE,(Offset+Size),key) then if _FetchNode_m(M_BE or C_BE,FEndN,key) then
begin begin
FEndN:=Offset+Size; FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
@ -706,7 +712,7 @@ var
Assert(FSize<>0); Assert(FSize<>0);
Offset:=Offset+FSize; Offset:=Offset+FSize;
Size :=Size -FSize; Size :=Size -Min(FSize,Size);
end; end;
function _skip:Boolean; //inline; function _skip:Boolean; //inline;
@ -722,7 +728,7 @@ var
Assert(FSize<>0); Assert(FSize<>0);
Offset:=Offset+FSize; Offset:=Offset+FSize;
Size :=Size -FSize; Size :=Size -Min(FSize,Size);
end; end;
begin begin
@ -780,18 +786,18 @@ var
begin begin
Result:=False; Result:=False;
FEndN:=Offset+Size;
if _FetchNode_m(M_LE or C_LE,Offset,key) then if _FetchNode_m(M_LE or C_LE,Offset,key) then
begin begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(Offset,Size,key); _Devide(Offset,Size,key);
Result:=True; Result:=True;
end else end else
if _FetchNode_m(M_BE or C_BE,(Offset+Size),key) then if _FetchNode_m(M_BE or C_BE,FEndN,key) then
begin begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(key.Offset,FEndN-key.Offset,key); _Devide(key.Offset,FEndN-key.Offset,key);
@ -822,7 +828,7 @@ var
addr :=ia(addr,FSize); addr :=ia(addr,FSize);
Offset:=Offset+FSize; Offset:=Offset+FSize;
Size :=Size -FSize; Size :=Size -Min(FSize,Size);
end; end;
function _skip:Boolean; //inline; function _skip:Boolean; //inline;
@ -839,7 +845,7 @@ var
addr :=ia(addr,FSize); addr :=ia(addr,FSize);
Offset:=Offset+FSize; Offset:=Offset+FSize;
Size :=Size -FSize; Size :=Size -Min(FSize,Size);
end; end;
begin begin
@ -882,18 +888,18 @@ var
begin begin
Result:=False; Result:=False;
FEndN:=Offset+Size;
if _FetchNode_m(M_LE or C_LE,Offset,key) then if _FetchNode_m(M_LE or C_LE,Offset,key) then
begin begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(Offset,Size,key); _Devide(Offset,Size,key);
Result:=True; Result:=True;
end else end else
if _FetchNode_m(M_BE or C_BE,(Offset+Size),key) then if _FetchNode_m(M_BE or C_BE,FEndN,key) then
begin begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(key.Offset,FEndN-key.Offset,key); _Devide(key.Offset,FEndN-key.Offset,key);
@ -917,7 +923,7 @@ var
Assert(FSize<>0); Assert(FSize<>0);
Offset:=Offset+FSize; Offset:=Offset+FSize;
Size :=Size -FSize; Size :=Size -Min(FSize,Size);
end; end;
function _skip:Boolean; //inline; function _skip:Boolean; //inline;
@ -933,7 +939,7 @@ var
Assert(FSize<>0); Assert(FSize<>0);
Offset:=Offset+FSize; Offset:=Offset+FSize;
Size :=Size -FSize; Size :=Size -Min(FSize,Size);
end; end;
begin begin

View File

@ -195,7 +195,7 @@ begin
end; end;
C_LE:if ((rkey.Offset+rkey.Size)<=cmp) then Exit; C_LE:if ((rkey.Offset+rkey.Size)<=cmp) then Exit;
C_BE:if (rkey.Offset<=cmp) then Exit; C_BE:if (rkey.Offset>=cmp) then Exit;
else else
Exit; Exit;
@ -283,18 +283,18 @@ var
begin begin
Result:=False; Result:=False;
FEndN:=Offset+Size;
if _FetchNode_m(M_LE or C_LE,Offset,key) then if _FetchNode_m(M_LE or C_LE,Offset,key) then
begin begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(Offset,Size,key); _Devide(Offset,Size,key);
Result:=True; Result:=True;
end else end else
if _FetchNode_m(M_BE or C_BE,(Offset+Size),key) then if _FetchNode_m(M_BE or C_BE,FEndN,key) then
begin begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(key.Offset,FEndN-key.Offset,key); _Devide(key.Offset,FEndN-key.Offset,key);
@ -318,7 +318,7 @@ var
Assert(FSize<>0); Assert(FSize<>0);
Offset:=Offset+FSize; Offset:=Offset+FSize;
Size :=Size -FSize; Size :=Size -Min(FSize,Size);
end; end;
begin begin

View File

@ -180,7 +180,7 @@ type
Function Protect(Offset:Pointer;Size:QWORD;prot:Integer):Integer; Function Protect(Offset:Pointer;Size:QWORD;prot:Integer):Integer;
Function Mtypeprotect(Offset:Pointer;Size:QWORD;mtype,prot:Integer):Integer; Function Mtypeprotect(Offset:Pointer;Size:QWORD;mtype,prot:Integer):Integer;
Function Release(Offset:Pointer;Size:QWORD):Integer; Function Release(Offset:Pointer;Size:QWORD;inher:Boolean):Integer;
Function Query(Offset:Pointer;next:Boolean;var ROut:TVirtualAdrNode):Integer; Function Query(Offset:Pointer;next:Boolean;var ROut:TVirtualAdrNode):Integer;
Function QueryProt(Offset:Pointer;var ROut:TVirtualAdrNode):Integer; Function QueryProt(Offset:Pointer;var ROut:TVirtualAdrNode):Integer;
@ -699,7 +699,7 @@ begin
end; end;
C_LE:if ((rkey.Offset+rkey.Size)<=cmp) then Exit; C_LE:if ((rkey.Offset+rkey.Size)<=cmp) then Exit;
C_BE:if (rkey.Offset<=cmp) then Exit; C_BE:if (rkey.Offset>=cmp) then Exit;
else else
Exit; Exit;
@ -933,18 +933,18 @@ var
begin begin
Result:=False; Result:=False;
FEndN:=Offset+Size;
if _FetchNode_m(M_LE or C_LE,Offset,key) then if _FetchNode_m(M_LE or C_LE,Offset,key) then
begin begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(Offset,Size,key); _Devide(Offset,Size,key);
Result:=True; Result:=True;
end else end else
if _FetchNode_m(M_BE or C_BE,(Offset+Size),key) then if _FetchNode_m(M_BE or C_BE,FEndN,key) then
begin begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(key.Offset,FEndN-key.Offset,key); _Devide(key.Offset,FEndN-key.Offset,key);
@ -956,7 +956,12 @@ var
function _map:Boolean; function _map:Boolean;
begin begin
Result:=False; Result:=False;
Assert(key.Size<>0);
if (key.Size=0) then
begin
if (FEndO>=FEndN) then Exit(True);
Exit;
end;
//new save //new save
key.block:=block; key.block:=block;
@ -985,7 +990,23 @@ var
Assert(FSize<>0); Assert(FSize<>0);
Offset:=Offset+FSize; Offset:=Offset+FSize;
Size :=Size -FSize; Size :=Size -Min(FSize,Size);
end;
function _skip:Boolean; //inline;
begin
Result:=False;
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size;
if (FEndO>=FEndN) then Exit(True);
FSize:=FEndO-Offset;
if (FSize=0) then FSize:=PHYSICAL_PAGE_SIZE;
Offset:=Offset+FSize;
Size :=Size -Min(FSize,Size);
end; end;
begin begin
@ -1000,7 +1021,7 @@ begin
if _map then Break; if _map then Break;
end else end else
begin begin
Break; if _skip then Break;
end; end;
until false; until false;
@ -1017,18 +1038,18 @@ var
begin begin
Result:=False; Result:=False;
FEndN:=Offset+Size;
if _FetchNode_m(M_LE or C_LE,Offset,key) then if _FetchNode_m(M_LE or C_LE,Offset,key) then
begin begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(Offset,Size,key); _Devide(Offset,Size,key);
Result:=True; Result:=True;
end else end else
if _FetchNode_m(M_BE or C_BE,(Offset+Size),key) then if _FetchNode_m(M_BE or C_BE,FEndN,key) then
begin begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(key.Offset,FEndN-key.Offset,key); _Devide(key.Offset,FEndN-key.Offset,key);
@ -1059,7 +1080,7 @@ var
addr :=addr +FSize; addr :=addr +FSize;
Offset:=Offset+FSize; Offset:=Offset+FSize;
Size :=Size -FSize; Size :=Size -Min(FSize,Size);
end; end;
begin begin
@ -1091,18 +1112,18 @@ var
begin begin
Result:=False; Result:=False;
FEndN:=Offset+Size;
if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then
begin begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(Offset,Size,key); _Devide(Offset,Size,key);
Result:=True; Result:=True;
end else end else
if _FetchNode_m(M_BE or C_FR or C_BE,(Offset+Size),key) then if _FetchNode_m(M_BE or C_FR or C_BE,FEndN,key) then
begin begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(key.Offset,FEndN-key.Offset,key); _Devide(key.Offset,FEndN-key.Offset,key);
@ -1133,7 +1154,7 @@ var
Assert(FSize<>0); Assert(FSize<>0);
Offset:=Offset+FSize; Offset:=Offset+FSize;
Size :=Size -FSize; Size :=Size -Min(FSize,Size);
end; end;
function _skip:Boolean; //inline; function _skip:Boolean; //inline;
@ -1149,7 +1170,7 @@ var
Assert(FSize<>0); Assert(FSize<>0);
Offset:=Offset+FSize; Offset:=Offset+FSize;
Size :=Size -FSize; Size :=Size -Min(FSize,Size);
end; end;
begin begin
@ -1180,7 +1201,7 @@ begin
until false; until false;
//Test; Test;
end; end;
Function TVirtualManager.check_fixed(Offset:Pointer;Size:QWORD;flags,fd:Integer):Integer; Function TVirtualManager.check_fixed(Offset:Pointer;Size:QWORD;flags,fd:Integer):Integer;
@ -1284,18 +1305,18 @@ var
begin begin
Result:=False; Result:=False;
FEndN:=Offset+ASize;
if _FetchNode_m(M_LE or C_LE,Offset,key) then if _FetchNode_m(M_LE or C_LE,Offset,key) then
begin begin
FEndN:=Offset+ASize;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(Offset,ASize,key); _Devide(Offset,ASize,key);
Result:=True; Result:=True;
end else end else
if _FetchNode_m(M_BE or C_BE,(Offset+ASize),key) then if _FetchNode_m(M_BE or C_BE,FEndN,key) then
begin begin
FEndN:=Offset+ASize;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(key.Offset,FEndN-key.Offset,key); _Devide(key.Offset,FEndN-key.Offset,key);
@ -1332,8 +1353,8 @@ var
addr :=ia(_addres,addr,FSize); addr :=ia(_addres,addr,FSize);
Offset:=Offset+FSize; Offset:=Offset+FSize;
ASize :=ASize -FSize; ASize :=ASize -Min(FSize,ASize);
Size :=Size -FSize; Size :=Size -Min(FSize,Size);
end; end;
function _remap:Boolean; function _remap:Boolean;
@ -1368,8 +1389,8 @@ var
addr :=ia(_addres,addr,FSize); addr :=ia(_addres,addr,FSize);
Offset:=Offset+FSize; Offset:=Offset+FSize;
ASize :=ASize -FSize; ASize :=ASize -Min(FSize,ASize);
Size :=Size -FSize; Size :=Size -Min(FSize,Size);
end; end;
begin begin
@ -1416,7 +1437,7 @@ begin
Result:=check_fixed(Offset,Size,flags,fd); Result:=check_fixed(Offset,Size,flags,fd);
if (Result<>0) then Exit; if (Result<>0) then Exit;
//Test; Test;
repeat repeat
@ -1549,7 +1570,7 @@ begin
until false; until false;
//Test; Test;
if (Result=0) then if (Result=0) then
begin begin
@ -1567,18 +1588,18 @@ var
begin begin
Result:=False; Result:=False;
FEndN:=Offset+Size;
if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then
begin begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(Offset,Size,key); _Devide(Offset,Size,key);
Result:=True; Result:=True;
end else end else
if _FetchNode_m(M_BE or C_FR or C_BE,(Offset+Size),key) then if _FetchNode_m(M_BE or C_FR or C_BE,FEndN,key) then
begin begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(key.Offset,FEndN-key.Offset,key); _Devide(key.Offset,FEndN-key.Offset,key);
@ -1612,7 +1633,7 @@ var
Assert(FSize<>0); Assert(FSize<>0);
Offset:=Offset+FSize; Offset:=Offset+FSize;
Size :=Size -FSize; Size :=Size -Min(FSize,Size);
end; end;
function _skip:Boolean; //inline; function _skip:Boolean; //inline;
@ -1628,7 +1649,7 @@ var
Assert(FSize<>0); Assert(FSize<>0);
Offset:=Offset+FSize; Offset:=Offset+FSize;
Size :=Size -FSize; Size :=Size -Min(FSize,Size);
end; end;
begin begin
@ -1670,7 +1691,7 @@ begin
until false; until false;
//Test; Test;
end; end;
Function TVirtualManager.Mtypeprotect(Offset:Pointer;Size:QWORD;mtype,prot:Integer):Integer; Function TVirtualManager.Mtypeprotect(Offset:Pointer;Size:QWORD;mtype,prot:Integer):Integer;
@ -1683,18 +1704,18 @@ var
begin begin
Result:=False; Result:=False;
FEndN:=Offset+Size;
if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then
begin begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(Offset,Size,key); _Devide(Offset,Size,key);
Result:=True; Result:=True;
end else end else
if _FetchNode_m(M_BE or C_FR or C_BE,(Offset+Size),key) then if _FetchNode_m(M_BE or C_FR or C_BE,FEndN,key) then
begin begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(key.Offset,FEndN-key.Offset,key); _Devide(key.Offset,FEndN-key.Offset,key);
@ -1733,7 +1754,7 @@ var
Assert(FSize<>0); Assert(FSize<>0);
Offset:=Offset+FSize; Offset:=Offset+FSize;
Size :=Size -FSize; Size :=Size -Min(FSize,Size);
end; end;
function _skip:Boolean; //inline; function _skip:Boolean; //inline;
@ -1749,7 +1770,7 @@ var
Assert(FSize<>0); Assert(FSize<>0);
Offset:=Offset+FSize; Offset:=Offset+FSize;
Size :=Size -FSize; Size :=Size -Min(FSize,Size);
end; end;
begin begin
@ -1765,7 +1786,7 @@ begin
Offset:=FEndO; Offset:=FEndO;
Size:=AlignUp(Size,PHYSICAL_PAGE_SIZE); Size:=AlignUp(Size,PHYSICAL_PAGE_SIZE);
//Test; Test;
repeat repeat
@ -1791,10 +1812,10 @@ begin
until false; until false;
//Test; Test;
end; end;
Function TVirtualManager.Release(Offset:Pointer;Size:QWORD):Integer; Function TVirtualManager.Release(Offset:Pointer;Size:QWORD;inher:Boolean):Integer;
var var
key:TVirtualAdrNode; key:TVirtualAdrNode;
FEndN,FEndO:Pointer; FEndN,FEndO:Pointer;
@ -1805,18 +1826,18 @@ var
begin begin
Result:=False; Result:=False;
FEndN:=Offset+Size;
if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then
begin begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(Offset,Size,key); _Devide(Offset,Size,key);
Result:=True; Result:=True;
end else end else
if _FetchNode_m(M_BE or C_FR or C_BE,(Offset+Size),key) then if _FetchNode_m(M_BE or C_FR or C_BE,FEndN,key) then
begin begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size; FEndO:=key.Offset+key.Size;
_Devide(key.Offset,FEndN-key.Offset,key); _Devide(key.Offset,FEndN-key.Offset,key);
@ -1835,7 +1856,13 @@ var
if (key.F.direct<>0) then if (key.F.direct<>0) then
begin begin
err:=_UnmapDirect(key.addr,key.Size); if inher then
begin
err:=0;
end else
begin
err:=_UnmapDirect(key.addr,key.Size);
end;
if (err<>0) then Exit; if (err<>0) then Exit;
end; end;
@ -1888,7 +1915,7 @@ var
Assert(FSize<>0); Assert(FSize<>0);
Offset:=Offset+FSize; Offset:=Offset+FSize;
Size :=Size -FSize; Size :=Size -Min(FSize,Size);
end; end;
function _skip:Boolean; //inline; function _skip:Boolean; //inline;
@ -1904,7 +1931,7 @@ var
Assert(FSize<>0); Assert(FSize<>0);
Offset:=Offset+FSize; Offset:=Offset+FSize;
Size :=Size -FSize; Size :=Size -Min(FSize,Size);
end; end;
begin begin
@ -1918,10 +1945,12 @@ begin
Offset:=FEndO; Offset:=FEndO;
Size:=AlignUp(Size,PHYSICAL_PAGE_SIZE); Size:=AlignUp(Size,PHYSICAL_PAGE_SIZE);
//Test; Test;
repeat repeat
Test;
key:=Default(TVirtualAdrNode); key:=Default(TVirtualAdrNode);
key.IsFree:=False; key.IsFree:=False;
key.Offset:=Offset; key.Offset:=Offset;
@ -1958,7 +1987,7 @@ begin
until false; until false;
//Test; Test;
end; end;
Function TVirtualManager.Query(Offset:Pointer;next:Boolean;var ROut:TVirtualAdrNode):Integer; Function TVirtualManager.Query(Offset:Pointer;next:Boolean;var ROut:TVirtualAdrNode):Integer;
@ -1968,7 +1997,7 @@ var
begin begin
Result:=0; Result:=0;
//Test; Test;
if (Offset>Fhi) then Exit(EINVAL); if (Offset>Fhi) then Exit(EINVAL);
@ -2019,7 +2048,7 @@ var
begin begin
Result:=0; Result:=0;
//Test; Test;
if (Offset>Fhi) then Exit(EINVAL); if (Offset>Fhi) then Exit(EINVAL);
@ -2116,6 +2145,16 @@ begin
begin begin
key:=It.Item^; key:=It.Item^;
if (key.block<>nil) then
begin
if (key.Offset< key.block^.Offset) or
(key.Offset>=key.block^.Offset+key.block^.Size) then
begin
Writeln(HexStr(key.Offset),':',HexStr(key.block^.Offset));
Assert(false);
end;
end;
if (prev<>nil) then if (prev<>nil) then
begin begin
curr:=key.Offset; curr:=key.Offset;
@ -2132,6 +2171,21 @@ begin
end; end;
end; end;
const
pt_r:array[boolean] of AnsiChar=('_','R');
pt_w:array[boolean] of AnsiChar=('_','W');
pt_e:array[boolean] of AnsiChar=('_','E');
function _prot_str(prot:Integer):RawByteString;
begin
Result:=pt_r[prot and PROT_READ <>0]+
pt_w[prot and PROT_WRITE<>0]+
pt_e[prot and PROT_EXEC <>0]+
':'+
pt_r[prot and PROT_GPU_READ <>0]+
pt_w[prot and PROT_GPU_WRITE<>0];
end;
procedure TVirtualManager.Print; procedure TVirtualManager.Print;
var var
key:TVirtualAdrNode; key:TVirtualAdrNode;
@ -2146,7 +2200,9 @@ begin
HexStr(QWORD(key.Offset+key.Size),11),':', HexStr(QWORD(key.Offset+key.Size),11),':',
HexStr(key.Size,11),'#', HexStr(key.Size,11),'#',
HexStr(qword(key.addr),11),'#', HexStr(qword(key.addr),11),'#',
_alloc_str(key),'#'); _alloc_str(key),'#',
_prot_str(key.F.prot)
);
It.Next; It.Next;
end; end;

View File

@ -865,7 +865,7 @@ end;
function __munmap(addr:Pointer;len:size_t):Integer; function __munmap(addr:Pointer;len:size_t):Integer;
begin begin
Result:=VirtualManager.Release(addr,len); Result:=VirtualManager.Release(addr,len,True);
if (Result=0) then if (Result=0) then
begin begin
@ -890,7 +890,7 @@ begin
_sig_lock; _sig_lock;
rwlock_wrlock(MMLock); //rw rwlock_wrlock(MMLock); //rw
Result:=VirtualManager.Release(addr,len); Result:=VirtualManager.Release(addr,len,False);
if (Result=0) then if (Result=0) then
begin begin

View File

@ -741,8 +741,8 @@ begin
Result:=0; Result:=0;
Case state of Case state of
PTHREAD_CANCEL_DISABLE:Writeln('PTHREAD_CANCEL_DISABLE'); PTHREAD_CANCEL_DISABLE:{Writeln('PTHREAD_CANCEL_DISABLE')};
PTHREAD_CANCEL_ENABLE :Writeln('PTHREAD_CANCEL_ENABLE'); PTHREAD_CANCEL_ENABLE :{Writeln('PTHREAD_CANCEL_ENABLE')};
else else
Exit(EINVAL); Exit(EINVAL);
end; end;

View File

@ -96,12 +96,12 @@ const
function _isgpu(prot:Integer):Boolean; inline; function _isgpu(prot:Integer):Boolean; inline;
begin begin
Result:=prot and (SCE_KERNEL_PROT_GPU_READ or SCE_KERNEL_PROT_GPU_WRITE)<>0; Result:=prot and (PROT_GPU_READ or PROT_GPU_WRITE)<>0;
end; end;
function _iswrite(prot:Integer):Boolean; inline; function _iswrite(prot:Integer):Boolean; inline;
begin begin
Result:=prot and (PROT_WRITE or SCE_KERNEL_PROT_GPU_WRITE)<>0; Result:=prot and (PROT_WRITE or PROT_GPU_WRITE)<>0;
end; end;
function __map_prot_page(prot:Integer):DWORD; function __map_prot_page(prot:Integer):DWORD;
@ -111,11 +111,11 @@ begin
if (prot and PROT_EXEC)<>0 then if (prot and PROT_EXEC)<>0 then
begin begin
if (prot and (PROT_WRITE or SCE_KERNEL_PROT_GPU_WRITE))<>0 then if (prot and (PROT_WRITE or PROT_GPU_WRITE))<>0 then
begin begin
Result:=PAGE_EXECUTE_READWRITE; Result:=PAGE_EXECUTE_READWRITE;
end else end else
if (prot and (PROT_READ or SCE_KERNEL_PROT_GPU_READ))<>0 then if (prot and (PROT_READ or PROT_GPU_READ))<>0 then
begin begin
Result:=PAGE_EXECUTE_READ; Result:=PAGE_EXECUTE_READ;
end else end else
@ -123,7 +123,7 @@ begin
Result:=PAGE_EXECUTE; Result:=PAGE_EXECUTE;
end; end;
end else end else
if (prot and (PROT_WRITE or SCE_KERNEL_PROT_GPU_WRITE))<>0 then if (prot and (PROT_WRITE or PROT_GPU_WRITE))<>0 then
begin begin
Result:=PAGE_READWRITE; Result:=PAGE_READWRITE;
end else end else