diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2007-03-19 16:38:16 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2007-03-19 16:38:16 +0000 |
commit | 1e60d6c9e0521284f6386c4fbc66f1cc799f2ed9 (patch) | |
tree | 928f1f5f0118c75c8ca876a91a70b1e5e58226b7 /nuttx/arch/dm320 | |
parent | e01d4b0082c059469de4e8492b21c9b220ea56a8 (diff) | |
download | px4-nuttx-1e60d6c9e0521284f6386c4fbc66f1cc799f2ed9.tar.gz px4-nuttx-1e60d6c9e0521284f6386c4fbc66f1cc799f2ed9.tar.bz2 px4-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
Diffstat (limited to 'nuttx/arch/dm320')
-rw-r--r-- | nuttx/arch/dm320/src/up_sigdeliver.c | 19 |
1 files changed, 17 insertions, 2 deletions
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); } |