* calls to process */
struct opr_queue rx_idleServerQueue;
+/* List of free rx_serverQueueEntry structs */
+struct opr_queue rx_freeServerQueue;
+
#if !defined(offsetof)
#include <stddef.h> /* for definition of offsetof() */
#endif
#ifdef RX_ENABLE_LOCKS
afs_kmutex_t rx_atomic_mutex;
+static afs_kmutex_t freeSQEList_lock;
#endif
/* Forward prototypes */
/* Initialize various global queues */
opr_queue_Init(&rx_idleServerQueue);
+ opr_queue_Init(&rx_freeServerQueue);
opr_queue_Init(&rx_incomingCallQueue);
opr_queue_Init(&rx_freeCallQueue);
void
rx_WakeupServerProcs(void)
{
- struct rx_serverQueueEntry *np, *tqp;
+ struct rx_serverQueueEntry *np;
struct opr_queue *cursor;
SPLVAR;
osi_rxWakeup(rx_waitForPacket);
#endif /* RX_ENABLE_LOCKS */
MUTEX_ENTER(&freeSQEList_lock);
- for (np = rx_FreeSQEList; np; np = tqp) {
- tqp = *(struct rx_serverQueueEntry **)np;
+ for (opr_queue_Scan(&rx_freeServerQueue, cursor)) {
+ np = opr_queue_Entry(cursor, struct rx_serverQueueEntry, entry);
#ifdef RX_ENABLE_LOCKS
CV_BROADCAST(&np->cv);
#else /* RX_ENABLE_LOCKS */
MUTEX_ENTER(&freeSQEList_lock);
- if ((sq = rx_FreeSQEList)) {
- rx_FreeSQEList = *(struct rx_serverQueueEntry **)sq;
+ if (!opr_queue_IsEmpty(&rx_freeServerQueue)) {
+ sq = opr_queue_First(&rx_freeServerQueue, struct rx_serverQueueEntry,
+ entry);
+ opr_queue_Remove(&sq->entry);
MUTEX_EXIT(&freeSQEList_lock);
} else { /* otherwise allocate a new one and return that */
MUTEX_EXIT(&freeSQEList_lock);
#endif
} while (!(call = sq->newcall)
&& !(socketp && *socketp != OSI_NULLSOCKET));
+ if (opr_queue_IsOnQueue(&sq->entry)) {
+ opr_queue_Remove(&sq->entry);
+ }
MUTEX_EXIT(&rx_serverPool_lock);
if (call) {
MUTEX_ENTER(&call->lock);
}
MUTEX_ENTER(&freeSQEList_lock);
- *(struct rx_serverQueueEntry **)sq = rx_FreeSQEList;
- rx_FreeSQEList = sq;
+ opr_queue_Prepend(&rx_freeServerQueue, &sq->entry);
MUTEX_EXIT(&freeSQEList_lock);
if (call) {
NETPRI;
MUTEX_ENTER(&freeSQEList_lock);
- if ((sq = rx_FreeSQEList)) {
- rx_FreeSQEList = *(struct rx_serverQueueEntry **)sq;
+ if (!opr_queue_IsEmpty(&rx_freeServerQueue)) {
+ sq = opr_queue_First(&rx_freeServerQueue, struct rx_serverQueueEntry,
+ entry);
+ opr_queue_Remove(&sq->entry);
MUTEX_EXIT(&freeSQEList_lock);
} else { /* otherwise allocate a new one and return that */
MUTEX_EXIT(&freeSQEList_lock);
MUTEX_EXIT(&sq->lock);
MUTEX_ENTER(&freeSQEList_lock);
- *(struct rx_serverQueueEntry **)sq = rx_FreeSQEList;
- rx_FreeSQEList = sq;
+ opr_queue_Prepend(&rx_freeServerQueue, &sq->entry);
MUTEX_EXIT(&freeSQEList_lock);
if (call) {
MUTEX_ENTER(&freeSQEList_lock);
- while ((np = rx_FreeSQEList)) {
- rx_FreeSQEList = *(struct rx_serverQueueEntry **)np;
+ while (!opr_queue_IsEmpty(&rx_freeServerQueue)) {
+ np = opr_queue_First(&rx_freeServerQueue, struct rx_serverQueueEntry,
+ entry);
+ opr_queue_Remove(&np->entry);
MUTEX_DESTROY(&np->lock);
rxi_Free(np, sizeof(*np));
}