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 ; }
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 ; }
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 ; }