aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ic/c_src/ic_tmo.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ic/c_src/ic_tmo.c')
-rw-r--r--lib/ic/c_src/ic_tmo.c135
1 files changed, 135 insertions, 0 deletions
diff --git a/lib/ic/c_src/ic_tmo.c b/lib/ic/c_src/ic_tmo.c
new file mode 100644
index 0000000000..78698a6a89
--- /dev/null
+++ b/lib/ic/c_src/ic_tmo.c
@@ -0,0 +1,135 @@
+/*
+ * %CopyrightBegin%
+ *
+ * Copyright Ericsson AB 2004-2009. All Rights Reserved.
+ *
+ * The contents of this file are subject to the Erlang Public License,
+ * Version 1.1, (the "License"); you may not use this file except in
+ * compliance with the License. You should have received a copy of the
+ * Erlang Public License along with this software. If not, it can be
+ * retrieved online at http://www.erlang.org/.
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ * the License for the specific language governing rights and limitations
+ * under the License.
+ *
+ * %CopyrightEnd%
+ *
+ */
+#include <ic.h>
+
+static int oe_send_tmo(CORBA_Environment *env, unsigned int ms);
+
+/* Client send message (Erlang distribution protocol) */
+static int oe_send_tmo(CORBA_Environment *env, unsigned int ms)
+{
+ if (strlen(env->_regname) == 0) {
+ if (ei_send_encoded_tmo(env->_fd, env->_to_pid, env->_outbuf,
+ env->_iout, ms) < 0) {
+ /* XXX Cannot send to peer? */
+ CORBA_exc_set(env, CORBA_SYSTEM_EXCEPTION, NO_RESPONSE,
+ "Cannot connect to server");
+ return -1;
+ }
+ } else {
+ if (ei_send_reg_encoded_tmo(env->_fd, env->_from_pid,
+ env->_regname, env->_outbuf,
+ env->_iout, ms) < 0) {
+ /* XXX Cannot send to peer? */
+ CORBA_exc_set(env, CORBA_SYSTEM_EXCEPTION, NO_RESPONSE,
+ "Cannot connect to server");
+ return -1;
+ }
+ }
+ return 0;
+}
+
+/* Send notification (gen_server client) */
+int oe_send_notification_tmo(CORBA_Environment *env, unsigned int send_ms)
+{
+ return oe_send_tmo(env, send_ms);
+}
+
+/* Send request and receive reply (gen_server client) */
+int oe_send_request_and_receive_reply_tmo(CORBA_Environment *env,
+ unsigned int send_ms,
+ unsigned int recv_ms)
+{
+ int msgType = 0;
+ erlang_msg msg;
+
+ if (oe_send_tmo(env, send_ms) < 0)
+ return -1;
+
+ do {
+ if ((msgType = ei_receive_encoded_tmo(env->_fd,
+ &env->_inbuf,
+ &env->_inbufsz,
+ &msg, &env->_iin,
+ recv_ms)) < 0) {
+ CORBA_exc_set(env, CORBA_SYSTEM_EXCEPTION, MARSHAL,
+ "Cannot decode message");
+ return -1;
+ }
+ } while (msgType != ERL_SEND && msgType != ERL_REG_SEND);
+
+ /* Extracting return message header */
+ if (oe_prepare_reply_decoding(env) < 0) {
+ CORBA_exc_set(env, CORBA_SYSTEM_EXCEPTION, MARSHAL, "Bad message");
+ return -1;
+ }
+ return 0;
+}
+
+/* Server receive (possibly) send reply (gen_server server) */
+
+int oe_server_receive_tmo(CORBA_Environment *env, oe_map_t *map,
+ unsigned int send_ms,
+ unsigned int recv_ms)
+{
+ int res = 0, loop = 1;
+ erlang_msg msg;
+
+ while (res >= 0 && loop > 0) {
+ res = ei_receive_encoded_tmo(env->_fd, &env->_inbuf, &env->_inbufsz,
+ &msg, &env->_iin, recv_ms);
+ switch(res) {
+ case ERL_SEND:
+ case ERL_REG_SEND:
+ oe_exec_switch(NULL, env, map);
+ switch(env->_major) {
+ case CORBA_NO_EXCEPTION:
+ break;
+ case CORBA_SYSTEM_EXCEPTION:
+ /* XXX stderr */
+ fprintf(stderr, "Request failure, reason : %s\n",
+ (char *) CORBA_exception_value(env));
+ CORBA_exception_free(env);
+ break;
+ default: /* Should not happen */
+ CORBA_exception_free(env);
+ break;
+ }
+ /* send reply */
+ /* XXX We are required to set env->_iout = 0 if oneway?? */
+ if (env->_iout > 0)
+ ei_send_encoded_tmo(env->_fd, &env->_caller, env->_outbuf,
+ env->_iout, send_ms);
+ loop = 0;
+ break;
+ case ERL_TICK:
+ break;
+ default:
+ /* XXX */
+ if (res < 0) {
+ fprintf(stderr, "Result negative: %d\n", res);
+ loop = 0;
+ }
+ break;
+ }
+ }
+
+ return 0;
+}
+