diff options
author | Harald Welte <laforge@gnumonks.org> | 2017-07-19 14:10:04 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2017-07-19 14:10:04 +0200 |
commit | 5e0fa863cb6a66c2073bb218489e6291755c2283 (patch) | |
tree | cd4d4d375862306690c5726a8e9d4254c0f7ffbf /src | |
parent | dd3fd10903e30eaff2e878cd6a7fce242032bc4c (diff) |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/host/virt_phy/src/virt_l1_sched_simple.c | 2 | ||||
-rw-r--r-- | src/host/virt_phy/src/virtphy.c | 27 |
2 files changed, 26 insertions, 3 deletions
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 <osmocom/core/msgb.h> #include <osmocom/core/select.h> #include <osmocom/core/gsmtap.h> +#include <osmocom/core/application.h> #include <stdint.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <getopt.h> #include <errno.h> +#include <signal.h> #include <virtphy/virtual_um.h> #include <virtphy/l1ctl_sock.h> #include <virtphy/virt_l1_model.h> @@ -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; |