@@ -275,44 +275,31 @@ class DefaultResolver : public Resolver {
275275 };
276276 IPAddr do_resolve (std::string_view host, Delegate<bool , IPAddr> filter) {
277277 auto ctr = [&]() -> IPAddrList* {
278- auto addrs = new IPAddrList ();
279- std::shared_ptr<ResolveCtx> ctx = std::make_shared<ResolveCtx>();
280- ctx->addrs = addrs;
278+ std::unique_ptr<IPAddrList> addrs ( new IPAddrList () );
279+ auto ctx = std::make_shared<ResolveCtx>();
280+ ctx->addrs = addrs. get () ;
281281 ctx->host = std::string (host);
282282 ctx->filter = filter;
283283 std::thread ([ctx]() {
284- IPAddrList ret;
285284 auto cb = [&](IPAddr addr) -> int {
286285 SCOPED_LOCK (ctx->lock );
287- if (ctx->filter && !ctx->filter .fire (addr))
288- return 0 ;
289- ret.push_back (new IPAddrNode (addr));
286+ if (ctx->filter && !ctx->filter .fire (addr)) return 0 ;
287+ if (ctx->addrs ) {
288+ ctx->addrs ->push_back (new IPAddrNode (addr));
289+ }
290290 return 0 ;
291291 };
292292 _gethostbyname (ctx->host , cb);
293- {
294- SCOPED_LOCK (ctx->lock );
295- if (ctx->addrs ) {
296- ctx->addrs ->push_back (std::move (ret));
297- ctx->sem .signal (1 );
298- } else {
299- LOG_ERROR (" resolve timeout" );
300- while (!ret.empty ())
301- delete ret.pop_front ();
302- }
303- }
293+ ctx->sem .signal (1 );
304294 }).detach ();
305295 ctx->sem .wait (1 , resolve_timeout_);
306- {
307- SCOPED_LOCK (ctx->lock );
308- ctx->addrs = nullptr ;
309- ctx->filter = {};
310- }
296+ SCOPED_LOCK (ctx->lock );
297+ ctx->addrs = nullptr ;
298+ ctx->filter = {};
311299 if (addrs->empty ()) {
312- delete addrs;
313300 return nullptr ;
314301 }
315- return addrs;
302+ return addrs. release () ;
316303 };
317304 auto ips = dnscache_.borrow (host, ctr, 1UL * 1000 );
318305 if (!ips || ips->empty ()) {
0 commit comments