OSDN Git Service

2005-09-01 Jerome Lambourg <lambourg@adacore.com>
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 5 Sep 2005 07:54:22 +0000 (07:54 +0000)
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 5 Sep 2005 07:54:22 +0000 (07:54 +0000)
* g-expect.adb (Non_Blocking_Spawn): Initialize the filters field to
(Free): New deallocation procedure for filter elements
(Close): Deallocate any existing filter for the concerned connection

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@103866 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/g-expect.adb

index 6f0f7cf..e94d5b6 100644 (file)
@@ -69,6 +69,9 @@ package body GNAT.Expect is
    procedure Free is new Unchecked_Deallocation
      (Pattern_Matcher, Pattern_Matcher_Access);
 
+   procedure Free is new Unchecked_Deallocation
+     (Filter_List_Elem, Filter_List);
+
    procedure Call_Filters
      (Pid       : Process_Descriptor'Class;
       Str       : String;
@@ -204,6 +207,9 @@ package body GNAT.Expect is
      (Descriptor : in out Process_Descriptor;
       Status     : out Integer)
    is
+      Current_Filter : Filter_List;
+      Next_Filter    : Filter_List;
+
    begin
       Close (Descriptor.Input_Fd);
 
@@ -214,11 +220,21 @@ package body GNAT.Expect is
       Close (Descriptor.Output_Fd);
 
       --  ??? Should have timeouts for different signals
+
       Kill (Descriptor.Pid, 9);
 
       GNAT.OS_Lib.Free (Descriptor.Buffer);
       Descriptor.Buffer_Size := 0;
 
+      Current_Filter := Descriptor.Filters;
+
+      while Current_Filter /= null loop
+         Next_Filter := Current_Filter.Next;
+         Free (Current_Filter);
+         Current_Filter := Next_Filter;
+      end loop;
+
+      Descriptor.Filters := null;
       Status := Waitpid (Descriptor.Pid);
    end Close;
 
@@ -1001,6 +1017,10 @@ package body GNAT.Expect is
       if Buffer_Size /= 0 then
          Descriptor.Buffer := new String (1 .. Positive (Buffer_Size));
       end if;
+
+      --  Initialize the filters
+
+      Descriptor.Filters := null;
    end Non_Blocking_Spawn;
 
    -------------------------