⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 longjmp.c

📁 VXWORKS源代码
💻 C
字号:
/* longjmp.c - non local goto function *//* Copyright 1984-1995 Wind River Systems, Inc. *//*modification history--------------------01f,27dec95,mem  restored use of longjmp for VxSim hppa.01e,27oct95,jdi  doc: setjmp() no longer a macro (SPR 5300).01d,27feb95,rhp  reconcile comments with ansiSetjmp.c documentation01c,12may94,ms   removed longjmp for VxSIm hppa (use macro instead).01b,20sep92,smb  documentation additions01a,31aug92,rrr  written.*//*DESCRIPTIONINCLUDE FILE: setjmp.hSEE ALSO: American National Standard X3.159-1989NOMANUAL*/#include "vxWorks.h"#include "setjmp.h"#include "private/sigLibP.h"#include "taskLib.h"#define JMP_DATA(env)	((int *) \			 (((char *)env) + sizeof(jmp_buf) - 2*sizeof(int)))/********************************************************************************* _setjmpSetup - portable part of setjmp** RETURNS: Nothing.** NOMANUAL*/void _setjmpSetup    (    jmp_buf env,    int val    )    {    int *p;    p = JMP_DATA(env);    p[0] = (int)taskIdCurrent;    if (val)	{	p[0] |= 1;	p[1] = (taskIdCurrent->pSignalInfo == NULL) ?		0 : taskIdCurrent->pSignalInfo->sigt_blocked;	}    }/********************************************************************************* longjmp - perform non-local goto	(ANSI)** longjmp - perform non-local goto by restoring saved environment (ANSI) * * This routine restores the environment saved by the most recent* invocation of the setjmp() routine that used the same `jmp_buf'* specified in the argument <env>.  The restored environment includes* the program counter, thus transferring control to the setjmp()* caller.* * If there was no corresponding setjmp() call, or if the function* containing the corresponding setjmp() routine call has already* returned, the behavior of longjmp() is unpredictable.*  * All accessible objects in memory retain their values as of the time* longjmp() was called, with one exception: local objects on the C* stack that are not declared `volatile', and have been changed* between the setjmp() invocation and the longjmp() call, have* unpredictable values.*  * The longjmp() function executes correctly in contexts of signal* handlers and any of their associated functions (but not from interrupt* handlers).* * WARNING: Do not use longjmp() or setjmp() from an ISR.** RETURNS:* This routine does not return to its caller.* Instead, it causes setjmp() to return <val>, unless <val> is 0; in* that case setjmp() returns 1.* * SEE ALSO* setjmp()** SEE ALSO: setjmp()*/void longjmp    (    jmp_buf env,    int val    )    {    int *p;    p = JMP_DATA(env);    if ((p[0] & ~1) != (int)taskIdCurrent)	taskSuspend(0);    if ((p[0] & 1) && (_func_sigprocmask != NULL))	_func_sigprocmask(SIG_SETMASK, &p[1], 0);    _sigCtxRtnValSet((REG_SET *)env, val == 0 ? 1 : val);    _sigCtxLoad((REG_SET *)env);    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -