cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

channel.h (29268B)


      1/*
      2 * QEMU I/O channels
      3 *
      4 * Copyright (c) 2015 Red Hat, Inc.
      5 *
      6 * This library is free software; you can redistribute it and/or
      7 * modify it under the terms of the GNU Lesser General Public
      8 * License as published by the Free Software Foundation; either
      9 * version 2.1 of the License, or (at your option) any later version.
     10 *
     11 * This library is distributed in the hope that it will be useful,
     12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14 * Lesser General Public License for more details.
     15 *
     16 * You should have received a copy of the GNU Lesser General Public
     17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
     18 *
     19 */
     20
     21#ifndef QIO_CHANNEL_H
     22#define QIO_CHANNEL_H
     23
     24#include "qom/object.h"
     25#include "qemu/coroutine.h"
     26#include "block/aio.h"
     27
     28#define TYPE_QIO_CHANNEL "qio-channel"
     29OBJECT_DECLARE_TYPE(QIOChannel, QIOChannelClass,
     30                    QIO_CHANNEL)
     31
     32
     33#define QIO_CHANNEL_ERR_BLOCK -2
     34
     35typedef enum QIOChannelFeature QIOChannelFeature;
     36
     37enum QIOChannelFeature {
     38    QIO_CHANNEL_FEATURE_FD_PASS,
     39    QIO_CHANNEL_FEATURE_SHUTDOWN,
     40    QIO_CHANNEL_FEATURE_LISTEN,
     41};
     42
     43
     44typedef enum QIOChannelShutdown QIOChannelShutdown;
     45
     46enum QIOChannelShutdown {
     47    QIO_CHANNEL_SHUTDOWN_READ = 1,
     48    QIO_CHANNEL_SHUTDOWN_WRITE = 2,
     49    QIO_CHANNEL_SHUTDOWN_BOTH = 3,
     50};
     51
     52typedef gboolean (*QIOChannelFunc)(QIOChannel *ioc,
     53                                   GIOCondition condition,
     54                                   gpointer data);
     55
     56/**
     57 * QIOChannel:
     58 *
     59 * The QIOChannel defines the core API for a generic I/O channel
     60 * class hierarchy. It is inspired by GIOChannel, but has the
     61 * following differences
     62 *
     63 *  - Use QOM to properly support arbitrary subclassing
     64 *  - Support use of iovecs for efficient I/O with multiple blocks
     65 *  - None of the character set translation, binary data exclusively
     66 *  - Direct support for QEMU Error object reporting
     67 *  - File descriptor passing
     68 *
     69 * This base class is abstract so cannot be instantiated. There
     70 * will be subclasses for dealing with sockets, files, and higher
     71 * level protocols such as TLS, WebSocket, etc.
     72 */
     73
     74struct QIOChannel {
     75    Object parent;
     76    unsigned int features; /* bitmask of QIOChannelFeatures */
     77    char *name;
     78    AioContext *ctx;
     79    Coroutine *read_coroutine;
     80    Coroutine *write_coroutine;
     81#ifdef _WIN32
     82    HANDLE event; /* For use with GSource on Win32 */
     83#endif
     84};
     85
     86/**
     87 * QIOChannelClass:
     88 *
     89 * This class defines the contract that all subclasses
     90 * must follow to provide specific channel implementations.
     91 * The first five callbacks are mandatory to support, others
     92 * provide additional optional features.
     93 *
     94 * Consult the corresponding public API docs for a description
     95 * of the semantics of each callback. io_shutdown in particular
     96 * must be thread-safe, terminate quickly and must not block.
     97 */
     98struct QIOChannelClass {
     99    ObjectClass parent;
    100
    101    /* Mandatory callbacks */
    102    ssize_t (*io_writev)(QIOChannel *ioc,
    103                         const struct iovec *iov,
    104                         size_t niov,
    105                         int *fds,
    106                         size_t nfds,
    107                         Error **errp);
    108    ssize_t (*io_readv)(QIOChannel *ioc,
    109                        const struct iovec *iov,
    110                        size_t niov,
    111                        int **fds,
    112                        size_t *nfds,
    113                        Error **errp);
    114    int (*io_close)(QIOChannel *ioc,
    115                    Error **errp);
    116    GSource * (*io_create_watch)(QIOChannel *ioc,
    117                                 GIOCondition condition);
    118    int (*io_set_blocking)(QIOChannel *ioc,
    119                           bool enabled,
    120                           Error **errp);
    121
    122    /* Optional callbacks */
    123    int (*io_shutdown)(QIOChannel *ioc,
    124                       QIOChannelShutdown how,
    125                       Error **errp);
    126    void (*io_set_cork)(QIOChannel *ioc,
    127                        bool enabled);
    128    void (*io_set_delay)(QIOChannel *ioc,
    129                         bool enabled);
    130    off_t (*io_seek)(QIOChannel *ioc,
    131                     off_t offset,
    132                     int whence,
    133                     Error **errp);
    134    void (*io_set_aio_fd_handler)(QIOChannel *ioc,
    135                                  AioContext *ctx,
    136                                  IOHandler *io_read,
    137                                  IOHandler *io_write,
    138                                  void *opaque);
    139};
    140
    141/* General I/O handling functions */
    142
    143/**
    144 * qio_channel_has_feature:
    145 * @ioc: the channel object
    146 * @feature: the feature to check support of
    147 *
    148 * Determine whether the channel implementation supports
    149 * the optional feature named in @feature.
    150 *
    151 * Returns: true if supported, false otherwise.
    152 */
    153bool qio_channel_has_feature(QIOChannel *ioc,
    154                             QIOChannelFeature feature);
    155
    156/**
    157 * qio_channel_set_feature:
    158 * @ioc: the channel object
    159 * @feature: the feature to set support for
    160 *
    161 * Add channel support for the feature named in @feature.
    162 */
    163void qio_channel_set_feature(QIOChannel *ioc,
    164                             QIOChannelFeature feature);
    165
    166/**
    167 * qio_channel_set_name:
    168 * @ioc: the channel object
    169 * @name: the name of the channel
    170 *
    171 * Sets the name of the channel, which serves as an aid
    172 * to debugging. The name is used when creating GSource
    173 * watches for this channel.
    174 */
    175void qio_channel_set_name(QIOChannel *ioc,
    176                          const char *name);
    177
    178/**
    179 * qio_channel_readv_full:
    180 * @ioc: the channel object
    181 * @iov: the array of memory regions to read data into
    182 * @niov: the length of the @iov array
    183 * @fds: pointer to an array that will received file handles
    184 * @nfds: pointer filled with number of elements in @fds on return
    185 * @errp: pointer to a NULL-initialized error object
    186 *
    187 * Read data from the IO channel, storing it in the
    188 * memory regions referenced by @iov. Each element
    189 * in the @iov will be fully populated with data
    190 * before the next one is used. The @niov parameter
    191 * specifies the total number of elements in @iov.
    192 *
    193 * It is not required for all @iov to be filled with
    194 * data. If the channel is in blocking mode, at least
    195 * one byte of data will be read, but no more is
    196 * guaranteed. If the channel is non-blocking and no
    197 * data is available, it will return QIO_CHANNEL_ERR_BLOCK
    198 *
    199 * If the channel has passed any file descriptors,
    200 * the @fds array pointer will be allocated and
    201 * the elements filled with the received file
    202 * descriptors. The @nfds pointer will be updated
    203 * to indicate the size of the @fds array that
    204 * was allocated. It is the callers responsibility
    205 * to call close() on each file descriptor and to
    206 * call g_free() on the array pointer in @fds.
    207 *
    208 * It is an error to pass a non-NULL @fds parameter
    209 * unless qio_channel_has_feature() returns a true
    210 * value for the QIO_CHANNEL_FEATURE_FD_PASS constant.
    211 *
    212 * Returns: the number of bytes read, or -1 on error,
    213 * or QIO_CHANNEL_ERR_BLOCK if no data is available
    214 * and the channel is non-blocking
    215 */
    216ssize_t qio_channel_readv_full(QIOChannel *ioc,
    217                               const struct iovec *iov,
    218                               size_t niov,
    219                               int **fds,
    220                               size_t *nfds,
    221                               Error **errp);
    222
    223
    224/**
    225 * qio_channel_writev_full:
    226 * @ioc: the channel object
    227 * @iov: the array of memory regions to write data from
    228 * @niov: the length of the @iov array
    229 * @fds: an array of file handles to send
    230 * @nfds: number of file handles in @fds
    231 * @errp: pointer to a NULL-initialized error object
    232 *
    233 * Write data to the IO channel, reading it from the
    234 * memory regions referenced by @iov. Each element
    235 * in the @iov will be fully sent, before the next
    236 * one is used. The @niov parameter specifies the
    237 * total number of elements in @iov.
    238 *
    239 * It is not required for all @iov data to be fully
    240 * sent. If the channel is in blocking mode, at least
    241 * one byte of data will be sent, but no more is
    242 * guaranteed. If the channel is non-blocking and no
    243 * data can be sent, it will return QIO_CHANNEL_ERR_BLOCK
    244 *
    245 * If there are file descriptors to send, the @fds
    246 * array should be non-NULL and provide the handles.
    247 * All file descriptors will be sent if at least one
    248 * byte of data was sent.
    249 *
    250 * It is an error to pass a non-NULL @fds parameter
    251 * unless qio_channel_has_feature() returns a true
    252 * value for the QIO_CHANNEL_FEATURE_FD_PASS constant.
    253 *
    254 * Returns: the number of bytes sent, or -1 on error,
    255 * or QIO_CHANNEL_ERR_BLOCK if no data is can be sent
    256 * and the channel is non-blocking
    257 */
    258ssize_t qio_channel_writev_full(QIOChannel *ioc,
    259                                const struct iovec *iov,
    260                                size_t niov,
    261                                int *fds,
    262                                size_t nfds,
    263                                Error **errp);
    264
    265/**
    266 * qio_channel_readv_all_eof:
    267 * @ioc: the channel object
    268 * @iov: the array of memory regions to read data into
    269 * @niov: the length of the @iov array
    270 * @errp: pointer to a NULL-initialized error object
    271 *
    272 * Read data from the IO channel, storing it in the
    273 * memory regions referenced by @iov. Each element
    274 * in the @iov will be fully populated with data
    275 * before the next one is used. The @niov parameter
    276 * specifies the total number of elements in @iov.
    277 *
    278 * The function will wait for all requested data
    279 * to be read, yielding from the current coroutine
    280 * if required.
    281 *
    282 * If end-of-file occurs before any data is read,
    283 * no error is reported; otherwise, if it occurs
    284 * before all requested data has been read, an error
    285 * will be reported.
    286 *
    287 * Returns: 1 if all bytes were read, 0 if end-of-file
    288 *          occurs without data, or -1 on error
    289 */
    290int qio_channel_readv_all_eof(QIOChannel *ioc,
    291                              const struct iovec *iov,
    292                              size_t niov,
    293                              Error **errp);
    294
    295/**
    296 * qio_channel_readv_all:
    297 * @ioc: the channel object
    298 * @iov: the array of memory regions to read data into
    299 * @niov: the length of the @iov array
    300 * @errp: pointer to a NULL-initialized error object
    301 *
    302 * Read data from the IO channel, storing it in the
    303 * memory regions referenced by @iov. Each element
    304 * in the @iov will be fully populated with data
    305 * before the next one is used. The @niov parameter
    306 * specifies the total number of elements in @iov.
    307 *
    308 * The function will wait for all requested data
    309 * to be read, yielding from the current coroutine
    310 * if required.
    311 *
    312 * If end-of-file occurs before all requested data
    313 * has been read, an error will be reported.
    314 *
    315 * Returns: 0 if all bytes were read, or -1 on error
    316 */
    317int qio_channel_readv_all(QIOChannel *ioc,
    318                          const struct iovec *iov,
    319                          size_t niov,
    320                          Error **errp);
    321
    322
    323/**
    324 * qio_channel_writev_all:
    325 * @ioc: the channel object
    326 * @iov: the array of memory regions to write data from
    327 * @niov: the length of the @iov array
    328 * @errp: pointer to a NULL-initialized error object
    329 *
    330 * Write data to the IO channel, reading it from the
    331 * memory regions referenced by @iov. Each element
    332 * in the @iov will be fully sent, before the next
    333 * one is used. The @niov parameter specifies the
    334 * total number of elements in @iov.
    335 *
    336 * The function will wait for all requested data
    337 * to be written, yielding from the current coroutine
    338 * if required.
    339 *
    340 * Returns: 0 if all bytes were written, or -1 on error
    341 */
    342int qio_channel_writev_all(QIOChannel *ioc,
    343                           const struct iovec *iov,
    344                           size_t niov,
    345                           Error **erp);
    346
    347/**
    348 * qio_channel_readv:
    349 * @ioc: the channel object
    350 * @iov: the array of memory regions to read data into
    351 * @niov: the length of the @iov array
    352 * @errp: pointer to a NULL-initialized error object
    353 *
    354 * Behaves as qio_channel_readv_full() but does not support
    355 * receiving of file handles.
    356 */
    357ssize_t qio_channel_readv(QIOChannel *ioc,
    358                          const struct iovec *iov,
    359                          size_t niov,
    360                          Error **errp);
    361
    362/**
    363 * qio_channel_writev:
    364 * @ioc: the channel object
    365 * @iov: the array of memory regions to write data from
    366 * @niov: the length of the @iov array
    367 * @errp: pointer to a NULL-initialized error object
    368 *
    369 * Behaves as qio_channel_writev_full() but does not support
    370 * sending of file handles.
    371 */
    372ssize_t qio_channel_writev(QIOChannel *ioc,
    373                           const struct iovec *iov,
    374                           size_t niov,
    375                           Error **errp);
    376
    377/**
    378 * qio_channel_read:
    379 * @ioc: the channel object
    380 * @buf: the memory region to read data into
    381 * @buflen: the length of @buf
    382 * @errp: pointer to a NULL-initialized error object
    383 *
    384 * Behaves as qio_channel_readv_full() but does not support
    385 * receiving of file handles, and only supports reading into
    386 * a single memory region.
    387 */
    388ssize_t qio_channel_read(QIOChannel *ioc,
    389                         char *buf,
    390                         size_t buflen,
    391                         Error **errp);
    392
    393/**
    394 * qio_channel_write:
    395 * @ioc: the channel object
    396 * @buf: the memory regions to send data from
    397 * @buflen: the length of @buf
    398 * @errp: pointer to a NULL-initialized error object
    399 *
    400 * Behaves as qio_channel_writev_full() but does not support
    401 * sending of file handles, and only supports writing from a
    402 * single memory region.
    403 */
    404ssize_t qio_channel_write(QIOChannel *ioc,
    405                          const char *buf,
    406                          size_t buflen,
    407                          Error **errp);
    408
    409/**
    410 * qio_channel_read_all_eof:
    411 * @ioc: the channel object
    412 * @buf: the memory region to read data into
    413 * @buflen: the number of bytes to @buf
    414 * @errp: pointer to a NULL-initialized error object
    415 *
    416 * Reads @buflen bytes into @buf, possibly blocking or (if the
    417 * channel is non-blocking) yielding from the current coroutine
    418 * multiple times until the entire content is read. If end-of-file
    419 * occurs immediately it is not an error, but if it occurs after
    420 * data has been read it will return an error rather than a
    421 * short-read. Otherwise behaves as qio_channel_read().
    422 *
    423 * Returns: 1 if all bytes were read, 0 if end-of-file occurs
    424 *          without data, or -1 on error
    425 */
    426int qio_channel_read_all_eof(QIOChannel *ioc,
    427                             char *buf,
    428                             size_t buflen,
    429                             Error **errp);
    430
    431/**
    432 * qio_channel_read_all:
    433 * @ioc: the channel object
    434 * @buf: the memory region to read data into
    435 * @buflen: the number of bytes to @buf
    436 * @errp: pointer to a NULL-initialized error object
    437 *
    438 * Reads @buflen bytes into @buf, possibly blocking or (if the
    439 * channel is non-blocking) yielding from the current coroutine
    440 * multiple times until the entire content is read. If end-of-file
    441 * occurs it will return an error rather than a short-read. Otherwise
    442 * behaves as qio_channel_read().
    443 *
    444 * Returns: 0 if all bytes were read, or -1 on error
    445 */
    446int qio_channel_read_all(QIOChannel *ioc,
    447                         char *buf,
    448                         size_t buflen,
    449                         Error **errp);
    450
    451/**
    452 * qio_channel_write_all:
    453 * @ioc: the channel object
    454 * @buf: the memory region to write data into
    455 * @buflen: the number of bytes to @buf
    456 * @errp: pointer to a NULL-initialized error object
    457 *
    458 * Writes @buflen bytes from @buf, possibly blocking or (if the
    459 * channel is non-blocking) yielding from the current coroutine
    460 * multiple times until the entire content is written.  Otherwise
    461 * behaves as qio_channel_write().
    462 *
    463 * Returns: 0 if all bytes were written, or -1 on error
    464 */
    465int qio_channel_write_all(QIOChannel *ioc,
    466                          const char *buf,
    467                          size_t buflen,
    468                          Error **errp);
    469
    470/**
    471 * qio_channel_set_blocking:
    472 * @ioc: the channel object
    473 * @enabled: the blocking flag state
    474 * @errp: pointer to a NULL-initialized error object
    475 *
    476 * If @enabled is true, then the channel is put into
    477 * blocking mode, otherwise it will be non-blocking.
    478 *
    479 * In non-blocking mode, read/write operations may
    480 * return QIO_CHANNEL_ERR_BLOCK if they would otherwise
    481 * block on I/O
    482 */
    483int qio_channel_set_blocking(QIOChannel *ioc,
    484                             bool enabled,
    485                             Error **errp);
    486
    487/**
    488 * qio_channel_close:
    489 * @ioc: the channel object
    490 * @errp: pointer to a NULL-initialized error object
    491 *
    492 * Close the channel, flushing any pending I/O
    493 *
    494 * Returns: 0 on success, -1 on error
    495 */
    496int qio_channel_close(QIOChannel *ioc,
    497                      Error **errp);
    498
    499/**
    500 * qio_channel_shutdown:
    501 * @ioc: the channel object
    502 * @how: the direction to shutdown
    503 * @errp: pointer to a NULL-initialized error object
    504 *
    505 * Shutdowns transmission and/or receiving of data
    506 * without closing the underlying transport.
    507 *
    508 * Not all implementations will support this facility,
    509 * so may report an error. To avoid errors, the
    510 * caller may check for the feature flag
    511 * QIO_CHANNEL_FEATURE_SHUTDOWN prior to calling
    512 * this method.
    513 *
    514 * This function is thread-safe, terminates quickly and does not block.
    515 *
    516 * Returns: 0 on success, -1 on error
    517 */
    518int qio_channel_shutdown(QIOChannel *ioc,
    519                         QIOChannelShutdown how,
    520                         Error **errp);
    521
    522/**
    523 * qio_channel_set_delay:
    524 * @ioc: the channel object
    525 * @enabled: the new flag state
    526 *
    527 * Controls whether the underlying transport is
    528 * permitted to delay writes in order to merge
    529 * small packets. If @enabled is true, then the
    530 * writes may be delayed in order to opportunistically
    531 * merge small packets into larger ones. If @enabled
    532 * is false, writes are dispatched immediately with
    533 * no delay.
    534 *
    535 * When @enabled is false, applications may wish to
    536 * use the qio_channel_set_cork() method to explicitly
    537 * control write merging.
    538 *
    539 * On channels which are backed by a socket, this
    540 * API corresponds to the inverse of TCP_NODELAY flag,
    541 * controlling whether the Nagle algorithm is active.
    542 *
    543 * This setting is merely a hint, so implementations are
    544 * free to ignore this without it being considered an
    545 * error.
    546 */
    547void qio_channel_set_delay(QIOChannel *ioc,
    548                           bool enabled);
    549
    550/**
    551 * qio_channel_set_cork:
    552 * @ioc: the channel object
    553 * @enabled: the new flag state
    554 *
    555 * Controls whether the underlying transport is
    556 * permitted to dispatch data that is written.
    557 * If @enabled is true, then any data written will
    558 * be queued in local buffers until @enabled is
    559 * set to false once again.
    560 *
    561 * This feature is typically used when the automatic
    562 * write coalescing facility is disabled via the
    563 * qio_channel_set_delay() method.
    564 *
    565 * On channels which are backed by a socket, this
    566 * API corresponds to the TCP_CORK flag.
    567 *
    568 * This setting is merely a hint, so implementations are
    569 * free to ignore this without it being considered an
    570 * error.
    571 */
    572void qio_channel_set_cork(QIOChannel *ioc,
    573                          bool enabled);
    574
    575
    576/**
    577 * qio_channel_seek:
    578 * @ioc: the channel object
    579 * @offset: the position to seek to, relative to @whence
    580 * @whence: one of the (POSIX) SEEK_* constants listed below
    581 * @errp: pointer to a NULL-initialized error object
    582 *
    583 * Moves the current I/O position within the channel
    584 * @ioc, to be @offset. The value of @offset is
    585 * interpreted relative to @whence:
    586 *
    587 * SEEK_SET - the position is set to @offset bytes
    588 * SEEK_CUR - the position is moved by @offset bytes
    589 * SEEK_END - the position is set to end of the file plus @offset bytes
    590 *
    591 * Not all implementations will support this facility,
    592 * so may report an error.
    593 *
    594 * Returns: the new position on success, (off_t)-1 on failure
    595 */
    596off_t qio_channel_io_seek(QIOChannel *ioc,
    597                          off_t offset,
    598                          int whence,
    599                          Error **errp);
    600
    601
    602/**
    603 * qio_channel_create_watch:
    604 * @ioc: the channel object
    605 * @condition: the I/O condition to monitor
    606 *
    607 * Create a new main loop source that is used to watch
    608 * for the I/O condition @condition. Typically the
    609 * qio_channel_add_watch() method would be used instead
    610 * of this, since it directly attaches a callback to
    611 * the source
    612 *
    613 * Returns: the new main loop source.
    614 */
    615GSource *qio_channel_create_watch(QIOChannel *ioc,
    616                                  GIOCondition condition);
    617
    618/**
    619 * qio_channel_add_watch:
    620 * @ioc: the channel object
    621 * @condition: the I/O condition to monitor
    622 * @func: callback to invoke when the source becomes ready
    623 * @user_data: opaque data to pass to @func
    624 * @notify: callback to free @user_data
    625 *
    626 * Create a new main loop source that is used to watch
    627 * for the I/O condition @condition. The callback @func
    628 * will be registered against the source, to be invoked
    629 * when the source becomes ready. The optional @user_data
    630 * will be passed to @func when it is invoked. The @notify
    631 * callback will be used to free @user_data when the
    632 * watch is deleted
    633 *
    634 * The returned source ID can be used with g_source_remove()
    635 * to remove and free the source when no longer required.
    636 * Alternatively the @func callback can return a FALSE
    637 * value.
    638 *
    639 * Returns: the source ID
    640 */
    641guint qio_channel_add_watch(QIOChannel *ioc,
    642                            GIOCondition condition,
    643                            QIOChannelFunc func,
    644                            gpointer user_data,
    645                            GDestroyNotify notify);
    646
    647/**
    648 * qio_channel_add_watch_full:
    649 * @ioc: the channel object
    650 * @condition: the I/O condition to monitor
    651 * @func: callback to invoke when the source becomes ready
    652 * @user_data: opaque data to pass to @func
    653 * @notify: callback to free @user_data
    654 * @context: the context to run the watch source
    655 *
    656 * Similar as qio_channel_add_watch(), but allows to specify context
    657 * to run the watch source.
    658 *
    659 * Returns: the source ID
    660 */
    661guint qio_channel_add_watch_full(QIOChannel *ioc,
    662                                 GIOCondition condition,
    663                                 QIOChannelFunc func,
    664                                 gpointer user_data,
    665                                 GDestroyNotify notify,
    666                                 GMainContext *context);
    667
    668/**
    669 * qio_channel_add_watch_source:
    670 * @ioc: the channel object
    671 * @condition: the I/O condition to monitor
    672 * @func: callback to invoke when the source becomes ready
    673 * @user_data: opaque data to pass to @func
    674 * @notify: callback to free @user_data
    675 * @context: gcontext to bind the source to
    676 *
    677 * Similar as qio_channel_add_watch(), but allows to specify context
    678 * to run the watch source, meanwhile return the GSource object
    679 * instead of tag ID, with the GSource referenced already.
    680 *
    681 * Note: callers is responsible to unref the source when not needed.
    682 *
    683 * Returns: the source pointer
    684 */
    685GSource *qio_channel_add_watch_source(QIOChannel *ioc,
    686                                      GIOCondition condition,
    687                                      QIOChannelFunc func,
    688                                      gpointer user_data,
    689                                      GDestroyNotify notify,
    690                                      GMainContext *context);
    691
    692/**
    693 * qio_channel_attach_aio_context:
    694 * @ioc: the channel object
    695 * @ctx: the #AioContext to set the handlers on
    696 *
    697 * Request that qio_channel_yield() sets I/O handlers on
    698 * the given #AioContext.  If @ctx is %NULL, qio_channel_yield()
    699 * uses QEMU's main thread event loop.
    700 *
    701 * You can move a #QIOChannel from one #AioContext to another even if
    702 * I/O handlers are set for a coroutine.  However, #QIOChannel provides
    703 * no synchronization between the calls to qio_channel_yield() and
    704 * qio_channel_attach_aio_context().
    705 *
    706 * Therefore you should first call qio_channel_detach_aio_context()
    707 * to ensure that the coroutine is not entered concurrently.  Then,
    708 * while the coroutine has yielded, call qio_channel_attach_aio_context(),
    709 * and then aio_co_schedule() to place the coroutine on the new
    710 * #AioContext.  The calls to qio_channel_detach_aio_context()
    711 * and qio_channel_attach_aio_context() should be protected with
    712 * aio_context_acquire() and aio_context_release().
    713 */
    714void qio_channel_attach_aio_context(QIOChannel *ioc,
    715                                    AioContext *ctx);
    716
    717/**
    718 * qio_channel_detach_aio_context:
    719 * @ioc: the channel object
    720 *
    721 * Disable any I/O handlers set by qio_channel_yield().  With the
    722 * help of aio_co_schedule(), this allows moving a coroutine that was
    723 * paused by qio_channel_yield() to another context.
    724 */
    725void qio_channel_detach_aio_context(QIOChannel *ioc);
    726
    727/**
    728 * qio_channel_yield:
    729 * @ioc: the channel object
    730 * @condition: the I/O condition to wait for
    731 *
    732 * Yields execution from the current coroutine until the condition
    733 * indicated by @condition becomes available.  @condition must
    734 * be either %G_IO_IN or %G_IO_OUT; it cannot contain both.  In
    735 * addition, no two coroutine can be waiting on the same condition
    736 * and channel at the same time.
    737 *
    738 * This must only be called from coroutine context. It is safe to
    739 * reenter the coroutine externally while it is waiting; in this
    740 * case the function will return even if @condition is not yet
    741 * available.
    742 */
    743void coroutine_fn qio_channel_yield(QIOChannel *ioc,
    744                                    GIOCondition condition);
    745
    746/**
    747 * qio_channel_wait:
    748 * @ioc: the channel object
    749 * @condition: the I/O condition to wait for
    750 *
    751 * Block execution from the current thread until
    752 * the condition indicated by @condition becomes
    753 * available.
    754 *
    755 * This will enter a nested event loop to perform
    756 * the wait.
    757 */
    758void qio_channel_wait(QIOChannel *ioc,
    759                      GIOCondition condition);
    760
    761/**
    762 * qio_channel_set_aio_fd_handler:
    763 * @ioc: the channel object
    764 * @ctx: the AioContext to set the handlers on
    765 * @io_read: the read handler
    766 * @io_write: the write handler
    767 * @opaque: the opaque value passed to the handler
    768 *
    769 * This is used internally by qio_channel_yield().  It can
    770 * be used by channel implementations to forward the handlers
    771 * to another channel (e.g. from #QIOChannelTLS to the
    772 * underlying socket).
    773 */
    774void qio_channel_set_aio_fd_handler(QIOChannel *ioc,
    775                                    AioContext *ctx,
    776                                    IOHandler *io_read,
    777                                    IOHandler *io_write,
    778                                    void *opaque);
    779
    780/**
    781 * qio_channel_readv_full_all_eof:
    782 * @ioc: the channel object
    783 * @iov: the array of memory regions to read data to
    784 * @niov: the length of the @iov array
    785 * @fds: an array of file handles to read
    786 * @nfds: number of file handles in @fds
    787 * @errp: pointer to a NULL-initialized error object
    788 *
    789 *
    790 * Performs same function as qio_channel_readv_all_eof.
    791 * Additionally, attempts to read file descriptors shared
    792 * over the channel. The function will wait for all
    793 * requested data to be read, yielding from the current
    794 * coroutine if required. data refers to both file
    795 * descriptors and the iovs.
    796 *
    797 * Returns: 1 if all bytes were read, 0 if end-of-file
    798 *          occurs without data, or -1 on error
    799 */
    800
    801int qio_channel_readv_full_all_eof(QIOChannel *ioc,
    802                                   const struct iovec *iov,
    803                                   size_t niov,
    804                                   int **fds, size_t *nfds,
    805                                   Error **errp);
    806
    807/**
    808 * qio_channel_readv_full_all:
    809 * @ioc: the channel object
    810 * @iov: the array of memory regions to read data to
    811 * @niov: the length of the @iov array
    812 * @fds: an array of file handles to read
    813 * @nfds: number of file handles in @fds
    814 * @errp: pointer to a NULL-initialized error object
    815 *
    816 *
    817 * Performs same function as qio_channel_readv_all_eof.
    818 * Additionally, attempts to read file descriptors shared
    819 * over the channel. The function will wait for all
    820 * requested data to be read, yielding from the current
    821 * coroutine if required. data refers to both file
    822 * descriptors and the iovs.
    823 *
    824 * Returns: 0 if all bytes were read, or -1 on error
    825 */
    826
    827int qio_channel_readv_full_all(QIOChannel *ioc,
    828                               const struct iovec *iov,
    829                               size_t niov,
    830                               int **fds, size_t *nfds,
    831                               Error **errp);
    832
    833/**
    834 * qio_channel_writev_full_all:
    835 * @ioc: the channel object
    836 * @iov: the array of memory regions to write data from
    837 * @niov: the length of the @iov array
    838 * @fds: an array of file handles to send
    839 * @nfds: number of file handles in @fds
    840 * @errp: pointer to a NULL-initialized error object
    841 *
    842 *
    843 * Behaves like qio_channel_writev_full but will attempt
    844 * to send all data passed (file handles and memory regions).
    845 * The function will wait for all requested data
    846 * to be written, yielding from the current coroutine
    847 * if required.
    848 *
    849 * Returns: 0 if all bytes were written, or -1 on error
    850 */
    851
    852int qio_channel_writev_full_all(QIOChannel *ioc,
    853                                const struct iovec *iov,
    854                                size_t niov,
    855                                int *fds, size_t nfds,
    856                                Error **errp);
    857
    858#endif /* QIO_CHANNEL_H */