void dssl_SessionKT_Add( dssl_SessionKeyTable* tbl, DSSL_Session* sess ) { uint32_t hash; DSSL_SessionKeyData** prev; DSSL_SessionKeyData* new_data; _ASSERT( tbl ); _ASSERT( sess ); if( tbl->timeout_interval != 0 && time( NULL ) - tbl->last_cleanup_time > DSSL_CACHE_CLEANUP_INTERVAL ) { dssl_SessionKT_CleanSessionCache( tbl ); } new_data = CreateSessionKeyData( sess ); if( !new_data ) { /* TODO: log */ return; } hash = GetSessionIDCache( new_data->id ) % tbl->table_size; prev = &tbl->table[hash]; while( (*prev) != NULL ) prev = &(*prev)->next; (*prev) = new_data; ++ tbl->count; }
void TestSessionKeyTableAPI( CuTest* tc ) { dssl_SessionKeyTable* tbl = NULL; DSSL_Session* sess = NULL; DSSL_SessionKeyData* kd = NULL; tbl = dssl_SessionKT_Create( 100, TEST_CACHE_TIMEOUT ); CuAssert( tc, "SessionKeyTable object should be not NULL", tbl != NULL ); sess = (DSSL_Session*) malloc( sizeof( DSSL_Session ) ); CuAssert( tc, "DSSL_Session object should be not NULL", sess != NULL ); memset( sess, 0, sizeof(*sess) ); dssl_SessionKT_Add( tbl, sess ); CuAssertTrue( tc, tbl->count == 1 ); kd = dssl_SessionKT_Find( tbl, sess->session_id ); CuAssertTrue( tc, kd != NULL ); CuAssertTrue( tc, kd->refcount == 1 ); CuAssertTrue( tc, kd->released_time == 0 ); kd = NULL; dssl_SessionKT_Release( tbl, sess->session_id ); ThreadSleep( (TEST_CACHE_TIMEOUT+1)*1000 ); dssl_SessionKT_CleanSessionCache( tbl ); CuAssertTrue( tc, tbl->count == 0 ); free( sess ); dssl_SessionKT_Destroy( tbl ); }