static void helperServerFree(helper_server *srv);
static void helperStatefulServerFree(helper_stateful_server *srv);
static void Enqueue(helper * hlp, Helper::Request *);
-static Helper::Request *Dequeue(helper * hlp);
-static Helper::Request *StatefulDequeue(statefulhelper * hlp);
static helper_server *GetFirstAvailable(helper * hlp);
static helper_stateful_server *StatefulGetFirstAvailable(statefulhelper * hlp);
static void helperDispatch(helper_server * srv, Helper::Request * r);
{
/* note, don't free id_name, it probably points to static memory */
- if (queue.head)
+ // TODO: if the queue is not empty it will leak Helper::Request's
+ if (!queue.empty())
debugs(84, DBG_CRITICAL, "WARNING: freeing " << id_name << " helper with " << stats.queue_size << " requests queued");
}
static void
Enqueue(helper * hlp, Helper::Request * r)
{
- dlink_node *link = (dlink_node *)memAllocate(MEM_DLINK_NODE);
- dlinkAddTail(r, link, &hlp->queue);
+ hlp->queue.push(r);
++ hlp->stats.queue_size;
/* do this first so idle=N has a chance to grow the child pool before it hits critical. */
static void
StatefulEnqueue(statefulhelper * hlp, Helper::Request * r)
{
- dlink_node *link = (dlink_node *)memAllocate(MEM_DLINK_NODE);
- dlinkAddTail(r, link, &hlp->queue);
+ hlp->queue.push(r);
++ hlp->stats.queue_size;
/* do this first so idle=N has a chance to grow the child pool before it hits critical. */
debugs(84, DBG_CRITICAL, "WARNING: Consider increasing the number of " << hlp->id_name << " processes in your config file.");
}
-static Helper::Request *
-Dequeue(helper * hlp)
+Helper::Request *
+helper::nextRequest()
{
- dlink_node *link;
- Helper::Request *r = NULL;
-
- if ((link = hlp->queue.head)) {
- r = (Helper::Request *)link->data;
- dlinkDelete(link, &hlp->queue);
- memFree(link, MEM_DLINK_NODE);
- -- hlp->stats.queue_size;
- }
-
- return r;
-}
-
-static Helper::Request *
-StatefulDequeue(statefulhelper * hlp)
-{
- dlink_node *link;
- Helper::Request *r = NULL;
-
- if ((link = hlp->queue.head)) {
- r = (Helper::Request *)link->data;
- dlinkDelete(link, &hlp->queue);
- memFree(link, MEM_DLINK_NODE);
- -- hlp->stats.queue_size;
- }
+ if (queue.empty())
+ return nullptr;
+ auto *r = queue.front();
+ queue.pop();
+ --stats.queue_size;
return r;
}
Helper::Request *r;
helper_server *srv;
- while ((srv = GetFirstAvailable(hlp)) && (r = Dequeue(hlp)))
+ while ((srv = GetFirstAvailable(hlp)) && (r = hlp->nextRequest()))
helperDispatch(srv, r);
}
Helper::Request *r;
helper_stateful_server *srv;
- while ((srv = StatefulGetFirstAvailable(hlp)) && (r = StatefulDequeue(hlp)))
+ while ((srv = StatefulGetFirstAvailable(hlp)) && (r = hlp->nextRequest()))
helperStatefulDispatch(srv, r);
}
#include <list>
#include <map>
+#include <queue>
class Packable;
class wordlist;
}
~helper();
- ///< whether at least one more request can be successfully submitted
+ /// whether at least one more request can be successfully submitted
bool queueFull() const;
+ /// \returns next request in the queue, or nil.
+ Helper::Request *nextRequest();
+
///< If not full, submit request. Otherwise, either kill Squid or return false.
bool trySubmit(const char *buf, HLPCB * callback, void *data);
public:
wordlist *cmdline;
dlink_list servers;
- dlink_list queue;
+ std::queue<Helper::Request *> queue;
const char *id_name;
Helper::ChildConfig childs; ///< Configuration settings for number running.
int ipc_type;
sizeof(AclDenyInfoList), 0);
memDataInit(MEM_ACL_NAME_LIST, "acl_name_list", sizeof(AclNameList), 0);
memDataInit(MEM_LINK_LIST, "link_list", sizeof(link_list), 10);
- memDataInit(MEM_DLINK_NODE, "dlink_node", sizeof(dlink_node), 10);
memDataInit(MEM_DREAD_CTRL, "dread_ctrl", sizeof(dread_ctrl), 0);
memDataInit(MEM_DWRITE_Q, "dwrite_q", sizeof(dwrite_q), 0);
memDataInit(MEM_NETDBENTRY, "netdbEntry", sizeof(netdbEntry), 0);