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