public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug ada/19526] New: Windows errorcodes wrong in Ada when tasking
@ 2005-01-19  8:39 b201 at passagen dot se
  2005-01-22  9:31 ` [Bug ada/19526] " dannysmith at users dot sourceforge dot net
                   ` (8 more replies)
  0 siblings, 9 replies; 10+ messages in thread
From: b201 at passagen dot se @ 2005-01-19  8:39 UTC (permalink / raw)
  To: gcc-bugs

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 5450 bytes --]

BUG REPORTS HAVE TO CONTAIN AT LEAST THE FOLLOWING INFORMATION IN ORDER TO BE 
USEFUL:

the exact version of GCC, as shown by "gcc -v"; 

  gcc -v
  Reading specs from C:/languages/MinGW/bin/../lib/gcc/mingw32/3.4.2/specs
  Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --
host=mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --
enable-languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-
shared --enable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x -
-enable-java-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-
synchronization --enable-libstdcxx-debug
  Thread model: win32
  gcc version 3.4.2 (mingw-special)




THE SYSTEM TYPE; 
  Windows 2000 Professional, Windows 2000 Server, Windows 2003

THE OPTIONS WHEN GCC WAS CONFIGURED/BUILT; 
  Binaries used from minGW containing

  MinGW version 3.2.0 contains the following list of packages: 
   
  gcc-ada-3.4.2.tar.gz 
  gcc-core-3.4.2.tar.gz 
  gcc-g++-3.4.2.tar.gz 
  gcc-g77-3.4.2.tar.gz 
  gcc-java-3.4.2.tar.gz 
  gcc-objc-3.4.2.tar.gz 
  binutils-2.15.91-20040904-1 
  mingw-runtime-3.6 
  w32api-3.2 
  gdb-5.2.1-1 
  mingw32-make-3.80.0-3 
  mingw-utils-0.3.tar.gz 
  
  
  But this bug also applies to the 'official' gnat 3.15p from ACT


THE EXACT COMMAND LINE PASSED TO THE GCC PROGRAM TRIGGERING THE BUG
(not just the flags passed to gnatmake, but gnatmake prints the parameters it 
passed to gcc) 


  C:\Temp>gnatmake socket_connect.adb
  gcc -c socket_connect.adb
  socket_connect.adb:3:18: warning: "Gnat.Sockets.Thin" is an internal GNAT unit
  socket_connect.adb:3:18: warning: use of this unit is non-portable and 
version-d
  ependent
  gnatbind -x socket_connect.ali
  gnatlink socket_connect.ali

