charon-tkm: Return current refcount when releasing ID

This commit is contained in:
Adrian-Ken Rueegsegger
2017-09-15 12:16:57 +02:00
committed by Tobias Brunner
parent 1b2a8d963a
commit c198ddcb3f
3 changed files with 23 additions and 23 deletions
+5 -4
View File
@@ -130,27 +130,28 @@ METHOD(tkm_id_manager_t, acquire_ref, bool,
return TRUE; return TRUE;
} }
METHOD(tkm_id_manager_t, release_id, bool, METHOD(tkm_id_manager_t, release_id, int,
private_tkm_id_manager_t * const this, const tkm_context_kind_t kind, private_tkm_id_manager_t * const this, const tkm_context_kind_t kind,
const int id) const int id)
{ {
const int idx = id - 1; const int idx = id - 1;
int refcount = 0;
if (!is_valid_kind(kind)) if (!is_valid_kind(kind))
{ {
DBG1(DBG_LIB, "tried to release id %d for invalid context kind '%d'", DBG1(DBG_LIB, "tried to release id %d for invalid context kind '%d'",
id, kind); id, kind);
return FALSE; return -1;
} }
this->locks[kind]->write_lock(this->locks[kind]); this->locks[kind]->write_lock(this->locks[kind]);
if (this->ctxids[kind][idx] > 0) if (this->ctxids[kind][idx] > 0)
{ {
this->ctxids[kind][idx]--; refcount = --this->ctxids[kind][idx];
} }
this->locks[kind]->unlock(this->locks[kind]); this->locks[kind]->unlock(this->locks[kind]);
return TRUE; return refcount;
} }
+4 -4
View File
@@ -90,11 +90,11 @@ struct tkm_id_manager_t {
* *
* @param kind kind of context id to release * @param kind kind of context id to release
* @param id id to release * @param id id to release
* @return TRUE if id was released, FALSE otherwise * @return current refcount if id was released, -1 otherwise
*/ */
bool (*release_id)(tkm_id_manager_t * const this, int (*release_id)(tkm_id_manager_t * const this,
const tkm_context_kind_t kind, const tkm_context_kind_t kind,
const int id); const int id);
/** /**
* Destroy a tkm_id_manager instance. * Destroy a tkm_id_manager instance.
+14 -15
View File
@@ -151,19 +151,18 @@ END_TEST
START_TEST(test_release_id) START_TEST(test_release_id)
{ {
int i, id = 0; int i, count, id = 0;
bool released = false;
tkm_id_manager_t *idmgr = tkm_id_manager_create(limits); tkm_id_manager_t *idmgr = tkm_id_manager_create(limits);
for (i = 0; i < TKM_CTX_MAX; i++) for (i = 0; i < TKM_CTX_MAX; i++)
{ {
id = idmgr->acquire_id(idmgr, i); id = idmgr->acquire_id(idmgr, i);
released = idmgr->release_id(idmgr, i, id); count = idmgr->release_id(idmgr, i, id);
fail_unless(released, "Error releasing id of context kind %d", i); fail_unless(count == 0, "Error releasing id of context kind %d", i);
/* Reset released variable */ /* Reset count variable */
released = FALSE; count = 0;
} }
idmgr->destroy(idmgr); idmgr->destroy(idmgr);
@@ -172,17 +171,17 @@ END_TEST
START_TEST(test_release_id_invalid_kind) START_TEST(test_release_id_invalid_kind)
{ {
bool released = TRUE; int count = 0;
tkm_id_manager_t *idmgr = tkm_id_manager_create(limits); tkm_id_manager_t *idmgr = tkm_id_manager_create(limits);
released = idmgr->release_id(idmgr, TKM_CTX_MAX, 1); count = idmgr->release_id(idmgr, TKM_CTX_MAX, 1);
fail_if(released, "Released id for invalid context kind %d", TKM_CTX_MAX); fail_if(count >= 0, "Released id for invalid context kind %d", TKM_CTX_MAX);
/* Reset test variable */ /* Reset test variable */
released = TRUE; count = 0;
released = idmgr->release_id(idmgr, -1, 1); count = idmgr->release_id(idmgr, -1, 1);
fail_if(released, "Released id for invalid context kind %d", -1); fail_if(count >= 0, "Released id for invalid context kind %d", -1);
idmgr->destroy(idmgr); idmgr->destroy(idmgr);
} }
@@ -190,11 +189,11 @@ END_TEST
START_TEST(test_release_id_nonexistent) START_TEST(test_release_id_nonexistent)
{ {
bool released = FALSE; int count = 0;
tkm_id_manager_t *idmgr = tkm_id_manager_create(limits); tkm_id_manager_t *idmgr = tkm_id_manager_create(limits);
released = idmgr->release_id(idmgr, TKM_CTX_NONCE, 1); count = idmgr->release_id(idmgr, TKM_CTX_NONCE, 1);
fail_unless(released, "Release of nonexistent id failed"); fail_unless(count == 0, "Release of nonexistent id failed");
idmgr->destroy(idmgr); idmgr->destroy(idmgr);
} }