diff options
Diffstat (limited to 'lib/ic/c_src/ic_tmo.c')
-rw-r--r-- | lib/ic/c_src/ic_tmo.c | 135 |
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; +} + |