aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/tbf.cpp33
-rw-r--r--src/tbf.h5
-rw-r--r--tests/ms/MsTest.cpp22
3 files changed, 47 insertions, 13 deletions
diff --git a/src/tbf.cpp b/src/tbf.cpp
index 2e6da026..9d4363fa 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -41,6 +41,11 @@ extern void *tall_pcu_ctx;
static void tbf_timer_cb(void *_tbf);
+gprs_rlcmac_tbf::gprs_rlcmac_tbf(gprs_rlcmac_tbf_direction dir) :
+ direction(dir)
+{
+}
+
gprs_rlcmac_bts *gprs_rlcmac_tbf::bts_data() const
{
return bts->bts_data();
@@ -523,6 +528,17 @@ static int setup_tbf(struct gprs_rlcmac_tbf *tbf, struct gprs_rlcmac_bts *bts,
return 0;
}
+gprs_rlcmac_ul_tbf::gprs_rlcmac_ul_tbf() :
+ gprs_rlcmac_tbf(GPRS_RLCMAC_UL_TBF)
+{
+};
+
+static int ul_tbf_dtor(struct gprs_rlcmac_ul_tbf *tbf)
+{
+ tbf->~gprs_rlcmac_ul_tbf();
+ return 0;
+}
+
struct gprs_rlcmac_ul_tbf *tbf_alloc_ul_tbf(struct gprs_rlcmac_bts *bts,
GprsMs *ms, int8_t use_trx,
@@ -540,7 +556,8 @@ struct gprs_rlcmac_ul_tbf *tbf_alloc_ul_tbf(struct gprs_rlcmac_bts *bts,
if (!tbf)
return NULL;
- tbf->direction = GPRS_RLCMAC_UL_TBF;
+ talloc_set_destructor(tbf, ul_tbf_dtor);
+ new (tbf) gprs_rlcmac_ul_tbf();
if (!ms)
ms = bts->bts->ms_alloc(ms_class);
@@ -558,6 +575,17 @@ struct gprs_rlcmac_ul_tbf *tbf_alloc_ul_tbf(struct gprs_rlcmac_bts *bts,
return tbf;
}
+gprs_rlcmac_dl_tbf::gprs_rlcmac_dl_tbf() :
+ gprs_rlcmac_tbf(GPRS_RLCMAC_DL_TBF)
+{
+};
+
+static int dl_tbf_dtor(struct gprs_rlcmac_dl_tbf *tbf)
+{
+ tbf->~gprs_rlcmac_dl_tbf();
+ return 0;
+}
+
struct gprs_rlcmac_dl_tbf *tbf_alloc_dl_tbf(struct gprs_rlcmac_bts *bts,
GprsMs *ms, int8_t use_trx,
uint8_t ms_class, uint8_t single_slot)
@@ -574,7 +602,8 @@ struct gprs_rlcmac_dl_tbf *tbf_alloc_dl_tbf(struct gprs_rlcmac_bts *bts,
if (!tbf)
return NULL;
- tbf->direction = GPRS_RLCMAC_DL_TBF;
+ talloc_set_destructor(tbf, dl_tbf_dtor);
+ new (tbf) gprs_rlcmac_dl_tbf();
if (!ms)
ms = bts->bts->ms_alloc(ms_class);
diff --git a/src/tbf.h b/src/tbf.h
index a596ad7e..f1484f05 100644
--- a/src/tbf.h
+++ b/src/tbf.h
@@ -110,6 +110,7 @@ struct llist_pods {
prefetch(pos->member.list.next))
struct gprs_rlcmac_tbf {
+ gprs_rlcmac_tbf(gprs_rlcmac_tbf_direction dir);
static void free_all(struct gprs_rlcmac_trx *trx);
static void free_all(struct gprs_rlcmac_pdch *pdch);
@@ -306,6 +307,8 @@ inline time_t gprs_rlcmac_tbf::created_ts() const
}
struct gprs_rlcmac_dl_tbf : public gprs_rlcmac_tbf {
+ gprs_rlcmac_dl_tbf();
+
void cleanup();
/* dispatch Unitdata.DL messages */
@@ -371,6 +374,8 @@ protected:
};
struct gprs_rlcmac_ul_tbf : public gprs_rlcmac_tbf {
+ gprs_rlcmac_ul_tbf();
+
struct msgb *create_ul_ack(uint32_t fn);
/* blocks were acked */
diff --git a/tests/ms/MsTest.cpp b/tests/ms/MsTest.cpp
index 5a25d76f..7255da31 100644
--- a/tests/ms/MsTest.cpp
+++ b/tests/ms/MsTest.cpp
@@ -55,9 +55,9 @@ static void test_ms_state()
OSMO_ASSERT(ms->is_idle());
dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
- dl_tbf->direction = GPRS_RLCMAC_DL_TBF;
+ new (dl_tbf) gprs_rlcmac_dl_tbf();
ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
- ul_tbf->direction = GPRS_RLCMAC_UL_TBF;
+ new (ul_tbf) gprs_rlcmac_ul_tbf();
ms->attach_tbf(ul_tbf);
OSMO_ASSERT(!ms->is_idle());
@@ -116,9 +116,9 @@ static void test_ms_callback()
OSMO_ASSERT(ms->is_idle());
dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
- dl_tbf->direction = GPRS_RLCMAC_DL_TBF;
+ new (dl_tbf) gprs_rlcmac_dl_tbf();
ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
- ul_tbf->direction = GPRS_RLCMAC_UL_TBF;
+ new (ul_tbf) gprs_rlcmac_ul_tbf();
OSMO_ASSERT(last_cb == UNKNOWN);
@@ -186,11 +186,11 @@ static void test_ms_replace_tbf()
was_idle = false;
dl_tbf[0] = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
- dl_tbf[0]->direction = GPRS_RLCMAC_DL_TBF;
+ new (dl_tbf[0]) gprs_rlcmac_dl_tbf();
dl_tbf[1] = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
- dl_tbf[1]->direction = GPRS_RLCMAC_DL_TBF;
+ new (dl_tbf[1]) gprs_rlcmac_dl_tbf();
ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
- ul_tbf->direction = GPRS_RLCMAC_UL_TBF;
+ new (ul_tbf) gprs_rlcmac_ul_tbf();
ms->attach_tbf(dl_tbf[0]);
OSMO_ASSERT(!ms->is_idle());
@@ -343,7 +343,7 @@ static void test_ms_storage()
printf("=== start %s ===\n", __func__);
ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
- ul_tbf->direction = GPRS_RLCMAC_UL_TBF;
+ new (ul_tbf) gprs_rlcmac_ul_tbf();
ms = store.get_ms(tlli + 0);
OSMO_ASSERT(ms == NULL);
@@ -434,9 +434,9 @@ static void test_ms_timeout()
OSMO_ASSERT(ms->is_idle());
dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
- dl_tbf->direction = GPRS_RLCMAC_DL_TBF;
+ new (dl_tbf) gprs_rlcmac_dl_tbf();
ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
- ul_tbf->direction = GPRS_RLCMAC_UL_TBF;
+ new (ul_tbf) gprs_rlcmac_ul_tbf();
OSMO_ASSERT(last_cb == UNKNOWN);
@@ -492,7 +492,7 @@ static void test_ms_cs_selection()
OSMO_ASSERT(ms->is_idle());
dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
- dl_tbf->direction = GPRS_RLCMAC_DL_TBF;
+ new (dl_tbf) gprs_rlcmac_dl_tbf();
dl_tbf->set_ms(ms);
OSMO_ASSERT(!ms->is_idle());