longjmp.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:3k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* longjmp.c - non local goto function */
  2. /* Copyright 1984-1995 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01f,27dec95,mem  restored use of longjmp for VxSim hppa.
  7. 01e,27oct95,jdi  doc: setjmp() no longer a macro (SPR 5300).
  8. 01d,27feb95,rhp  reconcile comments with ansiSetjmp.c documentation
  9. 01c,12may94,ms   removed longjmp for VxSIm hppa (use macro instead).
  10. 01b,20sep92,smb  documentation additions
  11. 01a,31aug92,rrr  written.
  12. */
  13. /*
  14. DESCRIPTION
  15. INCLUDE FILE: setjmp.h
  16. SEE ALSO: American National Standard X3.159-1989
  17. NOMANUAL
  18. */
  19. #include "vxWorks.h"
  20. #include "setjmp.h"
  21. #include "private/sigLibP.h"
  22. #include "taskLib.h"
  23. #define JMP_DATA(env) ((int *) 
  24.  (((char *)env) + sizeof(jmp_buf) - 2*sizeof(int)))
  25. /*******************************************************************************
  26. *
  27. * _setjmpSetup - portable part of setjmp
  28. *
  29. * RETURNS: Nothing.
  30. *
  31. * NOMANUAL
  32. */
  33. void _setjmpSetup
  34.     (
  35.     jmp_buf env,
  36.     int val
  37.     )
  38.     {
  39.     int *p;
  40.     p = JMP_DATA(env);
  41.     p[0] = (int)taskIdCurrent;
  42.     if (val)
  43. {
  44. p[0] |= 1;
  45. p[1] = (taskIdCurrent->pSignalInfo == NULL) ?
  46. 0 : taskIdCurrent->pSignalInfo->sigt_blocked;
  47. }
  48.     }
  49. /*******************************************************************************
  50. *
  51. * longjmp - perform non-local goto (ANSI)
  52. *
  53. * longjmp - perform non-local goto by restoring saved environment (ANSI) 
  54. * This routine restores the environment saved by the most recent
  55. * invocation of the setjmp() routine that used the same `jmp_buf'
  56. * specified in the argument <env>.  The restored environment includes
  57. * the program counter, thus transferring control to the setjmp()
  58. * caller.
  59. * If there was no corresponding setjmp() call, or if the function
  60. * containing the corresponding setjmp() routine call has already
  61. * returned, the behavior of longjmp() is unpredictable.
  62. *  
  63. * All accessible objects in memory retain their values as of the time
  64. * longjmp() was called, with one exception: local objects on the C
  65. * stack that are not declared `volatile', and have been changed
  66. * between the setjmp() invocation and the longjmp() call, have
  67. * unpredictable values.
  68. *  
  69. * The longjmp() function executes correctly in contexts of signal
  70. * handlers and any of their associated functions (but not from interrupt
  71. * handlers).
  72. * WARNING: Do not use longjmp() or setjmp() from an ISR.
  73. *
  74. * RETURNS:
  75. * This routine does not return to its caller.
  76. * Instead, it causes setjmp() to return <val>, unless <val> is 0; in
  77. * that case setjmp() returns 1.
  78. * SEE ALSO
  79. * setjmp()
  80. *
  81. * SEE ALSO: setjmp()
  82. */
  83. void longjmp
  84.     (
  85.     jmp_buf env,
  86.     int val
  87.     )
  88.     {
  89.     int *p;
  90.     p = JMP_DATA(env);
  91.     if ((p[0] & ~1) != (int)taskIdCurrent)
  92. taskSuspend(0);
  93.     if ((p[0] & 1) && (_func_sigprocmask != NULL))
  94. _func_sigprocmask(SIG_SETMASK, &p[1], 0);
  95.     _sigCtxRtnValSet((REG_SET *)env, val == 0 ? 1 : val);
  96.     _sigCtxLoad((REG_SET *)env);
  97.     }