From 5e612e474a4176e94d9903688168b434de181eee Mon Sep 17 00:00:00 2001
From: Nicolas Boulenguez <nicolas@debian.org>
Date: Thu, 21 Apr 2022 18:22:28 +0200
Subject: [PATCH 1/3] project: improve consistency of os-fs-open_pipe variants

The changes confuse git, but the Ada sources are actually not
modified, only renamed:
win32 -> windows
unix  -> osx
linux -> unix
---
 gnatcoll.gpr                                  |  8 ++-----
 ....adb => gnatcoll-os-fs-open_pipe__osx.adb} | 22 +++++++++++++++----
 src/os/gnatcoll-os-fs-open_pipe__unix.adb     | 22 ++++---------------
 ... => gnatcoll-os-fs-open_pipe__windows.adb} |  0
 4 files changed, 24 insertions(+), 28 deletions(-)
 rename src/os/{gnatcoll-os-fs-open_pipe__linux.adb => gnatcoll-os-fs-open_pipe__osx.adb} (80%)
 rename src/os/{gnatcoll-os-fs-open_pipe__win32.adb => gnatcoll-os-fs-open_pipe__windows.adb} (100%)

diff --git a/gnatcoll.gpr b/gnatcoll.gpr
index 78ec52db..cf04d252 100644
--- a/gnatcoll.gpr
+++ b/gnatcoll.gpr
@@ -192,6 +192,8 @@ project GnatColl is
 
       for Specification  ("GNATCOLL.OS.Constants")
         use "gnatcoll-os-constants__" & OS & ".ads";
+      for Implementation ("GNATCOLL.OS.FS.Open_Pipe")
+        use "gnatcoll-os-fs-open_pipe__" & OS & ".adb";
 
       case OS is
          when "unix" | "osx" =>
@@ -256,8 +258,6 @@ project GnatColl is
               use "gnatcoll-os-fs-null_file__win32.adb";
             for Implementation ("GNATCOLL.OS.FS.Open")
               use "gnatcoll-os-fs-open__win32.adb";
-            for Implementation ("GNATCOLL.OS.FS.Open_Pipe")
-              use "gnatcoll-os-fs-open_pipe__win32.adb";
             for Implementation ("GNATCOLL.OS.FS.Set_Close_On_Exec")
               use "gnatcoll-os-fs-set_close_on_exec__win32.adb";
             for Specification ("GNATCOLL.OS.Process_Types")
@@ -292,13 +292,9 @@ project GnatColl is
          when "unix" =>
             for Specification  ("GNATCOLL.OS.Libc_Constants")
               use "gnatcoll-os-libc_constants__linux.ads";
-            for Implementation ("GNATCOLL.OS.FS.Open_Pipe")
-              use "gnatcoll-os-fs-open_pipe__linux.adb";
          when "osx" =>
             for Specification  ("GNATCOLL.OS.Libc_Constants")
               use "gnatcoll-os-libc_constants__osx.ads";
-            for Implementation ("GNATCOLL.OS.FS.Open_Pipe")
-              use "gnatcoll-os-fs-open_pipe__unix.adb";
          when "windows" =>
             null;
       end case;
diff --git a/src/os/gnatcoll-os-fs-open_pipe__linux.adb b/src/os/gnatcoll-os-fs-open_pipe__osx.adb
similarity index 80%
rename from src/os/gnatcoll-os-fs-open_pipe__linux.adb
rename to src/os/gnatcoll-os-fs-open_pipe__osx.adb
index a3a45b52..cd123cd5 100644
--- a/src/os/gnatcoll-os-fs-open_pipe__linux.adb
+++ b/src/os/gnatcoll-os-fs-open_pipe__osx.adb
@@ -22,6 +22,7 @@
 ------------------------------------------------------------------------------
 
 with GNATCOLL.OS.Libc;
+with GNAT.Task_Lock;
 
 separate (GNATCOLL.OS.FS)
 procedure Open_Pipe
@@ -33,16 +34,29 @@ is
    Result : aliased Libc.Pipe_Type;
    Status : Libc.Libc_Status;
 begin
