g-expect.adb (Non_Blocking_Spawn): Initialize the filters field to
authorJerome Lambourg <lambourg@adacore.com>
Mon, 5 Sep 2005 07:54:22 +0000 (09:54 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 5 Sep 2005 07:54:22 +0000 (09:54 +0200)
2005-09-01  Jerome Lambourg  <lambourg@adacore.com>

* 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

From-SVN: r103866

gcc/ada/g-expect.adb

index 6f0f7cff29fd317ddd86863cc9d682edc3b1dc1a..e94d5b657a1dd60201e433d041dc12c3f05991e5 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;
 
    -------------------------