|
|
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: * Mach Operating System
27: * Copyright (c) 1989 Carnegie-Mellon University
28: * Copyright (c) 1988 Carnegie-Mellon University
29: * Copyright (c) 1987 Carnegie-Mellon University
30: * All rights reserved. The CMU software License Agreement specifies
31: * the terms and conditions for use and redistribution.
32: */
33:
34: /*
35: * File: kern/server_loop.c
36: *
37: * A common server loop for builtin pagers.
38: */
39:
40: /*
41: * Must define symbols for:
42: * SERVER_NAME String name of this module
43: * TERMINATE_FUNCTION How to handle port death
44: * SERVER_LOOP Routine name for the loop
45: * SERVER_DISPATCH MiG function(s) to handle message
46: *
47: * May optionally define:
48: * RECEIVE_OPTION Receive option (default NONE)
49: * RECEIVE_TIMEOUT Receive timeout (default 0)
50: * TIMEOUT_FUNCTION Timeout handler (default null)
51: *
52: * Must redefine symbols for pager_server functions.
53: */
54:
55: #ifndef RECEIVE_OPTION
56: #define RECEIVE_OPTION MSG_OPTION_NONE
57: #endif RECEIVE_OPTION
58:
59: #ifndef RECEIVE_TIMEOUT
60: #define RECEIVE_TIMEOUT 0
61: #endif RECEIVE_TIMEOUT
62:
63: #ifndef TIMEOUT_FUNCTION
64: #define TIMEOUT_FUNCTION
65: #endif TIMEOUT_FUNCTION
66:
67: #import <mach/boolean.h>
68: #import <mach/port.h>
69: #import <mach/message.h>
70: #import <mach/notify.h>
71:
72: void SERVER_LOOP(rcv_set, do_notify)
73: port_t rcv_set;
74: boolean_t do_notify;
75: {
76: msg_return_t r;
77: port_t my_notify;
78: port_t my_self;
79: vm_offset_t messages;
80: register
81: msg_header_t *in_msg;
82: msg_header_t *out_msg;
83:
84: /*
85: * Find out who we are.
86: */
87:
88: my_self = task_self();
89:
90: if (do_notify) {
91: my_notify = task_notify();
92:
93: if (port_set_add(my_self, rcv_set, my_notify)
94: != KERN_SUCCESS) {
95: printf("%s: can't enable notify port", SERVER_NAME);
96: panic(SERVER_NAME);
97: }
98: }
99:
100: /*
101: * Allocate our message buffers.
102: * [The buffers must reside in kernel space, since other
103: * message buffers (in the mach_user_external module) are.]
104: */
105:
106: if ((messages = kmem_alloc(kernel_map, 2 * MSG_SIZE_MAX)) == 0) {
107: printf("%s: can't allocate message buffers", SERVER_NAME);
108: panic(SERVER_NAME);
109: }
110: in_msg = (msg_header_t *) messages;
111: out_msg = (msg_header_t *) (messages + MSG_SIZE_MAX);
112:
113: /*
114: * Service loop... receive messages and process them.
115: */
116:
117: for (;;) {
118: in_msg->msg_local_port = rcv_set;
119: in_msg->msg_size = MSG_SIZE_MAX;
120: if ((r = msg_receive(in_msg, RECEIVE_OPTION, RECEIVE_TIMEOUT)) != RCV_SUCCESS) {
121: if (r == RCV_TIMED_OUT) {
122: TIMEOUT_FUNCTION ;
123: } else {
124: printf("%s: receive failed, 0x%x.\n", SERVER_NAME, r);
125: }
126: continue;
127: }
128: if (do_notify && (in_msg->msg_local_port == my_notify)) {
129: notification_t *n = (notification_t *) in_msg;
130: switch(in_msg->msg_id) {
131: case NOTIFY_PORT_DELETED:
132: TERMINATE_FUNCTION(n->notify_port);
133: break;
134: default:
135: printf("%s: wierd notification (%d)\n", SERVER_NAME, in_msg->msg_id);
136: printf("port = 0x%x.\n", n->notify_port);
137: break;
138: }
139: continue;
140: }
141: if (SERVER_DISPATCH(in_msg, out_msg) &&
142: (out_msg->msg_remote_port != PORT_NULL))
143: msg_send(out_msg, MSG_OPTION_NONE, 0);
144: }
145: }
146:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.