summaryrefslogtreecommitdiff
path: root/erts/emulator/nifs/common/prim_socket_int.h
diff options
context:
space:
mode:
authorMicael Karlberg <bmk@erlang.org>2022-12-22 16:56:03 +0100
committerMicael Karlberg <bmk@erlang.org>2022-12-22 16:56:03 +0100
commit024dd020d1970565931af6eddebab7c59f13eda3 (patch)
tree1de99ed2264fddec159e7d30d252811ce89d8161 /erts/emulator/nifs/common/prim_socket_int.h
parent949baa2afb23d3a3b1c45b24ebb4b51071b50c23 (diff)
downloaderlang-024dd020d1970565931af6eddebab7c59f13eda3.tar.gz
[erts|esock] Moved the accept function to unix file
Moved the content of the function esock_accept to the unix essio file (essio_accept). OTP-18029
Diffstat (limited to 'erts/emulator/nifs/common/prim_socket_int.h')
-rw-r--r--erts/emulator/nifs/common/prim_socket_int.h102
1 files changed, 100 insertions, 2 deletions
diff --git a/erts/emulator/nifs/common/prim_socket_int.h b/erts/emulator/nifs/common/prim_socket_int.h
index 2c7c58759e..c15dfbe190 100644
--- a/erts/emulator/nifs/common/prim_socket_int.h
+++ b/erts/emulator/nifs/common/prim_socket_int.h
@@ -108,6 +108,17 @@ typedef int SOCKET; /* A subset of HANDLE */
#endif
+/* ********************************************************************* *
+ * Misc *
+ * ********************************************************************* *
+ */
+
+#define ESOCK_GET_RESOURCE(ENV, REF, RES) \
+ enif_get_resource((ENV), (REF), esocks, (RES))
+
+#define ESOCK_MON2TERM(E, M) \
+ esock_make_monitor_term((E), (M))
+
/* ********************************************************************* *
* Counter type and related "things" *
@@ -160,6 +171,14 @@ typedef Uint64 ESockCounter;
#endif
+#define ESOCK_CNT_INC( __E__, __D__, SF, ACNT, CNT, INC) \
+ do { \
+ if (esock_cnt_inc((CNT), (INC))) { \
+ esock_send_wrap_msg((__E__), (__D__), (SF), (ACNT)); \
+ } \
+ } while (0)
+
+
/* ********************************************************************* *
* (Socket) Debug macros *
@@ -435,6 +454,14 @@ typedef struct {
/* ======================================================================== *
+ * What to do about this? *
+ * ======================================================================== *
+ */
+
+extern char* erl_errno_id(int error); /* THIS IS JUST TEMPORARY??? */
+
+
+/* ======================================================================== *
* Functions *
* ======================================================================== *
*/
@@ -454,6 +481,19 @@ extern void esock_send_reg_del_msg(ErlNifEnv* env,
ESockDescriptor* descP,
ERL_NIF_TERM sockRef);
+/* *** Message sending functions *** */
+extern void esock_send_abort_msg(ErlNifEnv* env,
+ ESockDescriptor* descP,
+ ERL_NIF_TERM sockRef,
+ ESockRequestor* reqP,
+ ERL_NIF_TERM reason);
+extern void esock_send_close_msg(ErlNifEnv* env,
+ ESockDescriptor* descP,
+ ErlNifPid* pid);
+extern void esock_send_wrap_msg(ErlNifEnv* env,
+ ESockDescriptor* descP,
+ ERL_NIF_TERM sockRef,
+ ERL_NIF_TERM cnt);
/* ** Monitor functions *** */
extern int esock_monitor(const char* slogan,
@@ -472,8 +512,10 @@ extern BOOLEAN_T esock_monitor_eq(const ESockMonitor* monP,
const ErlNifMonitor* mon);
/* *** Counter functions *** */
-extern void esock_inc_socket(int domain, int type, int protocol);
-extern void esock_dec_socket(int domain, int type, int protocol);
+extern BOOLEAN_T esock_cnt_inc(ESockCounter* cnt, ESockCounter inc);
+extern void esock_cnt_dec(ESockCounter* cnt, ESockCounter dec);
+extern void esock_inc_socket(int domain, int type, int protocol);
+extern void esock_dec_socket(int domain, int type, int protocol);
/* *** Select functions *** */
extern int esock_select_read(ErlNifEnv* env,
@@ -506,10 +548,66 @@ extern void esock_requestor_release(const char* slogan,
ESockDescriptor* descP,
ESockRequestor* reqP);
+/* *** esock_activate_next_acceptor ***
+ * *** esock_activate_next_writer ***
+ * *** esock_activate_next_reader ***
+ *
+ * All the activate-next functions for acceptor, writer and reader
+ * have exactly the same API, so we apply some macro magic to simplify.
+ * They simply operates on dufferent data structures.
+ *
+ */
+
+#define ACTIVATE_NEXT_FUNCS_DEFS \
+ ACTIVATE_NEXT_FUNC_DEF(acceptor) \
+ ACTIVATE_NEXT_FUNC_DEF(writer) \
+ ACTIVATE_NEXT_FUNC_DEF(reader)
+
+#define ACTIVATE_NEXT_FUNC_DEF(F) \
+ extern BOOLEAN_T esock_activate_next_##F(ErlNifEnv* env, \
+ ESockDescriptor* descP, \
+ ERL_NIF_TERM sockRef);
+ACTIVATE_NEXT_FUNCS_DEFS
+#undef ACTIVATE_NEXT_FUNC_DEF
+
+/* esock_acceptor_search4pid | esock_writer_search4pid | esock_reader_search4pid
+ * esock_acceptor_push | esock_writer_push | esock_reader_push
+ * esock_acceptor_pop | esock_writer_pop | esock_reader_pop
+ * esock_acceptor_unqueue | esock_writer_unqueue | esock_reader_unqueue
+ *
+ * All the queue operator functions (search4pid, push, pop
+ * and unqueue) for acceptor, writer and reader has exactly
+ * the same API, so we apply some macro magic to simplify.
+ */
+
+#define ESOCK_OPERATOR_FUNCS_DEFS \
+ ESOCK_OPERATOR_FUNCS_DEF(acceptor) \
+ ESOCK_OPERATOR_FUNCS_DEF(writer) \
+ ESOCK_OPERATOR_FUNCS_DEF(reader)
+
+#define ESOCK_OPERATOR_FUNCS_DEF(O) \
+ extern BOOLEAN_T esock_##O##_search4pid(ErlNifEnv* env, \
+ ESockDescriptor* descP, \
+ ErlNifPid* pid); \
+ extern void esock_##O##_push(ErlNifEnv* env, \
+ ESockDescriptor* descP, \
+ ErlNifPid pid, \
+ ERL_NIF_TERM ref); \
+ extern BOOLEAN_T esock_##O##_pop(ErlNifEnv* env, \
+ ESockDescriptor* descP, \
+ ESockRequestor* reqP); \
+ extern BOOLEAN_T esock_##O##_unqueue(ErlNifEnv* env, \
+ ESockDescriptor* descP, \
+ ERL_NIF_TERM* refP, \
+ const ErlNifPid* pidP);
+ESOCK_OPERATOR_FUNCS_DEFS
+#undef ESOCK_OPERATOR_FUNCS_DEF
+
/* *** Environment wrapper functions ***
* These hould really be inline, but for now...
*/
extern void esock_free_env(const char* slogan, ErlNifEnv* env);
extern ErlNifEnv* esock_alloc_env(const char* slogan);
+
#endif // PRIM_SOCKET_INT_H__