A COLLECTION OF SOURCE FILES FOR REPRODUCING THE BUG, PREFERABLY A MINIMAL SET 
(SEE BELOW); 

  with Text_Io;
  with Gnat.Sockets;
  with Gnat.Sockets.Thin;
  with Ada.Exceptions;
  
  procedure Socket_Connect is
    Socket   : Gnat.Sockets.Socket_Type;
    Address  : Gnat.Sockets.Sock_Addr_Type;
    Error    : Integer := 0;
    --------------------------------------------------
    task type Run_Once is
      entry Execute;
    end Run_Once;
    --------------------------------------------------
    task body Run_Once is
    begin
      select
        accept Execute do
          text_io.put_line("Task running, Execute!");
        end Execute;
      or
        terminate;
      end select;
    end Run_Once;
    --------------------------------------------------  
  begin
    declare
      TmpTask : Run_Once;
    begin
      TmpTask.Execute;
    end;
  
    text_io.put_line("Startup sockets");
    Gnat.Sockets.Initialize;
  
    text_io.put_line("Get a socket");
    Gnat.Sockets.Create_Socket (Socket);
  
    text_io.put_line("Try to connect!");
    Address.Addr := Gnat.Sockets.Inet_Addr("127.0.0.1"); 
    Address.Port := 8000;
    Gnat.Sockets.Connect_Socket (Socket, Address);
    text_io.put_line("Connected!");
  
    text_io.put_line("Close socket!");
    Gnat.Sockets.Close_Socket (Socket);
  
    text_io.put_line("Shutdown sockets!");
    Gnat.Sockets.Finalize;
  
    text_io.put_line("Done!");
  exception
    when E: others =>
     Text_IO.Put_Line(Ada.Exceptions.Exception_Name (E) & ": " & 
                      Ada.Exceptions.Exception_Message (E));
     
     Error := Gnat.Sockets.Thin.Socket_Errno;
     Text_IO.Put_Line(Integer'Image(Error) & " - " ) ; --& 
  --            Gnat.Sockets.Thin.Socket_Error_Message (Error));
   
     Text_IO.Put_Line("Resolve_Exception" & " - " & 
       Gnat.Sockets.Error_Type'Image(Gnat.Sockets.Resolve_Exception(E)));
  
     Gnat.Sockets.Finalize;
  
  end Socket_Connect;



A DESCRIPTION OF THE EXPECTED BEHAVIOR; 
  I'd like an output like this:
  
  C:\Temp>socket_connect
  Task running, Execute!
  Startup sockets
  Get a socket
  Try to connect!
  GNAT.SOCKETS.SOCKET_ERROR: [10061] Connection refused
   10061 -
  Resolve_Exception - CONNECTION_REFUSED
  
  
  Note the second last line, printed by a call to
  Gnat.Sockets.Thin.Socket_Errno.
  
  I get the behavior when I comment out the task type.
  (well not the 'Task running, Execute' of course)


A DESCRIPTION OF ACTUAL BEHAVIOR. 
  C:\Temp>socket_connect
  Task running, Execute!
  Startup sockets
  Get a socket
  Try to connect!
  GNAT.SOCKETS.SOCKET_ERROR: [10061] Connection refused
   0 -
  Resolve_Exception - CONNECTION_REFUSED
  
  Note the second last line, printed by a call to
  Gnat.Sockets.Thin.Socket_Errno.
  This time there's no error! 
  This behavior occurs when any task at all is involved. If I write my
  own socket biding, and call WSAGetLastError 
  (as Gnat.Sockets.Thin.Socket_Errno does)
  I still have this behavior. So I can recognize a socketerror,
  via the fact that c-socket function return -1 on error but
  NOT find the reason, unless I use Gnat.sockets, and mask the error out from
  the exception, which breaks socket code not written unsing Gnat.Sockets



/Björn

-- 
           Summary: Windows errorcodes wrong in Ada when tasking
           Product: gcc
           Version: 3.4.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: ada
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: b201 at passagen dot se
                CC: gcc-bugs at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19526


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug ada/19526] Windows errorcodes wrong in Ada when tasking
  2005-01-19  8:39 [Bug ada/19526] New: Windows errorcodes wrong in Ada when tasking b201 at passagen dot se
@ 2005-01-22  9:31 ` dannysmith at users dot sourceforge dot net
  2005-03-17 10:33 ` charlet at gcc dot gnu dot org
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: dannysmith at users dot sourceforge dot net @ 2005-01-22  9:31 UTC (permalink / raw)
  To: gcc-bugs



