/* DEBUG: section 78 DNS lookups; interacts with dns/rfc1035.cc */
#include "squid.h"
+#include "base/CodeContext.h"
#include "base/InstanceId.h"
#include "base/RunnersRegistry.h"
#include "comm.h"
CBDATA_CLASS(idns_query);
public:
- idns_query() {
+ idns_query():
+ codeContext(CodeContext::Current())
+ {
callback = nullptr;
memset(&query, 0, sizeof(query));
*buf = 0;
struct timeval sent_t;
struct timeval queue_t;
dlink_node lru;
+
IDNSCB *callback;
void *callback_data = nullptr;
+ CodeContext::Pointer codeContext; ///< requestor's context
+
int attempt = 0;
int rcode = 0;
idns_query *queue = nullptr;
for (auto query = master; query; query = query->slave) {
if (query->pending)
continue; // no answer yet
+ // no CallBack(CodeContext...) -- we always run in requestor's context
if (!idnsCallbackOneWithAnswer(callback, cbdata, *query, lastAnswer))
break; // the caller disappeared
}
const auto master = answered->master ? answered->master : answered;
// iterate all queued lookup callers
for (auto looker = master; looker; looker = looker->queue) {
- (void)idnsCallbackOneWithAnswer(looker->callback, looker->callback_data,
- *answered, lastAnswer);
+ CallBack(looker->codeContext, [&] {
+ (void)idnsCallbackOneWithAnswer(looker->callback, looker->callback_data,
+ *answered, lastAnswer);
+ });
}
}