|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: ! 25: /* ! 26: * Copyright (c) 1993 NeXT Computer, Inc. ! 27: * ! 28: * Timeout and tick support. ! 29: * ! 30: * HISTORY ! 31: * ! 32: * 30 Mar 1993 ? at NeXT ! 33: * Created. ! 34: */ ! 35: ! 36: #import <mach/mach_types.h> ! 37: ! 38: #import <kern/thread_call.h> ! 39: ! 40: #import "PCprivate.h" ! 41: ! 42: static ! 43: void PCpendTimeout( ! 44: PCcontext_t context); ! 45: ! 46: static ! 47: void PCpendTick( ! 48: PCcontext_t context); ! 49: ! 50: #define TVALSPEC_USEC(usec) \ ! 51: ((tvalspec_t) { ((usec) / USEC_PER_SEC), ((usec) * NSEC_PER_USEC) } ) ! 52: ! 53: static __inline__ ! 54: void ! 55: PCscheduleTimeout( ! 56: PCcontext_t context ! 57: ) ! 58: { ! 59: context->pendingTimers &= ~PC_CALL_TIMEOUT; ! 60: ! 61: if (context->expectedTimers & PC_CALL_TIMEOUT) ! 62: thread_call_func_cancel( ! 63: (thread_call_func_t)PCpendTimeout, context, FALSE); ! 64: ! 65: if (context->runOptions & PC_RUN_TIMEOUT) { ! 66: thread_call_func_delayed( ! 67: (thread_call_func_t)PCpendTimeout, context, ! 68: deadline_from_interval( ! 69: TVALSPEC_USEC(context->timeout))); ! 70: ! 71: context->expectedTimers |= PC_CALL_TIMEOUT; ! 72: } ! 73: else ! 74: context->expectedTimers &= ~PC_CALL_TIMEOUT; ! 75: } ! 76: ! 77: static ! 78: void ! 79: PCpendTimeout( ! 80: PCcontext_t context ! 81: ) ! 82: { ! 83: if (context->expectedTimers & PC_CALL_TIMEOUT) { ! 84: if (context->running) ! 85: context->pendingTimers |= PC_CALL_TIMEOUT; ! 86: ! 87: context->expectedTimers &= ~PC_CALL_TIMEOUT; ! 88: } ! 89: } ! 90: ! 91: static __inline__ ! 92: void ! 93: PCscheduleTick( ! 94: PCcontext_t context ! 95: ) ! 96: { ! 97: if (context->pendingTimers & PC_CALL_TICK) { ! 98: context->pendingCallbacks |= PC_CALL_TICK; ! 99: ! 100: context->pendingTimers &= ~PC_CALL_TICK; ! 101: } ! 102: ! 103: if (context->expectedTimers & PC_CALL_TICK) ! 104: /* do nothing */; ! 105: else if (context->runOptions & PC_RUN_TICK) { ! 106: thread_call_func_delayed( ! 107: (thread_call_func_t)PCpendTick, context, ! 108: deadline_from_interval( ! 109: TVALSPEC_USEC(context->tick))); ! 110: ! 111: context->expectedTimers |= PC_CALL_TICK; ! 112: } ! 113: } ! 114: ! 115: static ! 116: void ! 117: PCpendTick( ! 118: PCcontext_t context ! 119: ) ! 120: { ! 121: if (context->expectedTimers & PC_CALL_TICK) { ! 122: context->pendingTimers |= PC_CALL_TICK; ! 123: ! 124: context->expectedTimers &= ~PC_CALL_TICK; ! 125: } ! 126: } ! 127: ! 128: void ! 129: PCscheduleTimers( ! 130: PCcontext_t context ! 131: ) ! 132: { ! 133: PCscheduleTimeout(context); ! 134: ! 135: PCscheduleTick(context); ! 136: } ! 137: ! 138: void ! 139: PCdeliverTimers( ! 140: PCcontext_t context ! 141: ) ! 142: { ! 143: context->pendingCallbacks |= ! 144: context->pendingTimers & (PC_CALL_TIMEOUT | PC_CALL_TICK); ! 145: ! 146: context->pendingTimers &= ~(PC_CALL_TIMEOUT | PC_CALL_TICK); ! 147: } ! 148: ! 149: boolean_t ! 150: PCtimersPending( ! 151: PCcontext_t context ! 152: ) ! 153: { ! 154: boolean_t pending; ! 155: ! 156: pending = (context->pendingTimers & (PC_CALL_TIMEOUT | PC_CALL_TICK)) != 0; ! 157: ! 158: return (pending); ! 159: } ! 160: ! 161: void ! 162: PCcancelTimers( ! 163: PCcontext_t context ! 164: ) ! 165: { ! 166: thread_call_func_cancel( ! 167: (thread_call_func_t)PCpendTimeout, context, FALSE); ! 168: thread_call_func_cancel( ! 169: (thread_call_func_t)PCpendTick, context, FALSE); ! 170: } ! 171: ! 172: void ! 173: PCcancelAllTimers( ! 174: thread_t thread ! 175: ) ! 176: { ! 177: PCshared_t shared = threadPCShared(thread); ! 178: int i; ! 179: ! 180: for (i = 0; i < PCMAXCONTEXT; i++) ! 181: PCcancelTimers(&shared->contexts[i]); ! 182: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.