summaryrefslogtreecommitdiffstats
path: root/src/host
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-07-19 14:10:04 +0200
committerHarald Welte <laforge@gnumonks.org>2017-07-19 14:10:04 +0200
commit5e0fa863cb6a66c2073bb218489e6291755c2283 (patch)
treecd4d4d375862306690c5726a8e9d4254c0f7ffbf /src/host
parentdd3fd10903e30eaff2e878cd6a7fce242032bc4c (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/host')
-rw-r--r--src/host/virt_phy/src/virt_l1_sched_simple.c2
-rw-r--r--src/host/virt_phy/src/virtphy.c27
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;