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;
}
Esempio n. 2
0
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 );
}