-
-   --  This implementation relies on the fact that pipe2 is used to open the
-   --  pipe and flag set to O_CLOEXEC. Thus there is no need to call
-   --  Set_Close_On_Exec.
+   --  We need to ensure that a call to pipe and set_close_on_exec is done
+   --  atomically. Otherwise the pipe file descriptors might leak into other
+   --  processes and thus block the pipe (in programs mixing tasking and
+   --  process spawning for example).
+   GNAT.Task_Lock.Lock;
    Status := Libc.Pipe (Result'Access);
+
    if Status = Libc.Error then
+      GNAT.Task_Lock.Unlock;
       raise OS_Error with "cannot open pipe";
    end if;
 
    Pipe_Read := Result.Input;
    Pipe_Write := Result.Output;
 
+   begin
+      Set_Close_On_Exec (Pipe_Read, True);
+      Set_Close_On_Exec (Pipe_Write, True);
+   exception
+      when OS_Error =>
+         GNAT.Task_Lock.Unlock;
+         raise;
+   end;
+   GNAT.Task_Lock.Unlock;
+
 end Open_Pipe;
diff --git a/src/os/gnatcoll-os-fs-open_pipe__unix.adb b/src/os/gnatcoll-os-fs-open_pipe__unix.adb
index cd123cd5..a3a45b52 100644
--- a/src/os/gnatcoll-os-fs-open_pipe__unix.adb
+++ b/src/os/gnatcoll-os-fs-open_pipe__unix.adb
@@ -22,7 +22,6 @@
 ------------------------------------------------------------------------------
 
 with GNATCOLL.OS.Libc;
-with GNAT.Task_Lock;
 
 separate (GNATCOLL.OS.FS)
 procedure Open_Pipe
@@ -34,29 +33,16 @@ is
    Result : aliased Libc.Pipe_Type;
    Status : Libc.Libc_Status;
 begin
-   --  We need to ensure that a call to pipe and set_close_on_exec is done
-   --  atomically. Otherwise the pipe file descriptors might leak into other
-   --  processes and thus block the pipe (in programs mixing tasking and
-   --  process spawning for example).
-   GNAT.Task_Lock.Lock;
-   Status := Libc.Pipe (Result'Access);
 
+   --  This implementation relies on the fact that pipe2 is used to open the
+   --  pipe and flag set to O_CLOEXEC. Thus there is no need to call
+   --  Set_Close_On_Exec.
+   Status := Libc.Pipe (Result'Access);
    if Status = Libc.Error then
-      GNAT.Task_Lock.Unlock;
       raise OS_Error with "cannot open pipe";
    end if;
 
    Pipe_Read := Result.Input;
    Pipe_Write := Result.Output;
 
-   begin
-      Set_Close_On_Exec (Pipe_Read, True);
-      Set_Close_On_Exec (Pipe_Write, True);
-   exception
-      when OS_Error =>
-         GNAT.Task_Lock.Unlock;
-         raise;
-   end;
-   GNAT.Task_Lock.Unlock;
-
 end Open_Pipe;
diff --git a/src/os/gnatcoll-os-fs-open_pipe__win32.adb b/src/os/gnatcoll-os-fs-open_pipe__windows.adb
similarity index 100%
rename from src/os/gnatcoll-os-fs-open_pipe__win32.adb
rename to src/os/gnatcoll-os-fs-open_pipe__windows.adb

From c56c77a14ed354b296ac1d3dde1f36e98f1012de Mon Sep 17 00:00:00 2001
From: Nicolas Boulenguez <nicolas@debian.org>
Date: Sat, 23 Oct 2021 16:30:48 +0200
Subject: [PATCH 2/3] project: improve consistency of os-libc_constants
 variants

---
 gnatcoll.gpr                                               | 7 ++-----
 ...nts__linux.ads => gnatcoll-os-libc_constants__unix.ads} | 0
 2 files changed, 2 insertions(+), 5 deletions(-)
 rename src/os/unix/{gnatcoll-os-libc_constants__linux.ads => gnatcoll-os-libc_constants__unix.ads} (100%)

diff --git a/gnatcoll.gpr b/gnatcoll.gpr
index cf04d252..0f06e46c 100644
--- a/gnatcoll.gpr
+++ b/gnatcoll.gpr
@@ -289,12 +289,9 @@ project GnatColl is
       end case;
 
       case OS is
-         when "unix" =>
-            for Specification  ("GNATCOLL.OS.Libc_Constants")
-              use "gnatcoll-os-libc_constants__linux.ads";
-         when "osx" =>
+         when "unix" | "osx" =>
             for Specification  ("GNATCOLL.OS.Libc_Constants")
-              use "gnatcoll-os-libc_constants__osx.ads";
+              use "gnatcoll-os-libc_constants__" & OS & ".ads";
          when "windows" =>
             null;
       end case;
diff --git a/src/os/unix/gnatcoll-os-libc_constants__linux.ads b/src/os/unix/gnatcoll-os-libc_constants__unix.ads
similarity index 100%
rename from src/os/unix/gnatcoll-os-libc_constants__linux.ads
rename to src/os/unix/gnatcoll-os-libc_constants__unix.ads

From 59139b7f160a9526b4de9d60b327a28b90df54b9 Mon Sep 17 00:00:00 2001
From: Nicolas Boulenguez <nicolas@debian.org>
Date: Sat, 23 Oct 2021 16:48:57 +0200
Subject: [PATCH 3/3] project: replace some disjonctions with string
 concatenations

---
 gnatcoll.gpr                                  | 146 ++++++------------
 ...indows.adb => gnatcoll-plugins__win32.adb} |   0
 2 files changed, 50 insertions(+), 96 deletions(-)
 rename src/{gnatcoll-plugins__windows.adb => gnatcoll-plugins__win32.adb} (100%)

diff --git a/gnatcoll.gpr b/gnatcoll.gpr
index 0f06e46c..888dbcab 100644
--- a/gnatcoll.gpr
+++ b/gnatcoll.gpr
@@ -43,15 +43,17 @@ project GnatColl is
    type OS_Kind is ("windows", "unix", "osx");
    OS : OS_Kind := External ("GNATCOLL_OS", "unix");
 
-   Sources := ("src", "src/os", "src/paragraph_filling");
-
+   Unix_Win32 := "";
    case OS is
       when "unix" | "osx" =>
-         Sources := Sources & ("src/os/unix");
+         Unix_Win32 := "unix";
       when "windows" =>
-         Sources := Sources & ("src/os/win32");
+         Unix_Win32 := "windows";
    end case;
 
+   Sources := ("src", "src/os", "src/paragraph_filling",
+               "src/os/" & Unix_Win32);
+
    case Projects is
       when "yes" =>
          Sources := Sources & ("src/projects");
@@ -195,98 +197,50 @@ project GnatColl is
       for Implementation ("GNATCOLL.OS.FS.Open_Pipe")
         use "gnatcoll-os-fs-open_pipe__" & OS & ".adb";
 
-      case OS is
-         when "unix" | "osx" =>
-            for Specification  ("GNATCOLL.Mmap.System")
-              use "gnatcoll-mmap-system__unix.ads";
-            for Implementation ("GNATCOLL.Mmap.System")
-              use "gnatcoll-mmap-system__unix.adb";
-            for Implementation ("GNATCOLL.IO.Native.Codec")
-              use "gnatcoll-io-native-codec__unix.adb";
-            for Implementation ("GNATCOLL.Plugins")
-              use "gnatcoll-plugins__unix.adb";
-            for Implementation ("GNATCOLL.OS.Stat.Stat")
-              use "gnatcoll-os-stat-stat__unix.adb";
-            for Implementation ("GNATCOLL.OS.FS.Null_File")
-              use "gnatcoll-os-fs-null_file__unix.adb";
-            for Implementation ("GNATCOLL.OS.FS.Open")
-              use "gnatcoll-os-fs-open__unix.adb";
-            for Implementation ("GNATCOLL.OS.FS.Set_Close_On_Exec")
-              use "gnatcoll-os-fs-set_close_on_exec__unix.adb";
-            for Implementation ("GNATCOLL.OS.FS.Is_Console")
-              use "gnatcoll-os-fs-is_console__unix.adb";
-            for Implementation ("GNATCOLL.OS.Process.Wait")
-              use "gnatcoll-os-process-wait__unix.adb";
-            for Implementation ("GNATCOLL.OS.Process.Internal_Spawn")
-              use "gnatcoll-os-process-internal_spawn__unix.adb";
-            for Specification ("GNATCOLL.OS.Process_Types")
-              use "gnatcoll-os-process_types__unix.ads";
-            for Implementation ("GNATCOLL.OS.Process_Types")
-              use "gnatcoll-os-process_types__unix.adb";
-            for Implementation ("GNATCOLL.OS.Process.State")
-              use "gnatcoll-os-process-state__unix.adb";
-            for Implementation ("GNATCOLL.OS.Process.Wait_For_Processes")
-              use "gnatcoll-os-process-wait_for_processes__unix.adb";
-            for Specification ("GNATCOLL.OS.Dir_Types")
-              use "gnatcoll-os-dir_types__unix.ads";
-            for Implementation ("GNATCOLL.OS.Dir.Open")
-              use "gnatcoll-os-dir-open__unix.adb";
-            for Implementation ("GNATCOLL.OS.Dir.Close")
-              use "gnatcoll-os-dir-close__unix.adb";
-            for Implementation ("GNATCOLL.OS.Dir.Read")
-              use "gnatcoll-os-dir-read__unix.adb";
-            for Implementation ("GNATCOLL.OS.FSUtil.Copy_File_Content")
-              use "gnatcoll-os-fsutil-copy_file_content__unix.adb";
-            for Implementation ("GNATCOLL.OS.FSUtil.Copy_Permissions")
-              use "gnatcoll-os-fsutil-copy_permissions__unix.adb";
-            for Implementation ("GNATCOLL.OS.FSUtil.Copy_Timestamps")
-              use "gnatcoll-os-fsutil-copy_timestamps__unix.adb";
-         when "windows" =>
-            for Specification  ("GNATCOLL.Mmap.System")
-              use "gnatcoll-mmap-system__win32.ads";
-            for Implementation ("GNATCOLL.Mmap.System")
-              use "gnatcoll-mmap-system__win32.adb";
-            for Implementation ("GNATCOLL.IO.Native.Codec")
-              use "gnatcoll-io-native-codec__win32.adb";
-            for Implementation ("GNATCOLL.Plugins")
-              use "gnatcoll-plugins__windows.adb";
-            for Implementation ("GNATCOLL.OS.Stat.Stat")
-              use "gnatcoll-os-stat-stat__win32.adb";
-            for Implementation ("GNATCOLL.OS.FS.Is_Console")
-              use "gnatcoll-os-fs-is_console__win32.adb";
-            for Implementation ("GNATCOLL.OS.FS.Null_File")
-              use "gnatcoll-os-fs-null_file__win32.adb";
-            for Implementation ("GNATCOLL.OS.FS.Open")
-              use "gnatcoll-os-fs-open__win32.adb";
-            for Implementation ("GNATCOLL.OS.FS.Set_Close_On_Exec")
-              use "gnatcoll-os-fs-set_close_on_exec__win32.adb";
-            for Specification ("GNATCOLL.OS.Process_Types")
-              use "gnatcoll-os-process_types__win32.ads";
-            for Implementation ("GNATCOLL.OS.Process_Types")
-              use "gnatcoll-os-process_types__win32.adb";
-            for Implementation ("GNATCOLL.OS.Process.Wait")
-              use "gnatcoll-os-process-wait__win32.adb";
-            for Implementation ("GNATCOLL.OS.Process.Internal_Spawn")
-              use "gnatcoll-os-process-internal_spawn__win32.adb";
-            for Implementation ("GNATCOLL.OS.Process.State")
-              use "gnatcoll-os-process-state__win32.adb";
-            for Implementation ("GNATCOLL.OS.Process.Wait_For_Processes")
-              use "gnatcoll-os-process-wait_for_processes__win32.adb";
-            for Specification ("GNATCOLL.OS.Dir_Types")
-              use "gnatcoll-os-dir_types__win32.ads";
-            for Implementation ("GNATCOLL.OS.Dir.Open")
-              use "gnatcoll-os-dir-open__win32.adb";
-            for Implementation ("GNATCOLL.OS.Dir.Close")
-              use "gnatcoll-os-dir-close__win32.adb";
-            for Implementation ("GNATCOLL.OS.Dir.Read")
-              use "gnatcoll-os-dir-read__win32.adb";
-            for Implementation ("GNATCOLL.OS.FSUtil.Copy_File_Content")
-              use "gnatcoll-os-fsutil-copy_file_content__win32.adb";
-            for Implementation ("GNATCOLL.OS.FSUtil.Copy_Permissions")
-              use "gnatcoll-os-fsutil-copy_permissions__win32.adb";
-            for Implementation ("GNATCOLL.OS.FSUtil.Copy_Timestamps")
-              use "gnatcoll-os-fsutil-copy_timestamps__win32.adb";
-      end case;
+      for Specification  ("GNATCOLL.Mmap.System")
+        use "gnatcoll-mmap-system__" & Unix_Win32 & ".ads";
+      for Implementation ("GNATCOLL.Mmap.System")
+        use "gnatcoll-mmap-system__" & Unix_Win32 & ".adb";
+      for Implementation ("GNATCOLL.IO.Native.Codec")
+        use "gnatcoll-io-native-codec__" & Unix_Win32 & ".adb";
+      for Implementation ("GNATCOLL.Plugins")
+        use "gnatcoll-plugins__" & Unix_Win32 & ".adb";
+      for Implementation ("GNATCOLL.OS.Stat.Stat")
+        use "gnatcoll-os-stat-stat__" & Unix_Win32 & ".adb";
+      for Implementation ("GNATCOLL.OS.FS.Null_File")
+        use "gnatcoll-os-fs-null_file__" & Unix_Win32 & ".adb";
+      for Implementation ("GNATCOLL.OS.FS.Open")
+        use "gnatcoll-os-fs-open__" & Unix_Win32 & ".adb";
+      for Implementation ("GNATCOLL.OS.FS.Set_Close_On_Exec")
+        use "gnatcoll-os-fs-set_close_on_exec__" & Unix_Win32 & ".adb";
+      for Implementation ("GNATCOLL.OS.FS.Is_Console")
+        use "gnatcoll-os-fs-is_console__" & Unix_Win32 & ".adb";
+      for Implementation ("GNATCOLL.OS.Process.Wait")
+        use "gnatcoll-os-process-wait__" & Unix_Win32 & ".adb";
+      for Implementation ("GNATCOLL.OS.Process.Internal_Spawn")
+        use "gnatcoll-os-process-internal_spawn__" & Unix_Win32 & ".adb";
+      for Specification ("GNATCOLL.OS.Process_Types")
+        use "gnatcoll-os-process_types__" & Unix_Win32 & ".ads";
+      for Implementation ("GNATCOLL.OS.Process_Types")
+        use "gnatcoll-os-process_types__" & Unix_Win32 & ".adb";
+      for Implementation ("GNATCOLL.OS.Process.State")
+        use "gnatcoll-os-process-state__" & Unix_Win32 & ".adb";
+      for Implementation ("GNATCOLL.OS.Process.Wait_For_Processes")
+        use "gnatcoll-os-process-wait_for_processes__" & Unix_Win32 & ".adb";
+      for Specification ("GNATCOLL.OS.Dir_Types")
+        use "gnatcoll-os-dir_types__" & Unix_Win32 & ".ads";
+      for Implementation ("GNATCOLL.OS.Dir.Open")
+        use "gnatcoll-os-dir-open__" & Unix_Win32 & ".adb";
+      for Implementation ("GNATCOLL.OS.Dir.Close")
+        use "gnatcoll-os-dir-close__" & Unix_Win32 & ".adb";
+      for Implementation ("GNATCOLL.OS.Dir.Read")
+        use "gnatcoll-os-dir-read__" & Unix_Win32 & ".adb";
+      for Implementation ("GNATCOLL.OS.FSUtil.Copy_File_Content")
+        use "gnatcoll-os-fsutil-copy_file_content__" & Unix_Win32 & ".adb";
+      for Implementation ("GNATCOLL.OS.FSUtil.Copy_Permissions")
+        use "gnatcoll-os-fsutil-copy_permissions__" & Unix_Win32 & ".adb";
+      for Implementation ("GNATCOLL.OS.FSUtil.Copy_Timestamps")
+        use "gnatcoll-os-fsutil-copy_timestamps__" & Unix_Win32 & ".adb";
 
       case OS is
          when "unix" | "osx" =>
diff --git a/src/gnatcoll-plugins__windows.adb b/src/gnatcoll-plugins__win32.adb
similarity index 100%
rename from src/gnatcoll-plugins__windows.adb
rename to src/gnatcoll-plugins__win32.adb