#pragma once

#include "android/utils/compiler.h"

#include <stdint.h>

ANDROID_BEGIN_HEADER

/* An IOLooper is an abstraction for select() */

typedef struct IoLooper  IoLooper;

IoLooper*  iolooper_new(void);
void       iolooper_free( IoLooper*  iol );
void       iolooper_reset( IoLooper*  iol );

void       iolooper_add_read( IoLooper*  iol, int  fd );
void       iolooper_add_write( IoLooper*  iol, int  fd );
void       iolooper_del_read( IoLooper*  iol, int  fd );
void       iolooper_del_write( IoLooper*  iol, int  fd );

enum {
    IOLOOPER_READ = (1<<0),
    IOLOOPER_WRITE = (1<<1),
};
void       iolooper_modify( IoLooper*  iol, int fd, int oldflags, int newflags);

int        iolooper_poll( IoLooper*  iol );
/* Wrapper around select()
 * Return:
 *  > 0 in case an I/O has occurred, or < 0 on error, or 0 on timeout with
 *  errno set to ETIMEDOUT.
 */
int        iolooper_wait( IoLooper*  iol, int64_t  duration );

int        iolooper_is_read( IoLooper*  iol, int  fd );
int        iolooper_is_write( IoLooper*  iol, int  fd );
/* Returns 1 if this IoLooper has one or more file descriptor to interact with */
int        iolooper_has_operations( IoLooper*  iol );
/* Gets current time in milliseconds.
 * Return:
 *  Number of milliseconds corresponded to the current time on success, or -1
 *  on failure.
 */
int64_t    iolooper_now(void);
/* Waits for an I/O to occur before specific absolute time.
 * This routine should be used (instead of iolooper_wait) in cases when multiple
 * sequential I/O should be completed within given time interval. For instance,
 * consider the scenario, when "server" does two sequential writes, and "client"
 * now has to read data transferred with these two distinct writes. It might be
 * wasteful to do two reads, each with the same (large) timeout. Instead, it
 * would be better to assign a deadline for both reads before the first read,
 * and call iolooper_wait_absoulte with the same deadline value:
 *  int64_t deadline = iolooper_now() + TIMEOUT;
 *  if (iolooper_wait_absoulte(iol, deadline)) {
 *      // Process first buffer.
 *      (iolooper_wait_absoulte(iol, deadline)) {
 *          // Process second read
 *      }
 *  }
 * Param:
 *  iol IoLooper instance for an I/O.
 *  deadline Deadline (absoulte time in milliseconds) before which an I/O should
 *      occur.
 * Return:
 *  Number of I/O descriptors set in iol, if an I/O has occurred, 0 if no I/O
 *  occurred before the deadline, or -1 on error.
 */
int iolooper_wait_absolute(IoLooper* iol, int64_t deadline);

ANDROID_END_HEADER