-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |dannysmith at users dot
                   |                            |sourceforge dot net


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19526


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug ada/19526] Windows errorcodes wrong in Ada when tasking
  2005-01-19  8:39 [Bug ada/19526] New: Windows errorcodes wrong in Ada when tasking b201 at passagen dot se
  2005-01-22  9:31 ` [Bug ada/19526] " dannysmith at users dot sourceforge dot net
@ 2005-03-17 10:33 ` charlet at gcc dot gnu dot org
  2005-03-18 22:45 ` b201 at passagen dot se
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: charlet at gcc dot gnu dot org @ 2005-03-17 10:33 UTC (permalink / raw)
  To: gcc-bugs


------- Additional Comments From charlet at gcc dot gnu dot org  2005-03-17 10:27 -------
I do not see any GNAT bug here. Potentially a problem in your code,
or in the Win32 API you used, but that's all.

Note that GNAT.Sockets.Thin as shown in your build output is an internal
unit that should not be used directly.

Arno

-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
         Resolution|                            |INVALID


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19526


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug ada/19526] Windows errorcodes wrong in Ada when tasking
  2005-01-19  8:39 [Bug ada/19526] New: Windows errorcodes wrong in Ada when tasking b201 at passagen dot se
  2005-01-22  9:31 ` [Bug ada/19526] " dannysmith at users dot sourceforge dot net
  2005-03-17 10:33 ` charlet at gcc dot gnu dot org
@ 2005-03-18 22:45 ` b201 at passagen dot se
  2005-03-19 11:19 ` dannysmith at users dot sourceforge dot net
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: b201 at passagen dot se @ 2005-03-18 22:45 UTC (permalink / raw)
  To: gcc-bugs

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 907 bytes --]


------- Additional Comments From b201 at passagen dot se  2005-03-18 22:45 -------
How come not many people see this as a bug? 
When a program behaves differently, just because 
a totally non-related task was introduced, I  
consider it a bug. I think Danny is on the right track. 
 
As for the remark of using internal gnat-units, I do state 
that I get the same result if I import WSAGetLastError myself, 
in the same way gnat.sockets.this does, and that way is  
the only way to go. 
function Last_Error return Interfaces.c.int (or long) 
pragma Import(stdcall,Last_Error,WSAGetLastError)  
 
/Björn 

-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |UNCONFIRMED
         Resolution|INVALID                     |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19526


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug ada/19526] Windows errorcodes wrong in Ada when tasking
  2005-01-19  8:39 [Bug ada/19526] New: Windows errorcodes wrong in Ada when tasking b201 at passagen dot se
                   ` (2 preceding siblings ...)
  2005-03-18 22:45 ` b201 at passagen dot se
@ 2005-03-19 11:19 ` dannysmith at users dot sourceforge dot net
  2005-03-19 13:02 ` b201 at passagen dot se
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: dannysmith at users dot sourceforge dot net @ 2005-03-19 11:19 UTC (permalink / raw)
  To: gcc-bugs


------- Additional Comments From dannysmith at users dot sourceforge dot net  2005-03-19 11:14 -------
IMO, resetting the error code set by the kernel whenever the internal Ada
tasking functions are called successfully is a bug.  It can be easily fixed:

	* s-osinte-mingw.ads (SetLastError): Import win32api function.
	* s-taprop-mingw.adb (Specific.Is_Valid_Task): Save last OS
	error code and restore if TlsGetValue succeeds.
	(Specific.Set): Likewise.

Index: s-osinte-mingw.ads
===================================================================
RCS file: /cvs/gcc/gcc/gcc/ada/s-osinte-mingw.ads,v
retrieving revision 1.1
diff -c -3 -p -r1.1 s-osinte-mingw.ads
*** s-osinte-mingw.ads	14 May 2004 10:02:00 -0000	1.1
--- s-osinte-mingw.ads	19 Mar 2005 10:57:53 -0000
*************** pragma Preelaborate;
*** 433,438 ****
--- 433,441 ----
     function GetLastError return DWORD;
     pragma Import (Stdcall, GetLastError, "GetLastError");
  
+    procedure SetLastError (dwErrCode : DWORD);
+    pragma Import (Stdcall, SetLastError, "SetLastError");
+ 
  private
  
     type sigset_t is new Interfaces.C.unsigned_long;
Index: s-taprop-mingw.adb
===================================================================
RCS file: /cvs/gcc/gcc/gcc/ada/s-taprop-mingw.adb,v
retrieving revision 1.7
diff -c -3 -p -r1.7 s-taprop-mingw.adb
*** s-taprop-mingw.adb	10 Feb 2005 13:57:21 -0000	1.7
--- s-taprop-mingw.adb	19 Mar 2005 10:57:55 -0000
*************** package body System.Task_Primitives.Oper
*** 143,160 ****
  
     end Specific;
  
     package body Specific is
  
        function Is_Valid_Task return Boolean is
        begin
!          return TlsGetValue (TlsIndex) /= System.Null_Address;
        end Is_Valid_Task;
  
        procedure Set (Self_Id : Task_Id) is
           Succeeded : BOOL;
        begin
           Succeeded := TlsSetValue (TlsIndex, To_Address (Self_Id));
           pragma Assert (Succeeded = True);
        end Set;
  
     end Specific;
--- 143,174 ----
  
     end Specific;
  
+    --  Unlike other win32api functions, TlsGetValue resets the OS error
+    --  status to O on success.  Save and restore the error code so it
+    --  doesn't get clobbered behind the user's back when multi-tasking.
+ 
     package body Specific is
  
        function Is_Valid_Task return Boolean is
+          Succeeded : Boolean;
+          Saved_Err_Code : DWORD;
        begin
!          Saved_Err_Code := GetLastError;
!          Succeeded := TlsGetValue (TlsIndex) /= System.Null_Address;
!          if Succeeded then
!             SetLastError (Saved_Err_Code);
!          end if;
!          return Succeeded;
        end Is_Valid_Task;
  
        procedure Set (Self_Id : Task_Id) is
           Succeeded : BOOL;
+          Saved_Err_Code : DWORD;
        begin
+          Saved_Err_Code := GetLastError;
           Succeeded := TlsSetValue (TlsIndex, To_Address (Self_Id));
           pragma Assert (Succeeded = True);
+          SetLastError (Saved_Err_Code);
        end Set;
  
     end Specific;

-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19526


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug ada/19526] Windows errorcodes wrong in Ada when tasking
  2005-01-19  8:39 [Bug ada/19526] New: Windows errorcodes wrong in Ada when tasking b201 at passagen dot se
                   ` (3 preceding siblings ...)
  2005-03-19 11:19 ` dannysmith at users dot sourceforge dot net
@ 2005-03-19 13:02 ` b201 at passagen dot se
  2005-03-19 13:55 ` charlet at adacore dot com
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: b201 at passagen dot se @ 2005-03-19 13:02 UTC (permalink / raw)
  To: gcc-bugs

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 528 bytes --]


------- Additional Comments From b201 at passagen dot se  2005-03-19 13:02 -------
Danny, to me it seems you've got the solution.  
What will happen next? Will your patch make it into 
the next version, or does it have to be approved by 
someone else, who might not think it's a bug at all? 
Or is this not the correct place to ask this question? 
(I'm a bit confused about how the work on mingw/gcc is organized 
with respect to ACT, the 'gnat-company') 
 
/Björn 
 

-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19526


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug ada/19526] Windows errorcodes wrong in Ada when tasking
  2005-01-19  8:39 [Bug ada/19526] New: Windows errorcodes wrong in Ada when tasking b201 at passagen dot se
                   ` (4 preceding siblings ...)
  2005-03-19 13:02 ` b201 at passagen dot se
@ 2005-03-19 13:55 ` charlet at adacore dot com
  2005-03-20  1:27 ` dannysmith at users dot sourceforge dot net
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: charlet at adacore dot com @ 2005-03-19 13:55 UTC (permalink / raw)
  To: gcc-bugs


------- Additional Comments From charlet at adacore dot com  2005-03-19 13:54 -------
Subject: Re:  Windows errorcodes wrong in Ada when tasking

> IMO, resetting the error code set by the kernel whenever the internal Ada
> tasking functions are called successfully is a bug.

So you are saying that there is a bug in the Windows kernel ?
Since the Ada run time does not do any reset of the error code.

> It can be easily fixed:

I don't see how this fixes things, since TlsGetValue is also called
in the Self function.

Is_Valid_Task is not called in the test case at hand, and Set is called
during task elaboration, so that's also not problematic.

Did you get a "successful"run of the application with this patch ?
If so, it probably means that the problem is elsewhere and that this
patch is just hiding it.

The function which is called when you use tasking constructs is
Self, and this function is time critical, so it is simply out of the
question to call GetLastError/SetLastError there.

If you want to know the error code associated with your socket call,
you should save the result right away, and not delay this operation.

Arno


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19526


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug ada/19526] Windows errorcodes wrong in Ada when tasking
  2005-01-19  8:39 [Bug ada/19526] New: Windows errorcodes wrong in Ada when tasking b201 at passagen dot se
                   ` (5 preceding siblings ...)
  2005-03-19 13:55 ` charlet at adacore dot com
@ 2005-03-20  1:27 ` dannysmith at users dot sourceforge dot net
  2005-06-20  2:30 ` pinskia at gcc dot gnu dot org
  2005-06-20  8:12 ` charlet at gcc dot gnu dot org
  8 siblings, 0 replies; 10+ messages in thread
