Files
android_kernel_samsung_sm86…/qdf/test/qdf_tracker_test.c
Dustin Brown 9c62f7d939 qcacmn: Add qdf_tracker
A common problem in any C code base is the proper management of various
resources, such as memory allocations, timers, works, locks, etc. To
that end, WLAN has added various one-off leak tracking features for
different resources over the years, to great benefit. However, this
approach is tedious, and prone to copy/paste and fix propagation issues,
making maintaining these various tracking features onerous.

Add a generic leak tracking data structure to WLAN for general use,
which implements these tracking logics. This will allow the various
resource tracking features to leverage this shared implementation for
ease of maintenance. Build on the hash table implementation added as
part of I7f5fc0c59ed220bde43044e7013b3c8573f1bf39.

Change-Id: I3247ace583108139dfb699ca077db3bdf5cfeace
CRs-Fixed: 2422958
2019-04-02 15:16:18 -07:00

96 lines
2.5 KiB
C

/*
* Copyright (c) 2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all
* copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#include "qdf_tracker.h"
#include "qdf_tracker_test.h"
#include "qdf_trace.h"
#include "qdf_types.h"
#define qdf_ut_tracker_bits 4 /* 16 buckets */
#define qdf_ut_tracker_item_count 3
#define qdf_ut_tracker_declare(name) \
qdf_tracker_declare(name, qdf_ut_tracker_bits, "unit-test leak", \
"unit-test alloc", "unit-test free")
static uint32_t qdf_tracker_test_empty(void)
{
qdf_ut_tracker_declare(tracker);
char func[QDF_TRACKER_FUNC_SIZE];
uint32_t line;
/* a new tracker should ... */
qdf_tracker_init(&tracker);
/* ... be empty */
qdf_tracker_check_for_leaks(&tracker);
/* ... not contain an arbitrary pointer */
QDF_BUG(!qdf_tracker_lookup(&tracker, &tracker, &func, &line));
qdf_tracker_deinit(&tracker);
return 0;
}
static uint32_t qdf_tracker_test_add_remove(void)
{
qdf_ut_tracker_declare(tracker);
bool items[qdf_ut_tracker_item_count];
QDF_STATUS status;
int i;
qdf_tracker_init(&tracker);
/* an empty tracker should track items */
for (i = 0; i < qdf_ut_tracker_item_count; i++) {
status = qdf_tracker_track(&tracker, items + i,
__func__, __LINE__);
items[i] = QDF_IS_STATUS_SUCCESS(status);
}
/* a non-empty tracker should find previously added items */
for (i = 0; i < qdf_ut_tracker_item_count; i++) {
char func[QDF_TRACKER_FUNC_SIZE];
uint32_t line;
if (!items[i])
continue;
QDF_BUG(qdf_tracker_lookup(&tracker, items + i, &func, &line));
qdf_tracker_untrack(&tracker, items + i, __func__, __LINE__);
}
/* a tracker should be empty after all items are untracked*/
qdf_tracker_check_for_leaks(&tracker);
qdf_tracker_deinit(&tracker);
return 0;
}
uint32_t qdf_tracker_unit_test(void)
{
uint32_t errors = 0;
errors += qdf_tracker_test_empty();
errors += qdf_tracker_test_add_remove();
return errors;
}