@@ -1403,6 +1403,32 @@ void run_active_slot(struct active_request_slot *slot)
14031403 select (max_fd + 1 , & readfds , & writefds , & excfds , & select_timeout );
14041404 }
14051405 }
1406+
1407+ /*
1408+ * The value of slot->finished we set before the loop was used
1409+ * to set our "finished" variable when our request completed.
1410+ *
1411+ * 1. The slot may not have been reused for another requst
1412+ * yet, in which case it still has &finished.
1413+ *
1414+ * 2. The slot may already be in-use to serve another request,
1415+ * which can further be divided into two cases:
1416+ *
1417+ * (a) If call run_active_slot() hasn't been called for that
1418+ * other request, slot->finished would have been cleared
1419+ * by get_active_slot() and has NULL.
1420+ *
1421+ * (b) If the request did call run_active_slot(), then the
1422+ * call would have updated slot->finished at the beginning
1423+ * of this function, and with the clearing of the member
1424+ * below, we would find that slot->finished is now NULL.
1425+ *
1426+ * In all cases, slot->finished has no useful information to
1427+ * anybody at this point. Some compilers warn us for
1428+ * attempting to smuggle a pointer that is about to become
1429+ * invalid, i.e. &finished. We clear it here to assure them.
1430+ */
1431+ slot -> finished = NULL ;
14061432}
14071433
14081434static void release_active_slot (struct active_request_slot * slot )
0 commit comments