odyssey/third_party/machinarium/sources/machinarium.h

280 lines
7.1 KiB
C

#ifndef MACHINARIUM_H
#define MACHINARIUM_H
/*
* machinarium.
*
* cooperative multitasking engine.
*/
#ifdef __cplusplus
extern "C" {
#endif
#include "c.h"
#include "zpq_stream.h"
#include "bind.h"
#include "macro.h"
#include "channel_limit.h"
#if __GNUC__ >= 4
#define MACHINE_API __attribute__((visibility("default")))
#else
#define MACHINE_API
#endif
typedef void (*machine_coroutine_t)(void *arg);
#define mm_yield machine_sleep(0);
/* library handles */
typedef struct machine_cond_private machine_cond_t;
typedef struct machine_msg_private machine_msg_t;
typedef struct machine_channel_private machine_channel_t;
typedef struct machine_tls_private machine_tls_t;
typedef struct machine_iov_private machine_iov_t;
typedef struct machine_io_private machine_io_t;
/* configuration */
MACHINE_API void machinarium_set_stack_size(int size);
MACHINE_API void machinarium_set_pool_size(int size);
MACHINE_API void machinarium_set_coroutine_cache_size(int size);
MACHINE_API void machinarium_set_msg_cache_gc_size(int size);
/* main */
MACHINE_API int machinarium_init(void);
MACHINE_API void machinarium_free(void);
/* machine control */
MACHINE_API int64_t machine_create(char *name, machine_coroutine_t, void *arg);
MACHINE_API void machine_stop_current(void);
MACHINE_API int machine_active(void);
MACHINE_API uint64_t machine_self(void);
MACHINE_API void **machine_thread_private(void);
MACHINE_API int machine_wait(uint64_t machine_id);
MACHINE_API int machine_stop(uint64_t machine_id);
/* time */
MACHINE_API uint64_t machine_time_ms(void);
MACHINE_API uint64_t machine_time_us(void);
MACHINE_API uint32_t machine_timeofday_sec(void);
MACHINE_API void
machine_stat(uint64_t *coroutine_count, uint64_t *coroutine_cache_count,
uint64_t *msg_allocated, uint64_t *msg_cache_count,
uint64_t *msg_cache_gc_count, uint64_t *msg_cache_size);
/* signals */
MACHINE_API int machine_signal_init(sigset_t *, sigset_t *);
MACHINE_API int machine_signal_wait(uint32_t time_ms);
/* coroutine */
MACHINE_API int64_t machine_coroutine_create(machine_coroutine_t, void *arg);
MACHINE_API void machine_sleep(uint32_t time_ms);
MACHINE_API int machine_join(uint64_t coroutine_id);
MACHINE_API int machine_cancel(uint64_t coroutine_id);
MACHINE_API int machine_cancelled(void);
MACHINE_API int machine_timedout(void);
MACHINE_API int machine_errno(void);
/* condition */
MACHINE_API machine_cond_t *machine_cond_create(void);
MACHINE_API void machine_cond_free(machine_cond_t *);
MACHINE_API void machine_cond_propagate(machine_cond_t *, machine_cond_t *);
MACHINE_API void machine_cond_signal(machine_cond_t *);
MACHINE_API int machine_cond_try(machine_cond_t *);
MACHINE_API int machine_cond_wait(machine_cond_t *, uint32_t time_ms);
/* msg */
MACHINE_API machine_msg_t *machine_msg_create(int reserve);
MACHINE_API machine_msg_t *machine_msg_create_or_advance(machine_msg_t *,
int size);
MACHINE_API void machine_msg_free(machine_msg_t *);
MACHINE_API void machine_msg_set_type(machine_msg_t *, int type);
MACHINE_API int machine_msg_type(machine_msg_t *);
MACHINE_API void *machine_msg_data(machine_msg_t *);
MACHINE_API int machine_msg_size(machine_msg_t *);
MACHINE_API int machine_msg_write(machine_msg_t *, void *buf, int size);
/* channel */
MACHINE_API machine_channel_t *machine_channel_create();
MACHINE_API void machine_channel_free(machine_channel_t *);
MACHINE_API void
machine_channel_assign_limit_policy(machine_channel_t *obj, int limit,
mm_channel_limit_policy_t policy);
MACHINE_API mm_retcode_t machine_channel_write(machine_channel_t *,
machine_msg_t *);
MACHINE_API machine_msg_t *machine_channel_read(machine_channel_t *,
uint32_t time_ms);
/* tls */
MACHINE_API machine_tls_t *machine_tls_create(void);
MACHINE_API void machine_tls_free(machine_tls_t *);
MACHINE_API int machine_tls_set_verify(machine_tls_t *, char *);
MACHINE_API int machine_tls_set_server(machine_tls_t *, char *);
MACHINE_API int machine_tls_set_protocols(machine_tls_t *, char *);
MACHINE_API int machine_tls_set_ca_path(machine_tls_t *, char *);
MACHINE_API int machine_tls_set_ca_file(machine_tls_t *, char *);
MACHINE_API int machine_tls_set_cert_file(machine_tls_t *, char *);
MACHINE_API int machine_tls_set_key_file(machine_tls_t *, char *);
/* io control */
MACHINE_API machine_io_t *machine_io_create(void);
MACHINE_API void machine_io_free(machine_io_t *);
MACHINE_API int machine_io_attach(machine_io_t *);
MACHINE_API int machine_io_detach(machine_io_t *);
MACHINE_API char *machine_error(machine_io_t *);
MACHINE_API int machine_fd(machine_io_t *);
MACHINE_API int machine_set_nodelay(machine_io_t *, int enable);
MACHINE_API int machine_set_keepalive(machine_io_t *, int enable, int delay,
int interval, int probes,
int usr_timeout);
MACHINE_API int machine_set_tls(machine_io_t *, machine_tls_t *, uint32_t);
MACHINE_API int machine_set_compression(machine_io_t *, char algorithm);
MACHINE_API int machine_io_verify(machine_io_t *, char *common_name);
/* dns */
MACHINE_API int machine_getsockname(machine_io_t *, struct sockaddr *, int *);
MACHINE_API int machine_getpeername(machine_io_t *, struct sockaddr *, int *);
MACHINE_API int machine_getaddrinfo(char *addr, char *service,
struct addrinfo *hints,
struct addrinfo **res, uint32_t time_ms);
/* io */
MACHINE_API int machine_connect(machine_io_t *, struct sockaddr *,
uint32_t time_ms);
MACHINE_API int machine_connected(machine_io_t *);
MACHINE_API int machine_bind(machine_io_t *, struct sockaddr *, int);
MACHINE_API int machine_accept(machine_io_t *, machine_io_t **, int backlog,
int attach, uint32_t time_ms);
MACHINE_API int machine_eventfd(machine_io_t *);
MACHINE_API int machine_close(machine_io_t *);
MACHINE_API int machine_shutdown(machine_io_t *);
MACHINE_API int machine_shutdown_receptions(machine_io_t *);
/* iov */
MACHINE_API machine_iov_t *machine_iov_create(void);
MACHINE_API void machine_iov_free(machine_iov_t *);
MACHINE_API int machine_iov_add_pointer(machine_iov_t *, void *, int);
MACHINE_API int machine_iov_add(machine_iov_t *, machine_msg_t *);
MACHINE_API int machine_iov_pending(machine_iov_t *);
/* read */
MACHINE_API int machine_read_active(machine_io_t *);
MACHINE_API int machine_read_start(machine_io_t *, machine_cond_t *);
MACHINE_API int machine_read_stop(machine_io_t *);
MACHINE_API ssize_t machine_read_raw(machine_io_t *, void *, size_t);
MACHINE_API machine_msg_t *machine_read(machine_io_t *, size_t,
uint32_t time_ms);
/* write */
MACHINE_API int machine_write_start(machine_io_t *, machine_cond_t *);
MACHINE_API int machine_write_stop(machine_io_t *);
MACHINE_API ssize_t machine_write_raw(machine_io_t *, void *, size_t, size_t *);
MACHINE_API ssize_t machine_writev_raw(machine_io_t *, machine_iov_t *);
MACHINE_API int machine_write(machine_io_t *, machine_msg_t *,
uint32_t time_ms);
/* lrand48 */
MACHINE_API long int machine_lrand48(void);
/* compression */
MACHINE_API char
machine_compression_choose_alg(char *client_compression_algorithms);
#ifdef __cplusplus
}
#endif
#endif /* MACHINARIUM_H */