- tcp_port_monitor_t * p_monitor;
-
- /* create the monitor */
- p_monitor = (tcp_port_monitor_t *) calloc(1, sizeof(tcp_port_monitor_t) );
- if ( !p_monitor )
- return NULL;
-
- /* create the monitor's connection hash */
- if ( hash_create( &p_monitor->hash,
- p_creation_args && p_creation_args->min_port_monitor_connections > 0 ?
- calc_efficient_hash_size( p_creation_args->min_port_monitor_connections,
- TCP_CONNECTION_HASH_SIZE_MAX,
- TCP_CONNECTION_HASH_MAX_LOAD_RATIO ) :
- TCP_CONNECTION_HASH_SIZE_DEFAULT,
- &connection_hash_function_1, &connection_hash_function_2,
- &connection_match_function, NULL ) != 0 )
- {
- /* we failed to create the hash, so destroy the monitor completely so we don't leak */
- destroy_tcp_port_monitor(p_monitor,NULL);
- return NULL;
- }
-
- /* create the monitor's peek array */
- if ( (p_monitor->p_peek = (tcp_connection_t **) calloc( p_monitor->hash.positions, sizeof(tcp_connection_t *))) == NULL )
- {
- /* we failed to create the peek array, so destroy the monitor completely, again, so we don't leak */
- destroy_tcp_port_monitor(p_monitor,NULL);
- return NULL ;
- }
-
- p_monitor->port_range_begin = port_range_begin;
- p_monitor->port_range_end = port_range_end;
-
- p_monitor->connection_list.p_head = NULL;
- p_monitor->connection_list.p_tail = NULL;
-
- return p_monitor;
-}