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");