|
|
1.1 ! root 1: /*ident "%W%" */ ! 2: /************************************************************************** ! 3: Copyright (c) 1984 AT&T ! 4: All Rights Reserved ! 5: ! 6: THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T ! 7: ! 8: The copyright notice above does not evidence any ! 9: actual or intended publication of such source code. ! 10: ! 11: *****************************************************************************/ ! 12: #include <task.h> ! 13: ! 14: const NASS = NSIG; ! 15: ! 16: static Interrupt_handler* hnd[NASS]; // hnd[i] is used for signal i ! 17: static SIG_PF old_handlers[NASS]; ! 18: ! 19: Interrupt_alerter::Interrupt_alerter() ! 20: : ("Interrupt_alerter") ! 21: { ! 22: for(;;) { ! 23: sleep(); ! 24: for (register Interrupt_handler** p = &hnd[0]; p < &hnd[NASS]; p++) ! 25: if (*p && (*p)->got_interrupt) { ! 26: (*p)->alert(); ! 27: } ! 28: } ! 29: } ! 30: ! 31: /* Note: the type of this function must match the definition of SIG_FUNC_TYP ! 32: in signal.h. */ ! 33: void ! 34: sigFunc(int sigNo) ! 35: { ! 36: if ((unsigned)sigNo >= (unsigned)NASS) ! 37: object::task_error(E_BADSIG, (object*)0); ! 38: Interrupt_handler* as = hnd[sigNo]; ! 39: if (as == 0) ! 40: object::task_error(E_NO_HNDLR, (object*)0); ! 41: as->interrupt(); ! 42: as->got_interrupt = 1; ! 43: sched::priority_sched = &interrupt_alerter; ! 44: signal(sigNo, sigFunc); //reset ! 45: //MORE: ifdef SVR3 use sigset ! 46: } ! 47: ! 48: Interrupt_handler::Interrupt_handler(int vecid) ! 49: : id(vecid), got_interrupt(0) ! 50: { ! 51: if ((unsigned)id >= (unsigned)NASS) ! 52: task_error(E_BADSIG, this); ! 53: if((old = hnd[id]) == 0) ! 54: old_handlers[id] = signal(id, sigFunc); ! 55: else ! 56: if (old->got_interrupt) { ! 57: old->alert(); ! 58: } ! 59: hnd[id] = this; ! 60: this_task()->keep_waiting(); ! 61: } ! 62: ! 63: Interrupt_handler::~Interrupt_handler() ! 64: { ! 65: this_task()->dont_wait(); ! 66: for(register Interrupt_handler** as = &hnd[id];; as = &(*as)->old) { ! 67: if (*as == this) break; ! 68: if (*as == 0) ! 69: task_error(E_LOSTHNDLR, this); ! 70: } ! 71: if ((*as = old) == 0) ! 72: signal(id, old_handlers[id]); ! 73: } ! 74: ! 75: void ! 76: Interrupt_handler::interrupt() ! 77: { ! 78: } ! 79: ! 80: int ! 81: Interrupt_handler::pending() ! 82: { ! 83: if (!got_interrupt) ! 84: return 1; ! 85: got_interrupt = 0; ! 86: return 0; ! 87: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.