Esempio n. 1
0
int
owsl_socket_info_free
(
	OWSLSocketInfo * socket
)
{
	int return_code = 0 ;

	return_code |= pthread_mutex_destroy (& socket->listening_mutex) ;
	if (socket->out_queue != NULL)
	{
		return_code |= owqueue_free (socket->out_queue) ;
	}
	if (socket->in_queue != NULL)
	{
		return_code |= owqueue_free (socket->in_queue) ;
	}
	if (socket->name != NULL)
	{
		free (socket->name) ;
	}

	free (socket) ;

	return return_code ;
}
Esempio n. 2
0
int
owsl_base_in_queue_listen
(
    OWSLSocketInfo * socket_info_with_system_socket,
    int pending_max
)
{
    OWSLSocketInfo_with_SystemSocket * socket = (OWSLSocketInfo_with_SystemSocket *) socket_info_with_system_socket ;
    if (listen (socket->system_socket, pending_max))
    {
        return -1 ;
    }
    if (socket->out_queue != NULL)
    {
        if (owqueue_free (socket->out_queue))
        {
            return -1 ;
        }
        socket->out_queue = NULL ;
    }
    if (owqueue_free (socket->in_queue))
    {
        return -1 ;
    }
    /* queue size must be exactly a multiple of connection size to allow callback when it is just full */
    /* if full, callback will disable monitoring for incoming connections */
    socket->in_queue = owqueue_new
                       (
                           sizeof (OWSLConnection) * (pending_max / 2 + 1),   /* usable size */
                           OWQUEUE_PACKET,                                    /* mode */
                           pending_max / 2 + 1,                               /* packet maximum */
                           0                                                  /* packet info size */
                       ) ;
    if (socket->in_queue == NULL)
    {
        return -1 ;
    }
    return 0 ;
}
Esempio n. 3
0
OWSLSocketInfo *
owsl_socket_info_new
(
	OWSLSocketType type,
	size_t size,
	int in_queue_usable_size,
	OWQueuePacketMode in_queue_packet_mode,
	int in_queue_packet_max,
	int in_queue_packet_info_size,
	int out_queue_usable_size,
	OWQueuePacketMode out_queue_packet_mode,
	int out_queue_packet_max,
	int out_queue_packet_info_size
)
{
	OWSLSocketInfo * socket_info = malloc (size) ;
	if (socket_info != NULL)
	{
		socket_info->type_info = owsl_socket_type_info_get (type) ;
		socket_info->blocking_mode = OWSL_BLOCKING ;
		if (in_queue_usable_size > 0)
		{
			socket_info->in_queue = owqueue_new
			(
				in_queue_usable_size,
				in_queue_packet_mode,
				in_queue_packet_max,
				in_queue_packet_info_size
			) ;
			if (socket_info->in_queue == NULL)
			{
				free (socket_info) ;
				return NULL ;
			}
			owqueue_callback_set (socket_info->in_queue, (owsl_socket_type_info_get (type))->on_queue_event, socket_info) ;
		}
		else
		{
			socket_info->in_queue = NULL ;
		}
		if (out_queue_usable_size > 0)
		{
			socket_info->out_queue = owqueue_new
			(
				out_queue_usable_size,
				out_queue_packet_mode,
				out_queue_packet_max,
				out_queue_packet_info_size
			) ;
			if (socket_info->out_queue == NULL)
			{
				if (in_queue_usable_size > 0)
				{
					owqueue_free (socket_info->in_queue) ;
				}
				free (socket_info) ;
				return NULL ;
			}
			owqueue_callback_set (socket_info->out_queue, (owsl_socket_type_info_get (type))->on_queue_event, socket_info) ;
		}
		else
		{
			socket_info->out_queue = NULL ;
		}
		if (pthread_mutex_init (& socket_info->listening_mutex, NULL))
		{
			if (out_queue_usable_size > 0)
			{
				owqueue_free (socket_info->out_queue) ;
			}
			if (in_queue_usable_size > 0)
			{
				owqueue_free (socket_info->in_queue) ;
			}
			free (socket_info) ;
			return NULL ;
		}
		socket_info->listening = 0 ;
		socket_info->connected = 0 ;
		socket_info->error = 0 ;
		socket_info->callback_function = NULL ;
		socket_info->callback_user_data = NULL ;
		memset (& socket_info->bound_address, 0, sizeof (socket_info->bound_address)) ;
		((struct sockaddr *) (& socket_info->bound_address))->sa_family = AF_MAX ;
		socket_info->name = NULL ;
	}
	return socket_info ;
}