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
This commit is contained in:
Harald Welte 2017-07-19 14:10:04 +02:00
parent dd3fd10903
commit 5e0fa863cb
2 changed files with 26 additions and 3 deletions

View File

@ -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;

View File

@ -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;