From 303bc61079ed2864d437642308defcc43a3f1ec7 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Tue, 28 Mar 2023 11:13:52 -0700 Subject: [PATCH] apply loc_bad_alloc to owned_ptr Distinguish location of owned_ptr failure --- src/client.cpp | 18 ++++++++++++------ src/clientconn.cpp | 3 ++- src/clientmon.cpp | 3 ++- src/conn.cpp | 4 ++-- src/evhelper.cpp | 13 ++++++++----- src/evhelper.h | 4 ++-- src/server.cpp | 3 ++- src/serverconn.cpp | 3 ++- src/udp_collector.cpp | 3 ++- test/benchdata.cpp | 2 +- test/testev.cpp | 2 +- 11 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/client.cpp b/src/client.cpp index f32ea7b..e0884af 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -488,13 +488,19 @@ ContextImpl::ContextImpl(const Config& conf, const evbase& tcp_loop) ,searchTx4(AF_INET, SOCK_DGRAM, 0) ,searchTx6(AF_INET6, SOCK_DGRAM, 0) ,tcp_loop(tcp_loop) - ,searchRx4(event_new(tcp_loop.base, searchTx4.sock, EV_READ|EV_PERSIST, &ContextImpl::onSearchS, this)) - ,searchRx6(event_new(tcp_loop.base, searchTx6.sock, EV_READ|EV_PERSIST, &ContextImpl::onSearchS, this)) - ,searchTimer(event_new(tcp_loop.base, -1, EV_TIMEOUT, &ContextImpl::tickSearchS, this)) + ,searchRx4(__FILE__, __LINE__, + event_new(tcp_loop.base, searchTx4.sock, EV_READ|EV_PERSIST, &ContextImpl::onSearchS, this)) + ,searchRx6(__FILE__, __LINE__, + event_new(tcp_loop.base, searchTx6.sock, EV_READ|EV_PERSIST, &ContextImpl::onSearchS, this)) + ,searchTimer(__FILE__, __LINE__, + event_new(tcp_loop.base, -1, EV_TIMEOUT, &ContextImpl::tickSearchS, this)) ,manager(UDPManager::instance()) - ,beaconCleaner(event_new(manager.loop().base, -1, EV_TIMEOUT|EV_PERSIST, &ContextImpl::tickBeaconCleanS, this)) - ,cacheCleaner(event_new(tcp_loop.base, -1, EV_TIMEOUT|EV_PERSIST, &ContextImpl::cacheCleanS, this)) - ,nsChecker(event_new(tcp_loop.base, -1, EV_TIMEOUT|EV_PERSIST, &ContextImpl::onNSCheckS, this)) + ,beaconCleaner(__FILE__, __LINE__, + event_new(manager.loop().base, -1, EV_TIMEOUT|EV_PERSIST, &ContextImpl::tickBeaconCleanS, this)) + ,cacheCleaner(__FILE__, __LINE__, + event_new(tcp_loop.base, -1, EV_TIMEOUT|EV_PERSIST, &ContextImpl::cacheCleanS, this)) + ,nsChecker(__FILE__, __LINE__, + event_new(tcp_loop.base, -1, EV_TIMEOUT|EV_PERSIST, &ContextImpl::onNSCheckS, this)) { effective.expand(); diff --git a/src/clientconn.cpp b/src/clientconn.cpp index 52d9bed..9f2705b 100644 --- a/src/clientconn.cpp +++ b/src/clientconn.cpp @@ -23,7 +23,8 @@ Connection::Connection(const std::shared_ptr& context, nullptr, peerAddr) ,context(context) - ,echoTimer(event_new(context->tcp_loop.base, -1, EV_TIMEOUT|EV_PERSIST, &tickEchoS, this)) + ,echoTimer(__FILE__, __LINE__, + event_new(context->tcp_loop.base, -1, EV_TIMEOUT|EV_PERSIST, &tickEchoS, this)) { if(reconn) { log_debug_printf(io, "start holdoff timer for %s\n", peerName.c_str()); diff --git a/src/clientmon.cpp b/src/clientmon.cpp index 64101b1..3bff444 100644 --- a/src/clientmon.cpp +++ b/src/clientmon.cpp @@ -77,7 +77,8 @@ struct SubscriptionImpl final : public OperationBase, public Subscription SubscriptionImpl(const evbase& loop) :OperationBase (Operation::Monitor, loop) - ,ackTick(event_new(loop.base, -1, EV_TIMEOUT, &tickAckS, this)) + ,ackTick(__FILE__, __LINE__, + event_new(loop.base, -1, EV_TIMEOUT, &tickAckS, this)) {} virtual ~SubscriptionImpl() { if(loop.assertInRunningLoop()) diff --git a/src/conn.cpp b/src/conn.cpp index 1767b25..10ebf47 100644 --- a/src/conn.cpp +++ b/src/conn.cpp @@ -34,8 +34,8 @@ ConnBase::ConnBase(bool isClient, bool sendBE, bufferevent* bev, const SockAddr& ,peerBE(true) // arbitrary choice, default should be overwritten before use ,expectSeg(false) ,segCmd(0xff) - ,segBuf(evbuffer_new()) - ,txBody(evbuffer_new()) + ,segBuf(__FILE__, __LINE__, evbuffer_new()) + ,txBody(__FILE__, __LINE__, evbuffer_new()) ,state(Holdoff) { if(bev) // true for server connection. client will call connect() shortly diff --git a/src/evhelper.cpp b/src/evhelper.cpp index e88d613..d7373a1 100644 --- a/src/evhelper.cpp +++ b/src/evhelper.cpp @@ -167,7 +167,7 @@ struct evbase::Pvt final : public epicsThreadRunable { INST_COUNTER(evbaseRunning); try { - evconfig conf(event_config_new()); + evconfig conf(__FILE__, __LINE__, event_config_new()); #ifdef __rtems__ /* with libbsd circa RTEMS 5.1 * TCP peer close/reset notifications appear to be lost. @@ -176,13 +176,15 @@ struct evbase::Pvt final : public epicsThreadRunable */ event_config_avoid_method(conf.get(), "kqueue"); #endif - decltype (base) tbase(event_base_new_with_config(conf.get())); + decltype (base) tbase(__FILE__, __LINE__, event_base_new_with_config(conf.get())); if(evthread_make_base_notifiable(tbase.get())) { throw std::runtime_error("evthread_make_base_notifiable"); } - evevent handle(event_new(tbase.get(), -1, EV_TIMEOUT, &doWorkS, this)); - evevent ka(event_new(tbase.get(), -1, EV_TIMEOUT|EV_PERSIST, &evkeepalive, this)); + evevent handle(__FILE__, __LINE__, + event_new(tbase.get(), -1, EV_TIMEOUT, &doWorkS, this)); + evevent ka(__FILE__, __LINE__, + event_new(tbase.get(), -1, EV_TIMEOUT|EV_PERSIST, &evkeepalive, this)); base = std::move(tbase); dowork = std::move(handle); @@ -1096,7 +1098,8 @@ Timer Timer::Pvt::buildOneShot(double delay, const evbase& base, std::functionbase.base, -1, EV_TIMEOUT, &expire_cb, internal.get())); + evevent timer(__FILE__, __LINE__, + event_new(internal->base.base, -1, EV_TIMEOUT, &expire_cb, internal.get())); internal->timer = std::move(timer); auto timo(totv(delay)); diff --git a/src/evhelper.h b/src/evhelper.h index 658a6f7..096dd7f 100644 --- a/src/evhelper.h +++ b/src/evhelper.h @@ -61,9 +61,9 @@ template struct owned_ptr : public std::unique_ptr { constexpr owned_ptr() {} - explicit owned_ptr(T* ptr) : std::unique_ptr(ptr) { + explicit owned_ptr(const char* file, int line, T* ptr) : std::unique_ptr(ptr) { if(!*this) - throw BAD_ALLOC(); + throw loc_bad_alloc(file, line); } }; diff --git a/src/server.cpp b/src/server.cpp index 2967a18..6002654 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -380,7 +380,8 @@ Server::Pvt::Pvt(const Config &conf) ,acceptor_loop("PVXTCP", epicsThreadPriorityCAServerLow-2) ,beaconSender4(AF_INET, SOCK_DGRAM, 0) ,beaconSender6(AF_INET6, SOCK_DGRAM, 0) - ,beaconTimer(event_new(acceptor_loop.base, -1, EV_TIMEOUT, doBeaconsS, this)) + ,beaconTimer(__FILE__, __LINE__, + event_new(acceptor_loop.base, -1, EV_TIMEOUT, doBeaconsS, this)) ,searchReply(0x10000) ,builtinsrc(StaticSource::build()) ,state(Stopped) diff --git a/src/serverconn.cpp b/src/serverconn.cpp index fb981bb..f0ce884 100644 --- a/src/serverconn.cpp +++ b/src/serverconn.cpp @@ -429,7 +429,8 @@ ServIface::ServIface(const SockAddr &addr, server::Server::Pvt *server, bool fal #endif const int backlog = 4; - listener = evlisten(evconnlistener_new(server->acceptor_loop.base, onConnS, this, LEV_OPT_DISABLED|LEV_OPT_CLOSE_ON_EXEC, backlog, sock.sock)); + listener = evlisten(__FILE__, __LINE__, + evconnlistener_new(server->acceptor_loop.base, onConnS, this, LEV_OPT_DISABLED|LEV_OPT_CLOSE_ON_EXEC, backlog, sock.sock)); if(!LEV_OPT_DISABLED) evconnlistener_disable(listener.get()); diff --git a/src/udp_collector.cpp b/src/udp_collector.cpp index c693be8..9416211 100644 --- a/src/udp_collector.cpp +++ b/src/udp_collector.cpp @@ -137,7 +137,8 @@ UDPCollector::UDPCollector(UDPManager::Pvt *manager, int af, uint16_t requested_ ,lo_mcast_addr("224.0.0.128,1@127.0.0.1") ,lo_addr(SockAddr::loopback(bind_addr.family())) ,sock(af, SOCK_DGRAM, 0) - ,rx(event_new(manager->loop.base, sock.sock, EV_READ|EV_PERSIST, &handle_static, this)) + ,rx(__FILE__, __LINE__, + event_new(manager->loop.base, sock.sock, EV_READ|EV_PERSIST, &handle_static, this)) ,beaconMsg(src) { manager->loop.assertInLoop(); diff --git a/test/benchdata.cpp b/test/benchdata.cpp index a267473..82a4ab4 100644 --- a/test/benchdata.cpp +++ b/test/benchdata.cpp @@ -109,7 +109,7 @@ void benchArraySerDes(bool be, const shared_array& arr) shared_array scratch; - evbuf ebuf(evbuffer_new()); + evbuf ebuf(__FILE__, __LINE__, evbuffer_new()); Sampler Tser, Tdes; diff --git a/test/testev.cpp b/test/testev.cpp index 75613c2..eb450e3 100644 --- a/test/testev.cpp +++ b/test/testev.cpp @@ -102,7 +102,7 @@ void test_fill_evbuf() { testDiag("%s", __func__); - evbuf buf(evbuffer_new()); + evbuf buf(__FILE__, __LINE__, evbuffer_new()); { EvOutBuf M(true, buf.get());