From 5e0fa863cb6a66c2073bb218489e6291755c2283 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Wed, 19 Jul 2017 14:10:04 +0200 Subject: VIRT-PHY: enable proper memory leak debugging We make sure that all allocations are tracked back to one talloc root context, and install the usual SIGUSR1 handler to dump the talloc report. This enables us to do interactive debugging for memory leaks while virtphy is running. Change-Id: I73b3cf86eea5f56595c1b045cf0fde8035ff185a --- src/host/virt_phy/src/virt_l1_sched_simple.c | 2 +- src/host/virt_phy/src/virtphy.c | 27 +++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) (limited to 'src/host/virt_phy') diff --git a/src/host/virt_phy/src/virt_l1_sched_simple.c b/src/host/virt_phy/src/virt_l1_sched_simple.c index 7d1cdd47..ba8298fa 100644 --- a/src/host/virt_phy/src/virt_l1_sched_simple.c +++ b/src/host/virt_phy/src/virt_l1_sched_simple.c @@ -127,7 +127,7 @@ void virt_l1_sched_schedule(struct l1_model_ms *ms, struct msgb *msg, uint32_t f } if (!mi_fn) { /* list did not contain mframe item with needed fn */ - mi_fn = talloc_zero(NULL, struct virt_l1_sched_mframe_item); + mi_fn = talloc_zero(ms, struct virt_l1_sched_mframe_item); mi_fn->fn = fn; /* need to manually init the struct content.... no so happy */ mi_fn->tdma_item_list.prev = &mi_fn->tdma_item_list; diff --git a/src/host/virt_phy/src/virtphy.c b/src/host/virt_phy/src/virtphy.c index e0bee72e..412b742b 100644 --- a/src/host/virt_phy/src/virtphy.c +++ b/src/host/virt_phy/src/virtphy.c @@ -23,12 +23,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -168,8 +170,29 @@ static void l1ctl_close_cb(struct l1ctl_sock_client *lsc) l1_model_ms_destroy(ms); } +static void *tall_vphy_ctx; + +static void signal_handler(int signum) +{ + LOGP(DMAIN, LOGL_NOTICE, "Signal %d received\n", signum); + + switch (signum) { + case SIGUSR1: + talloc_report_full(tall_vphy_ctx, stderr); + break; + default: + break; + } +} + int main(int argc, char *argv[]) { + tall_vphy_ctx = talloc_named_const(NULL, 1, "root"); + + msgb_talloc_ctx_init(tall_vphy_ctx, 0); + signal(SIGUSR1, &signal_handler); + osmo_init_ignore_signals(); + /* init loginfo */ handle_options(argc, argv); @@ -177,10 +200,10 @@ int main(int argc, char *argv[]) LOGP(DVIRPHY, LOGL_INFO, "Virtual physical layer starting up...\n"); - g_vphy.virt_um = virt_um_init(NULL, ul_tx_grp, port, dl_rx_grp, port, + g_vphy.virt_um = virt_um_init(tall_vphy_ctx, ul_tx_grp, port, dl_rx_grp, port, gsmtapl1_rx_from_virt_um_inst_cb); - g_vphy.l1ctl_sock = l1ctl_sock_init(NULL, l1ctl_sap_rx_from_l23_inst_cb, + g_vphy.l1ctl_sock = l1ctl_sock_init(tall_vphy_ctx, l1ctl_sap_rx_from_l23_inst_cb, l1ctl_accept_cb, l1ctl_close_cb, l1ctl_sock_path); g_vphy.virt_um->priv = g_vphy.l1ctl_sock; -- cgit v1.2.3