From: dannysmith at users dot sourceforge dot net @ 2005-03-20  1:27 UTC (permalink / raw)
  To: gcc-bugs


------- Additional Comments From dannysmith at users dot sourceforge dot net  2005-03-20 01:26 -------
Oops, I had split up the patch into a non-critical (as far as
this bug report is concerned) part and a critical part, but messed up when
I pasted into bug report.

Following is the part for Self

In reply to other query in comment #5

The behaviour of TlsGetValue (and the reason for it) is documented, so when
users call it directly, they should know to save and restore the error code
if they want to.

The calls in s-taprop.adb are indirect calls by an internal Ada function, so
users wouldn't know that they should do anything special.

It affects not just windows socket errors, but any error code set by a win32api
function 

But if, as you say, its out of the question to fix this, I won't waste
any more time caring about it.  Perhaps I need to investigate the efects of
these Get/SetLastError calls on c++ code (they are used in gthr-win32.c)

Danny


Index: s-taprop-mingw.adb
===================================================================
RCS file: /cvs/gcc/gcc/gcc/ada/s-taprop-mingw.adb,v
retrieving revision 1.7
diff -c -3 -p -r1.7 s-taprop-mingw.adb
*** s-taprop-mingw.adb	10 Feb 2005 13:57:21 -0000	1.7
--- s-taprop-mingw.adb	20 Mar 2005 00:49:58 -0000
*************** package body System.Task_Primitives.Oper
*** 367,381 ****
     -- Self --
     ----------
  
