summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libports/manage-one-thread.c121
1 files changed, 2 insertions, 119 deletions
diff --git a/libports/manage-one-thread.c b/libports/manage-one-thread.c
index a937d814d..4b92148bc 100644
--- a/libports/manage-one-thread.c
+++ b/libports/manage-one-thread.c
@@ -18,125 +18,8 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
-#include <stdio.h>
-#include <assert.h>
#include "ports.h"
-mach_msg_return_t
-ported_mach_msg_server_timeout (boolean_t (*demux) (mach_msg_header_t *request,
- mach_msg_header_t *reply),
- mach_msg_size_t max_size,
- mach_port_t rcv_name,
- mach_msg_option_t option,
- mach_msg_timeout_t timeout)
-{
- register mig_reply_header_t *request, *reply;
- register mach_msg_return_t mr;
-
- if (max_size == 0)
- {
-#ifdef MACH_RCV_LARGE
- option |= MACH_RCV_LARGE;
- max_size = 2 * __vm_page_size; /* Generic. Good? XXX */
-#else
- max_size = 4 * __vm_page_size; /* XXX */
-#endif
- }
-
- request = alloca (max_size);
- reply = alloca (max_size);
-
- while (1)
- {
-get_request:
- mr = mach_msg (&request->Head, MACH_RCV_MSG|option,
- 0, max_size, rcv_name,
- timeout, MACH_PORT_NULL);
- while (mr == MACH_MSG_SUCCESS)
- {
- /* We have a request message.
- * Pass it to DEMUX for processing. */
-
- (void) (*demux) (&request->Head, &reply->Head);
- assert (reply->Head.msgh_size <= max_size);
-
- switch (reply->RetCode)
- {
- case KERN_SUCCESS:
- /* Hunky dory. */
- break;
-
- case MIG_NO_REPLY:
- /* The server function wanted no reply sent.
- * Loop for another request. */
- goto get_request;
-
- default:
- /* Some error; destroy the request message to release any
- * port rights or VM it holds. Don't destroy the reply port
- * right, so we can send an error message. */
- request->Head.msgh_remote_port = MACH_PORT_NULL;
- mach_msg_destroy (&request->Head);
- break;
- }
-
- if (reply->Head.msgh_remote_port == MACH_PORT_NULL)
- {
- /* No reply port, so destroy the reply. */
- if (reply->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX)
- mach_msg_destroy (&reply->Head);
- goto get_request;
- }
-
- /* Send the reply and the get next request. */
-
- {
- /* Swap the request and reply buffers. mach_msg will read the
- * reply message from the buffer we pass and write the new
- * request message to the same buffer. */
- void *tmp = request;
- request = reply;
- reply = tmp;
- }
-
- mr = mach_msg (&request->Head,
- MACH_SEND_MSG|MACH_RCV_MSG|option,
- request->Head.msgh_size, max_size, rcv_name,
- timeout, MACH_PORT_NULL);
- }
-
- /* A message error occurred. */
-
- switch (mr)
- {
- case MACH_RCV_TOO_LARGE:
-#ifdef MACH_RCV_LARGE
- /* The request message is larger than MAX_SIZE, and has not
- * been dequeued. The message header has the actual size of
- * the message. We recurse here in hopes that the compiler
- * will optimize the tail-call and allocate some more stack
- * space instead of way too much. */
- return ported_mach_msg_server_timeout (demux, request->Head.msgh_size,
- rcv_name, option, timeout);
-#else
- /* XXX the kernel has destroyed the msg */
- break;
-#endif
- case MACH_SEND_INVALID_DEST:
- /* The reply can't be delivered, so destroy it. This error
- * indicates only that the requester went away, so we
- * continue and get the next request. */
- mach_msg_destroy (&request->Head);
- break;
-
- default:
- /* Some other form of lossage; return to caller. */
- return mr;
- }
- }
-}
-
-
void
ports_manage_port_operations_one_thread (struct port_bucket *bucket,
ports_demuxer_type demuxer,
@@ -234,8 +117,8 @@ ports_manage_port_operations_one_thread (struct port_bucket *bucket,
_ports_thread_online (&bucket->threadpool, &thread);
do
- err = ported_mach_msg_server_timeout (internal_demuxer, 0, bucket->portset,
- timeout ? MACH_RCV_TIMEOUT : 0, timeout);
+ err = mach_msg_server_timeout (internal_demuxer, 0, bucket->portset,
+ timeout ? MACH_RCV_TIMEOUT : 0, timeout);
while (err != MACH_RCV_TIMED_OUT);
_ports_thread_offline (&bucket->threadpool, &thread);
}