erl_timeout.c
来自「OTP是开放电信平台的简称」· C语言 代码 · 共 161 行
C
161 行
/* ``The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in * compliance with the License. You should have received a copy of the * Erlang Public License along with this software. If not, it can be * retrieved via the world wide web at http://www.erlang.org/. * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. * * The Initial Developer of the Original Code is Ericsson Utvecklings AB. * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings * AB. All Rights Reserved.'' * * $Id$ *//* timeout.c * * todo: use posix timers (timer_create etc) instead of setitimer. * */#if !defined(__WIN32__) && !defined(VXWORKS)/* FIXME: well, at least I can compile now... */#include "eidef.h"#include <stdio.h>#include <stdlib.h>#include <setjmp.h>#include <signal.h>#if TIME_WITH_SYS_TIME# include <sys/time.h># include <time.h>#else# if HAVE_SYS_TIME_H# include <sys/time.h># else# include <time.h># endif#endif#include "erl_timeout.h"typedef struct jmp_s { jmp_buf jmpbuf; struct itimerval timerinfo; void *siginfo; struct jmp_s *next;} *jmp_t;static jmp_t push(jmp_t j);static jmp_t pop(void);static void timeout_handler(int dummy);jmp_buf *timeout_setup(int ms){ struct itimerval t; jmp_t j; void *s;#ifdef DEBUG fprintf(stderr,"timeout setup\n");#endif s=signal(SIGALRM,timeout_handler); /* set the timer */ t.it_interval.tv_sec = 0; t.it_interval.tv_usec = 0; t.it_value.tv_sec = ms / 1000; t.it_value.tv_usec = (ms % 1000) * 1000; /* get a jump buffer and save it */ j = malloc(sizeof(*j)); /* FIXME check result */ j->siginfo = s; push(j); setitimer(ITIMER_REAL,&t,&(j->timerinfo)); return &(j->jmpbuf);}int timeout_cancel(void){ jmp_t j;#ifdef DEBUG fprintf(stderr,"timeout cancel\n");#endif /* retrieve the jump buffer */ j=pop(); /* restore the timer and signal disposition */ setitimer(ITIMER_REAL,&(j->timerinfo),NULL); signal(SIGALRM,j->siginfo); free(j); return 0;}void timeout_handler(int dummy){ jmp_t j;#ifdef DEBUG fprintf(stderr,"timeout handler\n");#endif /* retrieve the jump buffer */ j=pop(); /* restore the timer and signal disposition */ setitimer(ITIMER_REAL,&(j->timerinfo),NULL); signal(SIGALRM,j->siginfo); free(j); longjmp(j->jmpbuf,JMPVAL); return; /* not reached */}/* a simple stack for saving the jump buffer allows us to pass a * variable between functions that don't call each other, in a way * that will survive the longjmp(). *//* FIXME problem for threaded ? */static jmp_t jmp_head=NULL;#ifdef DEBUGstatic int depth = 0;static int maxdepth = 0;#endifstatic jmp_t push(jmp_t j){ j->next = jmp_head; jmp_head = j;#ifdef DEBUG depth++; if (depth > maxdepth) maxdepth = depth;#endif return j;}static jmp_t pop(void){ jmp_t j = jmp_head; if (j) jmp_head = j->next;#ifdef DEBUG depth--;#endif return j;}#endif /* platform */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?