aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/lib/iomgr/udp_server.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/lib/iomgr/udp_server.h')
-rw-r--r--src/core/lib/iomgr/udp_server.h62
1 files changed, 42 insertions, 20 deletions
diff --git a/src/core/lib/iomgr/udp_server.h b/src/core/lib/iomgr/udp_server.h
index 1be4d04dbb..4e384d2cdf 100644
--- a/src/core/lib/iomgr/udp_server.h
+++ b/src/core/lib/iomgr/udp_server.h
@@ -21,6 +21,7 @@
#include <grpc/support/port_platform.h>
+#include "src/core/lib/gprpp/abstract.h"
#include "src/core/lib/iomgr/endpoint.h"
#include "src/core/lib/iomgr/ev_posix.h"
#include "src/core/lib/iomgr/resolve_address.h"
@@ -32,22 +33,46 @@ struct grpc_server;
/* Forward decl of grpc_udp_server */
typedef struct grpc_udp_server grpc_udp_server;
-/* Called when grpc server starts to listening on the grpc_fd. */
-typedef void (*grpc_udp_server_start_cb)(grpc_fd* emfd, void* user_data);
-
-/* Called when data is available to read from the socket.
- * Return true if there is more data to read from fd. */
-typedef bool (*grpc_udp_server_read_cb)(grpc_fd* emfd);
-
-/* Called when the socket is writeable. The given closure should be scheduled
- * when the socket becomes blocked next time. */
-typedef void (*grpc_udp_server_write_cb)(grpc_fd* emfd, void* user_data,
- grpc_closure* notify_on_write_closure);
-
-/* Called when the grpc_fd is about to be orphaned (and the FD closed). */
-typedef void (*grpc_udp_server_orphan_cb)(grpc_fd* emfd,
- grpc_closure* shutdown_fd_callback,
- void* user_data);
+/* An interface associated with a socket. udp server delivers I/O event on that
+ * socket to the subclass of this interface which is created through
+ * GrpcUdpHandlerFactory.
+ * Its implementation should do the real IO work, e.g. read packet and write. */
+class GrpcUdpHandler {
+ public:
+ GrpcUdpHandler(grpc_fd* emfd, void* user_data) {}
+ virtual ~GrpcUdpHandler() {}
+
+ // Interfaces to be implemented by subclasses to do the actual setup/tear down
+ // or I/O.
+
+ // Called when data is available to read from the socket. Returns true if
+ // there is more data to read after this call.
+ virtual bool Read() GRPC_ABSTRACT;
+ // Called when socket becomes write unblocked. The given closure should be
+ // scheduled when the socket becomes blocked next time.
+ virtual void OnCanWrite(void* user_data,
+ grpc_closure* notify_on_write_closure) GRPC_ABSTRACT;
+ // Called before the gRPC FD is orphaned. Notify udp server to continue
+ // orphaning fd by scheduling the given closure, afterwards the associated fd
+ // will be closed.
+ virtual void OnFdAboutToOrphan(grpc_closure* orphan_fd_closure,
+ void* user_data) GRPC_ABSTRACT;
+
+ GRPC_ABSTRACT_BASE_CLASS
+};
+
+class GrpcUdpHandlerFactory {
+ public:
+ virtual ~GrpcUdpHandlerFactory() {}
+ /* Called when start to listen on a socket.
+ * Return an instance of the implementation of GrpcUdpHandler interface which
+ * will process I/O events for this socket from now on. */
+ virtual GrpcUdpHandler* CreateUdpHandler(grpc_fd* emfd,
+ void* user_data) GRPC_ABSTRACT;
+ virtual void DestroyUdpHandler(GrpcUdpHandler* handler) GRPC_ABSTRACT;
+
+ GRPC_ABSTRACT_BASE_CLASS
+};
/* Create a server, initially not bound to any ports */
grpc_udp_server* grpc_udp_server_create(const grpc_channel_args* args);
@@ -71,10 +96,7 @@ int grpc_udp_server_get_fd(grpc_udp_server* s, unsigned port_index);
int grpc_udp_server_add_port(grpc_udp_server* s,
const grpc_resolved_address* addr,
int rcv_buf_size, int snd_buf_size,
- grpc_udp_server_start_cb start_cb,
- grpc_udp_server_read_cb read_cb,
- grpc_udp_server_write_cb write_cb,
- grpc_udp_server_orphan_cb orphan_cb);
+ GrpcUdpHandlerFactory* handler_factory);
void grpc_udp_server_destroy(grpc_udp_server* server, grpc_closure* on_done);