Beispiel #1
0
char *
ccnetrpc_transport_send (void *arg, const gchar *fcall_str,
                         size_t fcall_len, size_t *ret_len)
{
    CcnetrpcTransportParam *priv;
    CcnetClient *session, *new_session;

    g_warn_if_fail (arg != NULL && fcall_str != NULL);

    priv = (CcnetrpcTransportParam *)arg;

    if (priv->session != NULL) {
        /* Use single ccnet client as transport. */
        return invoke_service (priv->session, priv->peer_id, priv->service,
                               fcall_str, fcall_len, ret_len);
    } else {
        /* Use client pool as transport. */

        session = ccnet_client_pool_get_client (priv->pool);
        if (!session) {
            g_warning ("[Sea RPC] Failed to get client from pool.\n");
            *ret_len = 0;
            return NULL;
        }

        char *ret = invoke_service (session, priv->peer_id, priv->service,
                                    fcall_str, fcall_len, ret_len);
        if (ret != NULL) {
            ccnet_client_pool_return_client (priv->pool, session);
            return ret;
        }

        /* If we failed to send data through the ccnet client returned by
         * client pool, ccnet may have been restarted.
         * In this case, we create a new ccnet client and put it into
         * the client pool after use.
         */

        g_message ("[Sea RPC] Ccnet disconnected. Connect again.\n");

        new_session = create_new_client (session->config_dir);
        if (!new_session) {
            *ret_len = 0;
            return NULL;
        }
        g_object_unref (session);

        ret = invoke_service (new_session, priv->peer_id, priv->service,
                              fcall_str, fcall_len, ret_len);
        if (ret != NULL)
            ccnet_client_pool_return_client (priv->pool, new_session);
        else
            g_object_unref (new_session);

        return ret;
    }
}
sgx_status_t invoke_service_ocall(
    const uint8_t* pse_message_req, uint32_t pse_message_req_size,
    uint8_t* pse_message_resp, uint32_t pse_message_resp_size,
    uint32_t timeout
    )
{
    return invoke_service(pse_message_req, pse_message_req_size,
                          pse_message_resp, pse_message_resp_size, timeout);
}