mirror of https://github.com/yandex/odyssey.git
280 lines
7.1 KiB
C
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 */
|