blob: f30c677a912ea3df651ff54557de49e49d7a7091 [file] [edit]
/* SPDX-License-Identifier: MIT */
/*
* Copyright © 2020 Red Hat, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
/**
* Source/sink objects.
*/
#pragma once
#include "config.h"
#include <stdbool.h>
struct source;
struct sink;
/**
* Callback invoked when the source has data available. userdata is the data
* provided to source_add().
*
* If source_enable_write() was called, this dispatch function is also called
* when writes are possible (and/or data is available to read at the same time).
*/
typedef void (*source_dispatch_t)(struct source *source, void *user_data);
/**
* Remove source from its sink without destroying it, a source may be
* re-added to a sink later.
*/
void
source_remove(struct source *source);
struct source *
source_ref(struct source *source);
/**
* Unref source. When the last reference is dropped, resources
* are released.
*
* Note that due to implementation details, it is not possible to get the
* refcount to zero by calling source_unref() in the caller, you *must*
* remove a source with source_remove() to be able to release it fully.
*/
struct source *
source_unref(struct source *source);
int
source_get_fd(struct source *source);
void *
source_get_user_data(struct source *source);
void
source_set_user_data(struct source *source, void *user_data);
/**
* Create a new source for the given file descriptor with the given dispatch
* callback. The source's default behavior is that the fd is closed on the
* call to source_remove().
*
* This source does not generate events until added to a sink with
* sink_add_source().
*
* The returned source has a refcount of 1, use source_unref() to release th
* memory.
*/
struct source *
source_new(int fd, source_dispatch_t dispatch, void *user_data);
void
source_never_close_fd(struct source *s);
/**
* Enable or disable write notifications on this source. By default we assume
* our sources only read from the fd and thus their dispatch is only called
* when there's data available to read.
*
* If write is enabled, the dispatch is also called with data available to write.
*/
int
source_enable_write(struct source *source, bool enable);
struct sink *
sink_new(void);
struct sink *
sink_unref(struct sink *sink);
int
sink_dispatch(struct sink *sink);
/**
* Add the source to the given sink. Use source_remove() to remove the
* source.
*/
int
sink_add_source(struct sink *sink, struct source *source);
/**
* The epollfd to monitor for this sink.
*/
int
sink_get_fd(struct sink *sink);