summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-03-19 16:38:16 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-03-19 16:38:16 +0000
commit1e60d6c9e0521284f6386c4fbc66f1cc799f2ed9 (patch)
tree928f1f5f0118c75c8ca876a91a70b1e5e58226b7
parente01d4b0082c059469de4e8492b21c9b220ea56a8 (diff)
downloadnuttx-1e60d6c9e0521284f6386c4fbc66f1cc799f2ed9.tar.gz
nuttx-1e60d6c9e0521284f6386c4fbc66f1cc799f2ed9.tar.bz2
nuttx-1e60d6c9e0521284f6386c4fbc66f1cc799f2ed9.zip
Must preserve the value of errno; it can be changed by signal handling
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@95 42af7a65-404d-4744-a932-0658087f49c3
-rw-r--r--nuttx/arch/c5471/src/up_sigdeliver.c17
-rw-r--r--nuttx/arch/dm320/src/up_sigdeliver.c19
2 files changed, 33 insertions, 3 deletions
diff --git a/nuttx/arch/c5471/src/up_sigdeliver.c b/nuttx/arch/c5471/src/up_sigdeliver.c
index 528a2864e..8ec10599a 100644
--- a/nuttx/arch/c5471/src/up_sigdeliver.c
+++ b/nuttx/arch/c5471/src/up_sigdeliver.c
@@ -80,6 +80,13 @@ void up_sigdeliver(void)
uint32 regs[XCPTCONTEXT_REGS];
sig_deliver_t sigdeliver;
+ /* Save the errno. This must be preserved throughout the
+ * signal handling so that the the user code final gets
+ * the correct errno value (probably EINTR).
+ */
+
+ int saved_errno = rtcb->errno;
+
up_ledon(LED_SIGNAL);
dbg("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n",
@@ -110,11 +117,19 @@ void up_sigdeliver(void)
sigdeliver(rtcb);
+ /* Output any debug messaged BEFORE restoreing errno
+ * (becuase they may alter errno), then restore the
+ * original errno that is needed by the user logic
+ * (it is probably EINTR).
+ */
+
+ dbg("Resuming\n");
+ rtcb->errno = saved_errno;
+
/* Then restore the correct state for this thread of
* execution.
*/
up_ledoff(LED_SIGNAL);
- dbg("Resuming\n");
up_fullcontextrestore(regs);
}
diff --git a/nuttx/arch/dm320/src/up_sigdeliver.c b/nuttx/arch/dm320/src/up_sigdeliver.c
index 847ca8a84..3d4e98bc1 100644
--- a/nuttx/arch/dm320/src/up_sigdeliver.c
+++ b/nuttx/arch/dm320/src/up_sigdeliver.c
@@ -77,9 +77,16 @@
void up_sigdeliver(void)
{
_TCB *rtcb = (_TCB*)g_readytorun.head;
- uint32 regs[XCPTCONTEST_REGS];
+ uint32 regs[XCPTCONTEXT_REGS];
sig_deliver_t sigdeliver;
+ /* Save the errno. This must be preserved throughout the
+ * signal handling so that the the user code final gets
+ * the correct errno value (probably EINTR).
+ */
+
+ int saved_errno = rtcb->errno;
+
dbg("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n",
rtcb, rtcb->xcp.sigdeliver, rtcb->sigpendactionq.head);
ASSERT(rtcb->xcp.sigdeliver != NULL);
@@ -108,10 +115,18 @@ void up_sigdeliver(void)
sigdeliver(rtcb);
+ /* Output any debug messaged BEFORE restoreing errno
+ * (becuase they may alter errno), then restore the
+ * original errno that is needed by the user logic
+ * (it is probably EINTR).
+ */
+
+ dbg("Resuming\n");
+ rtcb->errno = saved_errno;
+
/* Then restore the correct state for this thread of
* execution.
*/
- dbg("Resuming\n");
up_fullcontextrestore(regs);
}