From: ian Date: Sat, 17 May 2008 14:59:24 +0000 (+0000) Subject: found implementation of SIGXCPU etc. X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=b97fcba39c56c6caef0e9421c80373b91bbaa2ea;p=trains.git found implementation of SIGXCPU etc. --- diff --git a/hostside/rtprio.c b/hostside/rtprio.c new file mode 100644 index 0000000..f8f5e3b --- /dev/null +++ b/hostside/rtprio.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include +#include +#include +#include + +#define MAXCREDIT 5 +#define MAXNTH 2 + +static time_t now, last; +static struct rlimit rlcpu; +static struct sigaction saxcpu; + +static void gnow(void) { time(&now); } + +static void makepending(void) { + int r; + last= now; + r= sigaction(SIGXCPU, &saxcpu, 0); assert(!r); + r= setrlimit(RLIMIT_CPU, &rlcpu); assert(!r); +} + +static void exceeded(void) { + const char m[]= "cpu limit exceeded\n"; + write(2,m,sizeof(m)-1); + raise(SIGXCPU); +} + +static void xcpuhandler(int ignored) { + int credit; + gnow(); + credit= (now - last)/MAXNTH; + if (credit <= 0) exceeded(); + if (credit > MAXCREDIT) credit= MAXCREDIT; + rlcpu.rlim_cur += credit; + makepending(); +} + +int main(void) { + int r; + + memset(&saxcpu,0,sizeof(saxcpu)); + saxcpu.sa_handler= xcpuhandler; + sigemptyset(&saxcpu.sa_mask); + saxcpu.sa_flags= SA_RESETHAND | SA_RESTART | SA_NODEFER; + + r= getrlimit(RLIMIT_CPU, &rlcpu); assert(!r); + + gnow(); + rlcpu.rlim_cur= MAXCREDIT; + makepending(); + + for (;;); +}