Ejemplo n.º 1
0
int
owsl_socket_is_writable
(
	OWSLSocketInfo * socket
)
{
	return
	(
		(
			socket->type_info->mode == OWSL_MODE_DATAGRAM
			||
			socket->connected > 0
		)
		&&
		(
			socket->out_queue == NULL
			||
			! owqueue_is_full (socket->out_queue)
		)
		&&
		(
			socket->type_info->is_writable == NULL
			||
			socket->type_info->is_writable (socket)
		)
	) ;
}
Ejemplo n.º 2
0
static int
owqueue_signal_write
(
	OWQueue * queue
)
{
	OWQueueEvent event = 0 ;
	if (pthread_mutex_lock (& queue->state_mutex))
	{
		return -1 ;
	}
	if (queue->is_empty)
	{
		/* was empty before this write */
		queue->is_empty = 0 ;
		event |= OWQUEUE_NOT_EMPTY ;
	}
	else if (queue->space_needed)
	{
		/* if write succeed and there was space needed, assume that last failed write is forgotten */
		queue->space_needed = 0 ;
		event |= OWQUEUE_SPACE_AVAILABLE ;
	}
	if (owqueue_is_full (queue))
	{
		if (queue->packet_mode == OWQUEUE_MULTI_PACKET)
		{
			queue->space_needed = queue->packet_min_size ;
		}
		else
		{
			queue->space_needed = 1 ;
		}
		event |= OWQUEUE_SPACE_NEEDED ;
	}
	if (event != 0 && queue->callback_function != NULL)
	{
		queue->callback_function (queue, event, (void *) queue->callback_user_data) ;
	}
	if (pthread_mutex_unlock (& queue->state_mutex))
	{
		return -1 ;
	}
	return 0 ;
}