!    function Self return Task_Id is
!       Self_Id : constant Task_Id := To_Task_Id (TlsGetValue (TlsIndex));
!    begin
!       if Self_Id = null then
!          return Register_Foreign_Thread (GetCurrentThread);
!       else
!          return Self_Id;
!       end if;
!    end Self;
  
     ---------------------
     -- Initialize_Lock --
--- 381,400 ----
     -- Self --
     ----------
  
!      function Self return Task_ID is
!         Saved_Err_Code : DWORD;
!         Self_Id        : Task_ID;
!   
!      begin
!         Saved_Err_Code := GetLastError;
!         Self_Id := To_Task_Id (TlsGetValue (TlsIndex));
!         if Self_Id = null then
!            return Register_Foreign_Thread (GetCurrentThread);
!         else
!            SetLastError (Saved_Err_Code);
!            return Self_Id;
!         end if;
!      end Self;
  
     ---------------------
     -- Initialize_Lock --

-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19526


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug ada/19526] Windows errorcodes wrong in Ada when tasking
  2005-01-19  8:39 [Bug ada/19526] New: Windows errorcodes wrong in Ada when tasking b201 at passagen dot se
                   ` (6 preceding siblings ...)
  2005-03-20  1:27 ` dannysmith at users dot sourceforge dot net
@ 2005-06-20  2:30 ` pinskia at gcc dot gnu dot org
  2005-06-20  8:12 ` charlet at gcc dot gnu dot org
  8 siblings, 0 replies; 10+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2005-06-20  2:30 UTC (permalink / raw)
  To: gcc-bugs



-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
 GCC target triplet|                            |i686-pc-mingw32


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19526


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug ada/19526] Windows errorcodes wrong in Ada when tasking
  2005-01-19  8:39 [Bug ada/19526] New: Windows errorcodes wrong in Ada when tasking b201 at passagen dot se
                   ` (7 preceding siblings ...)
  2005-06-20  2:30 ` pinskia at gcc dot gnu dot org
@ 2005-06-20  8:12 ` charlet at gcc dot gnu dot org
  8 siblings, 0 replies; 10+ messages in thread
From: charlet at gcc dot gnu dot org @ 2005-06-20  8:12 UTC (permalink / raw)
  To: gcc-bugs


------- Additional Comments From charlet at gcc dot gnu dot org  2005-06-20 08:12 -------
Closing, as discussed, it would be an undesirable performance hit to make changes
in this area.

Arno

-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
         Resolution|                            |WONTFIX


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19526


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2005-06-20  8:12 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-01-19  8:39 [Bug ada/19526] New: Windows errorcodes wrong in Ada when tasking b201 at passagen dot se
2005-01-22  9:31 ` [Bug ada/19526] " dannysmith at users dot sourceforge dot net
2005-03-17 10:33 ` charlet at gcc dot gnu dot org
2005-03-18 22:45 ` b201 at passagen dot se
2005-03-19 11:19 ` dannysmith at users dot sourceforge dot net
2005-03-19 13:02 ` b201 at passagen dot se
2005-03-19 13:55 ` charlet at adacore dot com
2005-03-20  1:27 ` dannysmith at users dot sourceforge dot net
2005-06-20  2:30 ` pinskia at gcc dot gnu dot org
2005-06-20  8:12 ` charlet at gcc dot gnu dot org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).