alloc: Merge find_least_busy_pdch and find_least_reserved_pdch
Both functions only differ in the computation of the value for
num_tbfs.
This commit merge both functions and adds a parameter containing a
function for that compuation.
Sponsored-by: On-Waves ehf
diff --git a/src/gprs_rlcmac_ts_alloc.cpp b/src/gprs_rlcmac_ts_alloc.cpp
index c1b7339..b427a54 100644
--- a/src/gprs_rlcmac_ts_alloc.cpp
+++ b/src/gprs_rlcmac_ts_alloc.cpp
@@ -178,9 +178,24 @@
return valid_ts_set;
}
+static int compute_usage_by_num_tbfs(struct gprs_rlcmac_pdch *pdch,
+ enum gprs_rlcmac_tbf_direction dir)
+{
+ return pdch->num_tbfs(dir);
+}
+
+static int compute_usage_by_reservation(struct gprs_rlcmac_pdch *pdch,
+ enum gprs_rlcmac_tbf_direction)
+{
+ return
+ pdch->num_reserved(GPRS_RLCMAC_DL_TBF) +
+ pdch->num_reserved(GPRS_RLCMAC_UL_TBF);
+}
+
static int find_least_busy_pdch(struct gprs_rlcmac_trx *trx,
enum gprs_rlcmac_tbf_direction dir,
uint8_t mask,
+ int (*fn)(struct gprs_rlcmac_pdch *, enum gprs_rlcmac_tbf_direction dir),
int *free_usf = 0)
{
unsigned ts;
@@ -196,65 +211,7 @@
if (((1 << ts) & mask) == 0)
continue;
- num_tbfs = pdch->num_tbfs(dir);
- if (num_tbfs < min_used) {
- /* We have found a candidate */
- /* Make sure that an USF is available */
- if (dir == GPRS_RLCMAC_UL_TBF) {
- usf = find_free_usf(pdch);
- if (usf < 0) {
- LOGP(DRLCMAC, LOGL_DEBUG,
- "- Skipping TS %d, because "
- "no USF available\n", ts);
- continue;
- }
- }
- if (min_ts >= 0)
- LOGP(DRLCMAC, LOGL_DEBUG,
- "- Skipping TS %d, because "
- "num TBFs %d > %d\n",
- min_ts, min_used, num_tbfs);
- min_used = num_tbfs;
- min_ts = ts;
- min_usf = usf;
- } else {
- LOGP(DRLCMAC, LOGL_DEBUG,
- "- Skipping TS %d, because "
- "num TBFs %d >= %d\n",
- ts, num_tbfs, min_used);
- }
- }
-
- if (min_ts < 0)
- return -1;
-
- if (free_usf)
- *free_usf = min_usf;
-
- return min_ts;
-}
-
-static int find_least_reserved_pdch(struct gprs_rlcmac_trx *trx,
- enum gprs_rlcmac_tbf_direction dir,
- uint8_t mask,
- int *free_usf = 0)
-{
- unsigned ts;
- int min_used = INT_MAX;
- int min_ts = -1;
- int min_usf = -1;
-
- for (ts = 0; ts < ARRAY_SIZE(trx->pdch); ts++) {
- struct gprs_rlcmac_pdch *pdch = &trx->pdch[ts];
- int num_tbfs;
- int usf = -1; /* must be signed */
-
- if (((1 << ts) & mask) == 0)
- continue;
-
- num_tbfs =
- pdch->num_reserved(GPRS_RLCMAC_DL_TBF) +
- pdch->num_reserved(GPRS_RLCMAC_UL_TBF);
+ num_tbfs = fn(pdch, dir);
if (num_tbfs < min_used) {
/* We have found a candidate */
@@ -356,7 +313,8 @@
if (!mask)
return -EINVAL;
- ts = find_least_reserved_pdch(tbf->trx, tbf->direction, mask, &usf);
+ ts = find_least_busy_pdch(tbf->trx, tbf->direction, mask,
+ compute_usage_by_reservation, &usf);
if (ts < 0) {
LOGP(DRLCMAC, LOGL_NOTICE, "- Failed "
@@ -702,7 +660,8 @@
if (ts < 0)
ts = find_least_busy_pdch(tbf->trx, tbf->direction,
- dl_slots & ul_slots, NULL);
+ dl_slots & ul_slots, compute_usage_by_num_tbfs,
+ NULL);
if (ts < 0)
ul_slots = dl_slots = lsb(dl_slots & ul_slots);
else
@@ -775,7 +734,8 @@
ul_slots = ul_slots & dl_slots;
ts = find_least_busy_pdch(tbf->trx, GPRS_RLCMAC_UL_TBF,
- ul_slots, &free_usf);
+ ul_slots, compute_usage_by_num_tbfs,
+ &free_usf);
if (free_usf < 0) {
LOGP(DRLCMAC, LOGL_NOTICE, "No USF available\n");