static Header* header_new(HrtBuffer *name, HrtBuffer *value) { Header *header; hrt_buffer_ref(name); hrt_buffer_ref(value); header = g_slice_new(Header); header->name = name; header->value = value; return header; }
/* TYPICALLY CALLED FROM ANOTHER THREAD */ void hio_output_stream_write(HioOutputStream *stream, HrtBuffer *locked_buffer) { g_return_if_fail(hrt_buffer_is_locked(locked_buffer)); if (hrt_buffer_get_length(locked_buffer) == 0) return; if (hio_output_stream_is_closed(stream)) return; g_mutex_lock(stream->buffers_lock); /* note, we still want to buffer stuff if fd == -1 since that just * means we aren't being asked to write yet. But on error, discard * anything that gets written. */ if (g_atomic_int_get(&stream->errored) == 0) { /* we could set stream->errored right here after we just * checked we haven't. However in that case, the * drop_all_buffers() just after we set stream->errored will * have to block for buffers_lock and only then drop them, so * it should drop this one we're pushing. */ hrt_buffer_ref(locked_buffer); g_queue_push_tail(&stream->buffers, locked_buffer); } g_mutex_unlock(stream->buffers_lock); /* add write watcher if necessary. */ check_write_watcher(stream); }