1/* 2 * Copyright (c) 2010 Apple Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of Apple Inc. ("Apple") nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * 30 * Portions of this software have been released under the following terms: 31 * 32 * (c) Copyright 1989-1993 OPEN SOFTWARE FOUNDATION, INC. 33 * (c) Copyright 1989-1993 HEWLETT-PACKARD COMPANY 34 * (c) Copyright 1989-1993 DIGITAL EQUIPMENT CORPORATION 35 * 36 * To anyone who acknowledges that this file is provided "AS IS" 37 * without any express or implied warranty: 38 * permission to use, copy, modify, and distribute this file for any 39 * purpose is hereby granted without fee, provided that the above 40 * copyright notices and this notice appears in all source code copies, 41 * and that none of the names of Open Software Foundation, Inc., Hewlett- 42 * Packard Company or Digital Equipment Corporation be used 43 * in advertising or publicity pertaining to distribution of the software 44 * without specific, written prior permission. Neither Open Software 45 * Foundation, Inc., Hewlett-Packard Company nor Digital 46 * Equipment Corporation makes any representations about the suitability 47 * of this software for any purpose. 48 * 49 * Copyright (c) 2007, Novell, Inc. All rights reserved. 50 * Redistribution and use in source and binary forms, with or without 51 * modification, are permitted provided that the following conditions 52 * are met: 53 * 54 * 1. Redistributions of source code must retain the above copyright 55 * notice, this list of conditions and the following disclaimer. 56 * 2. Redistributions in binary form must reproduce the above copyright 57 * notice, this list of conditions and the following disclaimer in the 58 * documentation and/or other materials provided with the distribution. 59 * 3. Neither the name of Novell Inc. nor the names of its contributors 60 * may be used to endorse or promote products derived from this 61 * this software without specific prior written permission. 62 * 63 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 64 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 65 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 66 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY 67 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 68 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 69 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 70 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 71 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 72 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 73 * 74 * @APPLE_LICENSE_HEADER_END@ 75 */ 76 77/* 78** 79** NAME: 80** 81** dgrq.c 82** 83** FACILITY: 84** 85** Remote Procedure Call (RPC) 86** 87** ABSTRACT: 88** 89** DG protocol service routines. Handles receive queues. 90** 91** 92*/ 93 94#include <dg.h> 95#include <dgrq.h> 96#include <dgpkt.h> 97 98/* ========================================================================= */ 99 100#define DEFAULT_WAKE_THREAD_QSIZE (6 * 1024) 101 102/* ========================================================================= */ 103 104/* 105 * R P C _ _ D G _ R E C V Q _ I N I T 106 * 107 * Initialize a receive queue (rpc_dg_recv_q_t). 108 */ 109 110PRIVATE void rpc__dg_recvq_init 111( 112 rpc_dg_recvq_p_t rq 113) 114{ 115 /* 116 * presumably the call is either locked or 'private' at this point 117 * RPC_DG_CALL_LOCK_ASSERT(call); 118 */ 119 120 rq->head = rq->last_inorder = NULL; 121 122 /* 123 * high_rcv_frag_size should be set to zero. However, since its 124 * primary use is a detection of the sender's MBF capability, we 125 * start it from rpc_c_dg_initial_max_pkt_size for a little 126 * performance improvement. 127 */ 128 rq->high_rcv_frag_size = RPC_C_DG_INITIAL_MAX_PKT_SIZE; 129 rq->next_fragnum = 0; 130 rq->high_fragnum = -1; 131 rq->high_serial_num = -1; 132 rq->head_fragnum = -1; 133 rq->head_serial_num = -1; 134 135 rq->wake_thread_qsize = DEFAULT_WAKE_THREAD_QSIZE; 136 rq->max_queue_len = RPC_C_DG_MAX_RECVQ_LEN; 137 138#ifdef DEBUG 139 /* 140 * For testing, allow an override via debug switch 10. 141 */ 142 if (RPC_DBG (rpc_es_dbg_dg_rq_qsize, 1)) 143 rq->wake_thread_qsize = ((unsigned32) 144 (rpc_g_dbg_switches[(int) rpc_es_dbg_dg_rq_qsize])) * 1024; 145#endif 146 147 rq->queue_len = 0; 148 rq->inorder_len = 0; 149 rq->recving_frags = false; 150 rq->all_pkts_recvd = false; 151 rq->is_way_validated= false; 152} 153 154/* 155 * R P C _ _ D G _ R E C V Q _ F R E E 156 * 157 * Frees data referenced by a receive queue (rpc_dg_recv_q_t). The 158 * receive queue itself is NOT freed, since it's (assumed to be) part 159 * of a larger structure. 160 */ 161 162PRIVATE void rpc__dg_recvq_free 163( 164 rpc_dg_recvq_p_t rq 165) 166{ 167 /* 168 * Presumably the call is either locked or 'private' at this point. 169 * The NULL call handle passed to free_rqe() below, implies that we 170 * are sure that this call is not currently blocked waiting for a 171 * packet. 172 * 173 * RPC_DG_CALL_LOCK_ASSERT(call); 174 */ 175 176 while (rq->head != NULL) { 177 rpc_dg_recvq_elt_p_t rqe = rq->head; 178 179 rq->head = rqe->next; 180 rpc__dg_pkt_free_rqe(rqe, NULL); 181 } 182} 183