GUAC-1172: Add object alloc/free. Add object index pool.

This commit is contained in:
Michael Jumper 2015-06-19 14:41:25 -07:00
parent 6e3a12b604
commit 95ede7a91d
2 changed files with 46 additions and 2 deletions

View File

@ -125,6 +125,39 @@ void guac_client_free_stream(guac_client* client, guac_stream* stream) {
} }
guac_object* guac_client_alloc_object(guac_client* client) {
guac_object* allocd_object;
int object_index;
/* Refuse to allocate beyond maximum */
if (client->__object_pool->active == GUAC_CLIENT_MAX_OBJECTS)
return NULL;
/* Allocate object */
object_index = guac_pool_next_int(client->__object_pool);
/* Initialize object */
allocd_object = &(client->__objects[object_index]);
allocd_object->index = object_index;
allocd_object->data = NULL;
allocd_object->get_handler = NULL;
allocd_object->put_handler = NULL;
return allocd_object;
}
void guac_client_free_object(guac_client* client, guac_object* object) {
/* Release index to pool */
guac_pool_free_int(client->__object_pool, object->index);
/* Mark object as undefined */
object->index = GUAC_CLIENT_UNDEFINED_OBJECT_INDEX;
}
/** /**
* Returns a newly allocated string containing a guaranteed-unique connection * Returns a newly allocated string containing a guaranteed-unique connection
* identifier string which is 37 characters long and begins with a '$' * identifier string which is 37 characters long and begins with a '$'
@ -226,6 +259,9 @@ guac_client* guac_client_alloc() {
client->__output_streams[i].index = GUAC_CLIENT_CLOSED_STREAM_INDEX; client->__output_streams[i].index = GUAC_CLIENT_CLOSED_STREAM_INDEX;
} }
/* Allocate object pool */
client->__object_pool = guac_pool_alloc(0);
/* Initialize objects */ /* Initialize objects */
client->__objects = malloc(sizeof(guac_object) * GUAC_CLIENT_MAX_OBJECTS); client->__objects = malloc(sizeof(guac_object) * GUAC_CLIENT_MAX_OBJECTS);
for (i=0; i<GUAC_CLIENT_MAX_OBJECTS; i++) for (i=0; i<GUAC_CLIENT_MAX_OBJECTS; i++)
@ -252,11 +288,14 @@ void guac_client_free(guac_client* client) {
free(client->__input_streams); free(client->__input_streams);
free(client->__output_streams); free(client->__output_streams);
/* Free stream pool */
guac_pool_free(client->__stream_pool);
/* Free objects */ /* Free objects */
free(client->__objects); free(client->__objects);
/* Free stream pool */ /* Free object pool */
guac_pool_free(client->__stream_pool); guac_pool_free(client->__object_pool);
free(client); free(client);
} }

View File

@ -436,6 +436,11 @@ struct guac_client {
*/ */
guac_stream* __input_streams; guac_stream* __input_streams;
/**
* Pool of object indices.
*/
guac_pool* __object_pool;
/** /**
* All available objects (arbitrary sets of named streams). * All available objects (arbitrary sets of named streams).
*/ */