OSDN Git Service

* s-intman-vxworks.adb (Notify_Exception): removed useless check for
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Dec 2004 11:24:38 +0000 (11:24 +0000)
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Dec 2004 11:24:38 +0000 (11:24 +0000)
current task being suspended.

* init.c (__gnat_clear_exception): added to reset VxWorks exception
count.
(__gnat_map_signal): removed test for current task being suspended.

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

gcc/ada/init.c
gcc/ada/s-intman-vxworks.adb

index 86152f9..ee09192 100644 (file)
@@ -1661,6 +1661,10 @@ __gnat_initialize ()
 #include <intLib.h>
 #include <iv.h>
 
+#ifdef VTHREADS
+#include "private/vThreadsP.h"
+#endif
+
 extern int __gnat_inum_to_ivec (int);
 static void __gnat_error_handler (int, int, struct sigcontext *);
 void __gnat_map_signal (int);
@@ -1686,6 +1690,16 @@ __gnat_inum_to_ivec (int num)
   return INUM_TO_IVEC (num);
 }
 
+/* VxWorks expects the field excCnt to be zeroed when a signal is handled.
+   The VxWorks version of longjmp does this; gcc's builtin_longjmp does not */
+void
+__gnat_clear_exception_count (void)
+{
+#ifdef VTHREADS
+  taskIdCurrent->vThreads.excCnt = 0;
+#endif
+}
+
 /* Exported to 5zintman.adb in order to handle different signal
    to exception mappings in different VxWorks versions */
 void
@@ -1700,11 +1714,11 @@ __gnat_map_signal (int sig)
       exception = &constraint_error;
       msg = "SIGFPE";
       break;
+#ifdef VTHREADS
     case SIGILL:
       exception = &constraint_error;
-      msg = "SIGILL";
+      msg = "Floating point exception or SIGILL";
       break;
-#ifdef VTHREADS
     case SIGSEGV:
       exception = &storage_error;
       msg = "SIGSEGV: possible stack overflow";
@@ -1714,6 +1728,10 @@ __gnat_map_signal (int sig)
       msg = "SIGBUS: possible stack overflow";
       break;
 #else
+    case SIGILL:
+      exception = &constraint_error;
+      msg = "SIGILL";
+      break;
     case SIGSEGV:
       exception = &program_error;
       msg = "SIGSEGV";
@@ -1728,6 +1746,7 @@ __gnat_map_signal (int sig)
       msg = "unhandled signal";
     }
 
+  __gnat_clear_exception_count ();
   Raise_From_Signal_Handler (exception, msg);
 }
 
@@ -1745,11 +1764,6 @@ __gnat_error_handler (int sig, int code, struct sigcontext *sc)
   sigdelset (&mask, sig);
   sigprocmask (SIG_SETMASK, &mask, NULL);
 
-  /* VxWorks will suspend the task when it gets a hardware exception.  We
-     take the liberty of resuming the task for the application. */
-  if (taskIsSuspended (taskIdSelf ()) != 0)
-    taskResume (taskIdSelf ());
-
   __gnat_map_signal (sig);
 
 }
index 411d86d..eae409b 100644 (file)
@@ -86,7 +86,6 @@ package body System.Interrupt_Management is
 
    procedure Notify_Exception (signo : Signal) is
       Mask   : aliased sigset_t;
-      My_Id  : t_id;
 
       Result : int;
       pragma Unreferenced (Result);
@@ -96,16 +95,6 @@ package body System.Interrupt_Management is
       Result := sigdelset (Mask'Access, signo);
       Result := pthread_sigmask (SIG_SETMASK, Mask'Unchecked_Access, null);
 
-      --  VxWorks will suspend the task when it gets a hardware
-      --  exception.  We take the liberty of resuming the task
-      --  for the application.
-
-      My_Id := taskIdSelf;
-
-      if taskIsSuspended (My_Id) /= 0 then
-         Result := taskResume (My_Id);
-      end if;
-
       Map_And_Raise_Exception (signo);
    end Notify_Exception;