浏览代码

Use Tiny getmem/freemem functions for systemdebug code, add more debug output

git-svn-id: trunk@32949 -
pierre 9 年之前
父节点
当前提交
3c88a3c59b
共有 1 个文件被更改,包括 40 次插入5 次删除
  1. 40 5
      rtl/msdos/sysfile.inc

+ 40 - 5
rtl/msdos/sysfile.inc

@@ -22,6 +22,12 @@
       opennames : array [0..max_files-1] of pchar;
       opennames : array [0..max_files-1] of pchar;
    const
    const
       free_closed_names : boolean = true;
       free_closed_names : boolean = true;
+      verbose_files : boolean = true;
+
+      { we cannot allocate memory using SysGetMem, as we use tinyheap code,
+        but tinyheap.inc source in inserted later, so we need a forward declaration }
+   function SysTinyFreeMemSize(Addr: Pointer; Size: Ptruint): ptruint; forward;
+   function SysTinyGetMem(Size: ptruint): pointer; forward;
 {$endif SYSTEMDEBUG}
 {$endif SYSTEMDEBUG}
 
 
 
 
@@ -38,19 +44,30 @@ begin
   regs.BX:=handle;
   regs.BX:=handle;
   if handle<max_files then
   if handle<max_files then
     begin
     begin
-       openfiles[handle]:=false;
 {$ifdef SYSTEMDEBUG}
 {$ifdef SYSTEMDEBUG}
+       if not openfiles[handle] then
+          Writeln(stderr,'Trying to close file h=',handle,' marked as closed');
        if assigned(opennames[handle]) and free_closed_names then
        if assigned(opennames[handle]) and free_closed_names then
          begin
          begin
-            sysfreememsize(opennames[handle],strlen(opennames[handle])+1);
+            if verbose_files then
+              Writeln(stderr,'file ',opennames[handle],' closed');
+
+            systinyfreememsize(opennames[handle],strlen(opennames[handle])+1);
             opennames[handle]:=nil;
             opennames[handle]:=nil;
          end;
          end;
 {$endif SYSTEMDEBUG}
 {$endif SYSTEMDEBUG}
+       openfiles[handle]:=false;
     end;
     end;
   regs.AX:=$3e00;
   regs.AX:=$3e00;
   MsDos(regs);
   MsDos(regs);
   if (regs.Flags and fCarry) <> 0 then
   if (regs.Flags and fCarry) <> 0 then
-   GetInOutRes(regs.AX);
+   begin
+     GetInOutRes(regs.AX);
+{$ifdef SYSTEMDEBUG}
+     if verbose_files then
+       Writeln(stderr,'file close failed AX= ',regs.AX);
+{$endif SYSTEMDEBUG}
+   end;
 end;
 end;
 
 
 
 
@@ -63,9 +80,11 @@ begin
   DoDirSeparators(p,pchangeable);
   DoDirSeparators(p,pchangeable);
   regs.DX:=Ofs(p^);
   regs.DX:=Ofs(p^);
   regs.DS:=Seg(p^);
   regs.DS:=Seg(p^);
+{$ifndef RTLLITE}
   if LFNSupport then
   if LFNSupport then
    regs.AX:=$7141
    regs.AX:=$7141
   else
   else
+{$endif ndef RTLLITE}
    regs.AX:=$4100;
    regs.AX:=$4100;
   regs.SI:=0;
   regs.SI:=0;
   regs.CX:=0;
   regs.CX:=0;
@@ -90,9 +109,11 @@ begin
   regs.DX:=Ofs(p1^);
   regs.DX:=Ofs(p1^);
   regs.ES:=Seg(p2^);
   regs.ES:=Seg(p2^);
   regs.DI:=Ofs(p2^);
   regs.DI:=Ofs(p2^);
+{$ifndef RTLLITE}
   if LFNSupport then
   if LFNSupport then
    regs.AX:=$7156
    regs.AX:=$7156
   else
   else
+{$endif ndef RTLLITE}
    regs.AX:=$5600;
    regs.AX:=$5600;
   regs.CX:=$ff;            { attribute problem here ! }
   regs.CX:=$ff;            { attribute problem here ! }
   MsDos(regs);
   MsDos(regs);
@@ -253,6 +274,10 @@ var
   action : word;
   action : word;
   oldp : pchar;
   oldp : pchar;
 begin
 begin
+{$ifdef SYSTEMDEBUG}
+  if verbose_files then
+     Writeln(stderr,'do_open for file "',p,'" called');
+{$endif SYSTEMDEBUG}
 { close first if opened }
 { close first if opened }
   if ((flags and $10000)=0) then
   if ((flags and $10000)=0) then
    begin
    begin
@@ -348,6 +373,10 @@ begin
       GetInOutRes(regs.AX);
       GetInOutRes(regs.AX);
       if oldp<>p then
       if oldp<>p then
         freemem(p);
         freemem(p);
+{$ifdef SYSTEMDEBUG}
+      if verbose_files then
+        Writeln(stderr,'MSDOS INT open for file "',p,'" failed err=',regs.AX);
+{$endif SYSTEMDEBUG}
       exit;
       exit;
     end
     end
   else
   else
@@ -359,6 +388,10 @@ begin
         FileHandleCount:=regs.AX;
         FileHandleCount:=regs.AX;
 {$endif RTLLITE}
 {$endif RTLLITE}
     end;
     end;
+{$ifdef SYSTEMDEBUG}
+  if verbose_files then
+     Writeln(stderr,'MSDOS INT open for file "',p,'" returned ',regs.AX);
+{$endif SYSTEMDEBUG}
   if regs.AX<max_files then
   if regs.AX<max_files then
     begin
     begin
 {$ifdef SYSTEMDEBUG}
 {$ifdef SYSTEMDEBUG}
@@ -366,13 +399,15 @@ begin
           assigned(opennames[regs.AX]) then
           assigned(opennames[regs.AX]) then
          begin
          begin
             Writeln(stderr,'file ',opennames[regs.AX],'(',regs.AX,') not closed but handle reused!');
             Writeln(stderr,'file ',opennames[regs.AX],'(',regs.AX,') not closed but handle reused!');
-            sysfreememsize(opennames[regs.AX],strlen(opennames[regs.AX])+1);
+            systinyfreememsize(opennames[regs.AX],strlen(opennames[regs.AX])+1);
          end;
          end;
 {$endif SYSTEMDEBUG}
 {$endif SYSTEMDEBUG}
        openfiles[regs.AX]:=true;
        openfiles[regs.AX]:=true;
 {$ifdef SYSTEMDEBUG}
 {$ifdef SYSTEMDEBUG}
-       opennames[regs.AX] := sysgetmem(strlen(p)+1);
+       opennames[regs.AX] := systinygetmem(strlen(p)+1);
        move(p^,opennames[regs.AX]^,strlen(p)+1);
        move(p^,opennames[regs.AX]^,strlen(p)+1);
+       if verbose_files then
+         Writeln(stderr,'file ',opennames[regs.AX],' opened');
 {$endif SYSTEMDEBUG}
 {$endif SYSTEMDEBUG}
     end;
     end;
 { append mode }
 { append mode }