rx: Use _IsLast to check for last call in queue
[openafs.git] / src / rx / rx.c
index 37bdf2b..c33a451 100644 (file)
@@ -1425,7 +1425,7 @@ static void
 rxi_WakeUpTransmitQueue(struct rx_call *call)
 {
     if (call->tqWaiters || (call->flags & RX_CALL_TQ_WAIT)) {
-       dpf(("call %"AFS_PTR_FMT" has %d waiters and flags %d\n",
+       dpf(("call %p has %d waiters and flags %d\n",
             call, call->tqWaiters, call->flags));
 #ifdef RX_ENABLE_LOCKS
        MUTEX_ASSERT(&call->lock);
@@ -1455,7 +1455,7 @@ rx_NewCall(struct rx_connection *conn)
     SPLVAR;
 
     clock_NewTime();
-    dpf(("rx_NewCall(conn %"AFS_PTR_FMT")\n", conn));
+    dpf(("rx_NewCall(conn %p)\n", conn));
 
     NETPRI;
     clock_GetTime(&queueTime);
@@ -1669,7 +1669,7 @@ rx_NewCall(struct rx_connection *conn)
     MUTEX_EXIT(&call->lock);
     USERPRI;
 
-    dpf(("rx_NewCall(call %"AFS_PTR_FMT")\n", call));
+    dpf(("rx_NewCall(call %p)\n", call));
     return call;
 }
 
@@ -2062,7 +2062,7 @@ rx_GetCall(int tno, struct rx_service *cur_service, osi_socket * socketp)
                }
                MUTEX_ENTER(&rx_pthread_mutex);
                if (tno == rxi_fcfs_thread_num
-                       || opr_queue_IsEnd(&rx_incomingCallQueue, cursor)) {
+                       || opr_queue_IsLast(&rx_incomingCallQueue, cursor)) {
                    MUTEX_EXIT(&rx_pthread_mutex);
                    /* If we're the fcfs thread , then  we'll just use
                     * this call. If we haven't been able to find an optimal
@@ -2101,6 +2101,7 @@ rx_GetCall(int tno, struct rx_service *cur_service, osi_socket * socketp)
            opr_queue_Remove(&call->entry);
            MUTEX_EXIT(&rx_serverPool_lock);
            MUTEX_ENTER(&call->lock);
+           CLEAR_CALL_QUEUE_LOCK(call);
 
            if (call->flags & RX_CALL_WAIT_PROC) {
                call->flags &= ~RX_CALL_WAIT_PROC;
@@ -2119,7 +2120,6 @@ rx_GetCall(int tno, struct rx_service *cur_service, osi_socket * socketp)
                || opr_queue_First(&call->rq, struct rx_packet, entry)->header.seq != 1)
                rxi_SendAck(call, 0, 0, RX_ACK_DELAY, 0);
 
-           CLEAR_CALL_QUEUE_LOCK(call);
            break;
        } else {
            /* If there are no eligible incoming calls, add this process
@@ -2176,7 +2176,7 @@ rx_GetCall(int tno, struct rx_service *cur_service, osi_socket * socketp)
 #endif
 
        rxi_calltrace(RX_CALL_START, call);
-       dpf(("rx_GetCall(port=%d, service=%d) ==> call %"AFS_PTR_FMT"\n",
+       dpf(("rx_GetCall(port=%d, service=%d) ==> call %p\n",
             call->conn->service->servicePort, call->conn->service->serviceId,
             call));
 
@@ -2237,9 +2237,8 @@ rx_GetCall(int tno, struct rx_service *cur_service, osi_socket * socketp)
            service = tcall->conn->service;
            if (QuotaOK(service)) {
                MUTEX_ENTER(&rx_pthread_mutex);
-               /* XXX - If tcall->entry.next is NULL, then we're no longer
-                * on a queue at all. This shouldn't happen. */
-               if (tno == rxi_fcfs_thread_num || !tcall->entry.next) {
+               if (tno == rxi_fcfs_thread_num
+                       || opr_queue_IsLast(&rx_incomingCallQueue, cursor)) {
                    MUTEX_EXIT(&rx_pthread_mutex);
                    /* If we're the fcfs thread, then  we'll just use
                     * this call. If we haven't been able to find an optimal
@@ -2273,6 +2272,7 @@ rx_GetCall(int tno, struct rx_service *cur_service, osi_socket * socketp)
 
     if (call) {
        opr_queue_Remove(&call->entry);
+       CLEAR_CALL_QUEUE_LOCK(call);
        /* we can't schedule a call if there's no data!!! */
        /* send an ack if there's no data, if we're missing the
         * first packet, or we're missing something between first
@@ -2386,7 +2386,7 @@ rx_EndCall(struct rx_call *call, afs_int32 rc)
     afs_int32 error;
     SPLVAR;
 
-    dpf(("rx_EndCall(call %"AFS_PTR_FMT" rc %d error %d abortCode %d)\n",
+    dpf(("rx_EndCall(call %p rc %d error %d abortCode %d)\n",
           call, rc, call->error, call->abortCode));
 
     NETPRI;
@@ -2656,7 +2656,7 @@ rxi_NewCall(struct rx_connection *conn, int channel)
     struct opr_queue *cursor;
 #endif
 
-    dpf(("rxi_NewCall(conn %"AFS_PTR_FMT", channel %d)\n", conn, channel));
+    dpf(("rxi_NewCall(conn %p, channel %d)\n", conn, channel));
 
     /* Grab an existing call structure, or allocate a new one.
      * Existing call structures are assumed to have been left reset by
@@ -2854,7 +2854,7 @@ rxi_Alloc(size_t size)
     }
 
 p = (char *)
-#if defined(KERNEL) && !defined(UKERNEL) && defined(AFS_FBSD80_ENV)
+#if defined(KERNEL) && !defined(UKERNEL) && defined(AFS_FBSD_ENV)
   afs_osi_Alloc_NoSleep(size);
 #else
   osi_Alloc(size);
@@ -3417,7 +3417,7 @@ rxi_ReceivePacket(struct rx_packet *np, osi_socket socket,
  * this is the first time the packet has been seen */
     packetType = (np->header.type > 0 && np->header.type < RX_N_PACKET_TYPES)
        ? rx_packetTypes[np->header.type - 1] : "*UNKNOWN*";
-    dpf(("R %d %s: %x.%d.%d.%d.%d.%d.%d flags %d, packet %"AFS_PTR_FMT"\n",
+    dpf(("R %d %s: %x.%d.%d.%d.%d.%d.%d flags %d, packet %p\n",
         np->header.serial, packetType, ntohl(host), ntohs(port), np->header.serviceId,
         np->header.epoch, np->header.cid, np->header.callNumber,
         np->header.seq, np->header.flags, np));
@@ -3885,7 +3885,7 @@ rxi_ReceiveDataPacket(struct rx_call *call,
         if (rx_stats_active)
             rx_atomic_inc(&rx_stats.noPacketBuffersOnRead);
        rxi_calltrace(RX_TRACE_DROP, call);
-       dpf(("packet %"AFS_PTR_FMT" dropped on receipt - quota problems\n", np));
+       dpf(("packet %p dropped on receipt - quota problems\n", np));
         /* We used to clear the receive queue here, in an attempt to free
          * packets. However this is unsafe if the queue has received a
          * soft ACK for the final packet */
@@ -3939,7 +3939,7 @@ rxi_ReceiveDataPacket(struct rx_call *call,
                && opr_queue_First(&call->rq, struct rx_packet, entry)->header.seq == seq) {
                 if (rx_stats_active)
                     rx_atomic_inc(&rx_stats.dupPacketsRead);
-               dpf(("packet %"AFS_PTR_FMT" dropped on receipt - duplicate\n", np));
+               dpf(("packet %p dropped on receipt - duplicate\n", np));
                rxi_CancelDelayedAckEvent(call);
                np = rxi_SendAck(call, np, serial, RX_ACK_DUPLICATE, istack);
                ackNeeded = 0;
@@ -4430,7 +4430,7 @@ rxi_ReceiveAckPacket(struct rx_call *call, struct rx_packet *np,
 
 #ifdef RX_ENABLE_LOCKS
        /* XXX Hack. Because we have to release the global call lock when sending
-        * packets (osi_NetSend) we drop all acks while we're traversing the tq
+        * packets (rxi_NetSend) we drop all acks while we're traversing the tq
         * in rxi_Start sending packets out because packets may move to the
         * freePacketQueue as result of being here! So we drop these packets until
         * we're safely out of the traversing. Really ugly!
@@ -4957,6 +4957,7 @@ rxi_AttachServerProc(struct rx_call *call,
            if (opr_queue_IsOnQueue(&call->entry)) {
                opr_queue_Remove(&call->entry);
            }
+           CLEAR_CALL_QUEUE_LOCK(call);
        }
        call->state = RX_STATE_ACTIVE;
        call->app.mode = RX_MODE_RECEIVING;
@@ -5147,7 +5148,7 @@ rxi_ClearReceiveQueue(struct rx_call *call)
 #ifdef RXDEBUG_PACKET
         call->rqc -= count;
         if ( call->rqc != 0 )
-            dpf(("rxi_ClearReceiveQueue call %"AFS_PTR_FMT" rqc %u != 0\n", call, call->rqc));
+         dpf(("rxi_ClearReceiveQueue call %p rqc %u != 0\n", call, call->rqc));
 #endif
        call->flags &= ~(RX_CALL_RECEIVE_DONE | RX_CALL_HAVE_LAST);
     }
@@ -5264,7 +5265,7 @@ rxi_ConnectionError(struct rx_connection *conn,
     if (error) {
        int i;
 
-       dpf(("rxi_ConnectionError conn %"AFS_PTR_FMT" error %d\n", conn, error));
+       dpf(("rxi_ConnectionError conn %p error %d\n", conn, error));
 
        MUTEX_ENTER(&conn->conn_data_lock);
        if (rxevent_Cancel(&conn->challengeEvent))
@@ -5309,7 +5310,7 @@ void
 rxi_CallError(struct rx_call *call, afs_int32 error)
 {
     MUTEX_ASSERT(&call->lock);
-    dpf(("rxi_CallError call %"AFS_PTR_FMT" error %d call->error %d\n", call, error, call->error));
+    dpf(("rxi_CallError call %p error %d call->error %d\n", call, error, call->error));
     if (call->error)
        error = call->error;
 
@@ -5338,7 +5339,7 @@ rxi_ResetCall(struct rx_call *call, int newcall)
     struct rx_packet *packet;
 
     MUTEX_ASSERT(&call->lock);
-    dpf(("rxi_ResetCall(call %"AFS_PTR_FMT", newcall %d)\n", call, newcall));
+    dpf(("rxi_ResetCall(call %p, newcall %d)\n", call, newcall));
 
     /* Notify anyone who is waiting for asynchronous packet arrival */
     if (call->arrivalProc) {
@@ -5399,7 +5400,7 @@ rxi_ResetCall(struct rx_call *call, int newcall)
 
     rxi_ClearTransmitQueue(call, 1);
     if (call->tqWaiters || (flags & RX_CALL_TQ_WAIT)) {
-        dpf(("rcall %"AFS_PTR_FMT" has %d waiters and flags %d\n", call, call->tqWaiters, call->flags));
+       dpf(("rcall %p has %d waiters and flags %d\n", call, call->tqWaiters, call->flags));
     }
     call->flags = 0;
 
@@ -6191,7 +6192,7 @@ rxi_Start(struct rx_call *call, int istack)
                                             nXmitPackets, istack);
                            goto restart;
                        }
-                        dpf(("call %d xmit packet %"AFS_PTR_FMT"\n",
+                      dpf(("call %d xmit packet %p\n",
                               *(call->callNumber), p));
                        call->xmitList[nXmitPackets++] = p;
                    }
@@ -6502,7 +6503,7 @@ rxi_NatKeepAliveEvent(struct rxevent *event, void *arg1,
     tmpiov[0].iov_base = tbuffer;
     tmpiov[0].iov_len = 1 + sizeof(struct rx_header);
 
-    osi_NetSend(socket, &taddr, tmpiov, 1, 1 + sizeof(struct rx_header), 1);
+    rxi_NetSend(socket, &taddr, tmpiov, 1, 1 + sizeof(struct rx_header), 1);
 
     MUTEX_ENTER(&conn->conn_data_lock);
     /* We ran, so the handle is no longer needed to try to cancel ourselves. */
@@ -6963,7 +6964,7 @@ rxi_ComputeRoundTripTime(struct rx_packet *p,
        return;                 /* somebody set the clock back, don't count this time. */
 
     clock_Sub(&thisRtt, sentp);
-    dpf(("rxi_ComputeRoundTripTime(call=%d packet=%"AFS_PTR_FMT" rttp=%d.%06d sec)\n",
+    dpf(("rxi_ComputeRoundTripTime(call=%d packet=%p rttp=%d.%06d sec)\n",
           p->header.callNumber, p, thisRtt.sec, thisRtt.usec));
 
     if (clock_IsZero(&thisRtt)) {
@@ -7062,8 +7063,10 @@ rxi_ComputeRoundTripTime(struct rx_packet *p,
     peer->rtt_dev = call->rtt_dev;
     peer->rtt = call->rtt;
 
-    dpf(("rxi_ComputeRoundTripTime(call=%d packet=%"AFS_PTR_FMT" rtt=%d ms, srtt=%d ms, rtt_dev=%d ms, timeout=%d.%06d sec)\n",
-          p->header.callNumber, p, MSEC(&thisRtt), call->rtt >> 3, call->rtt_dev >> 2, (call->rto.sec), (call->rto.usec)));
+    dpf(("rxi_ComputeRoundTripTime(call=%d packet=%p rtt=%d ms, srtt=%d ms, "
+        "rtt_dev=%d ms, timeout=%d.%06d sec)\n",
+        p->header.callNumber, p, MSEC(&thisRtt), call->rtt >> 3,
+        call->rtt_dev >> 2, (call->rto.sec), (call->rto.usec)));
 }
 
 
@@ -9413,3 +9416,10 @@ int rx_DumpCalls(FILE *outputFile, char *cookie)
     return 0;
 }
 #endif
+
+int
+rxi_NetSend(osi_socket socket, void *addr, struct iovec *dvec,
+           int nvecs, int length, int istack)
+{
+    return osi_NetSend(socket, addr, dvec, nvecs, length, istack);
+}