/** * Copyright (C) Mellanox Technologies Ltd. 2018. ALL RIGHTS RESERVED. * * See file LICENSE for terms. */ #ifndef SA_BASE_H_ #define SA_BASE_H_ #include "sa_util.h" #include #include #include #include #include /* interface for classes which generate events */ class event_source { public: virtual void add_to_evpoll(evpoll_set& evpoll) = 0; }; /* one data connection */ class connection : public event_source { public: virtual ~connection(); virtual size_t send(const char *buffer, size_t size) = 0; virtual size_t recv(char *buffer, size_t size) = 0; virtual bool is_closed() const = 0; uint64_t id() const; protected: void set_id(uint64_t id); private: uint64_t m_id; }; typedef std::shared_ptr conn_ptr_t; /* communication context */ class worker : public event_source { public: typedef std::function conn_handler_t; typedef std::function data_handler_t; virtual ~worker(); virtual conn_ptr_t connect(const struct sockaddr *addr, socklen_t addrlen) = 0; virtual void wait(const evpoll_set& evpoll, conn_handler_t conn_handler, data_handler_t data_handler, int timeout_ms) = 0; /* factory function to create workers of given type */ static std::shared_ptr make(const std::string& mode, const struct sockaddr *listen_addr, socklen_t addrlen); }; #endif