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