15539{
15541
15542 bool debug =
false;
15543
15544
15546
15547
15548 if (convert_flags) {
15551 }
15552
15553
15554
15555
15556
15557
15559 sock = 0;
15560
15562
15563 assert(xroutine_id == routine_id);
15564
15565#if 0
15568
15571
15574
15577#endif
15578
15579
15580
15581 char* in_param_ptr = (
char*)nc_in->
param;
15582
15584 printf(
"rpc_execute_cxx: routine_id %d, name \"%s\"\n", routine_id, rl.
name);
15585
15587
15590
15591 std::vector<RPE> params;
15592
15593 int nparams = 0;
15595 nparams++;
15596 }
15597
15598 params.resize(nparams);
15599
15600 size_t in_offset = 0;
15601
15602 for (
int i = 0;
i < nparams;
i++) {
15603 in_param_size[
i] = 0;
15604 in_param_offset[
i] = 0;
15605
15608
15611
15613 arg_size = 1 + strlen((char *) (in_param_ptr));
15614 }
15615
15617
15618 int arg_size_align8 = *((
INT *) in_param_ptr);
15619 if (convert_flags)
15624
15625 arg_size = arg_size_align8;
15626 } else {
15627
15628 arg_size = *((
INT *) (((
char*)in_param_ptr) +
ALIGN8(arg_size_align8)));
15629 if (convert_flags)
15631 }
15632
15633
15635 cm_msg(
MERROR,
"rpc_execute_cxx",
"RPC %d, param %d tid %d flags 0x%x size mismatch: header %d vs next param %d", routine_id,
i, tid, flags, arg_size_align8, arg_size);
15637 }
15638 }
15639
15642 }
15643
15644 int param_size =
ALIGN8(arg_size);
15645
15646 in_param_size[
i] = param_size;
15647 in_param_offset[
i] = in_offset;
15648
15649 params[
i].offset = in_offset;
15650 params[
i].arg_size = arg_size;
15651 params[
i].param_size = param_size;
15652
15653
15654 if (convert_flags) {
15657 } else {
15659 }
15660 }
15661
15662 in_param_ptr += param_size;
15663 in_offset += param_size;
15664 }
15665
15668
15670 params[
i].out_max_size = 0;
15672
15673
15674
15675
15676
15677 params[
i].out_max_size_offset = in_offset;
15678
15679 INT max_size = *((
INT *) in_param_ptr);
15680
15681 if (convert_flags)
15683
15684 params[
i].out_max_size = max_size;
15685 }
15686
15688 params[
i].out_max_size = rl.
param[
i].
n;
15689 }
15690 }
15691
15694 params[
i].ps =
new std::string;
15696 *(params[
i].ps) = (
char*)nc_in->
param + in_param_offset[
i];
15697
15698 }
15699 prpc_param[
i] = (
void*) params[
i].ps;
15701 params[
i].pv =
new std::vector<char>;
15703 params[
i].pv->insert(params[
i].pv->end(), (
char*)nc_in->
param + in_param_offset[
i], (
char*)nc_in->
param + in_param_offset[
i] + params[
i].arg_size);
15704
15705 }
15706 prpc_param[
i] = (
void*) params[
i].pv;
15707 } else {
15708 cm_msg(
MERROR,
"rpc_execute_cxx",
"RPC %d: param %d tid %d flags 0x%x, TID not compatible with flag RPC_CXX", routine_id,
i, tid, flags);
15710 }
15711 } else {
15713 params[
i].pv =
new std::vector<char>;
15714 params[
i].pv->insert(params[
i].pv->end(), (
char*)nc_in->
param + in_param_offset[
i], (
char*)nc_in->
param + in_param_offset[
i] + params[
i].arg_size);
15715 size_t want_size = params[
i].out_max_size;
15716
15717 if (params[
i].pv->size() < want_size)
15718 params[
i].pv->resize(want_size);
15719 prpc_param[
i] = params[
i].pv->data();
15720 }
else if (flags &
RPC_IN) {
15721 prpc_param[
i] = (
char*)nc_in->
param + in_param_offset[
i];
15722
15723 }
else if (flags &
RPC_OUT) {
15724 params[
i].pv =
new std::vector<char>;
15725 params[
i].pv->resize(params[
i].out_max_size);
15726 prpc_param[
i] = params[
i].pv->data();
15727
15728 }
15729 }
15730
15732 printf(
"rpc_execute_cxx: param %2d, tid %2d, flags 0x%04x, in %3zu+%-3zu+%-3zu, out max size %3zu at %3zu, ptr %p\n",
i, tid, flags, params[
i].
offset, params[
i].arg_size, params[
i].param_size, params[
i].out_max_size, params[
i].out_max_size_offset, prpc_param[
i]);
15733 }
15734
15736 printf(
"rpc_execute_cxx: nc_in size %d, in_offset %zu\n", nc_in->
header.
param_size, in_offset);
15737
15739 bool ok = true;
15740
15741 ok &= in_param_offset[ 0] == 0; ok &= in_param_size[ 0] == 8;
15742 ok &= in_param_offset[ 1] == 0; ok &= in_param_size[ 1] == 0;
15743 ok &= in_param_offset[ 2] == 8; ok &= in_param_size[ 2] == 8;
15744 ok &= in_param_offset[ 3] == 16; ok &= in_param_size[ 3] == 16;
15745 ok &= in_param_offset[ 4] == 0; ok &= in_param_size[ 4] == 0;
15746 ok &= in_param_offset[ 5] == 32; ok &= in_param_size[ 5] == 8;
15747 ok &= in_param_offset[ 6] == 0; ok &= in_param_size[ 6] == 0;
15748 ok &= in_param_offset[ 7] == 40; ok &= in_param_size[ 7] == 8;
15749 ok &= in_param_offset[ 8] == 48; ok &= in_param_size[ 8] == 16;
15750 ok &= in_param_offset[ 9] == 64; ok &= in_param_size[ 9] == 8;
15751 ok &= in_param_offset[10] == 72; ok &= in_param_size[10] == 72;
15752 ok &= in_param_offset[11] == 0; ok &= in_param_size[11] == 0;
15753 ok &= in_param_offset[12] == 144; ok &= in_param_size[12] == 72;
15754 ok &= in_param_offset[13] == 224; ok &= in_param_size[13] == 40;
15755 ok &= in_param_offset[14] == 264; ok &= in_param_size[14] == 8;
15756 ok &= in_param_offset[15] == 280; ok &= in_param_size[15] == 16;
15757 ok &= in_param_offset[16] == 296; ok &= in_param_size[16] == 8;
15758 ok &= in_param_offset[17] == 0; ok &= in_param_size[17] == 0;
15759 ok &= in_param_offset[18] == 304; ok &= in_param_size[18] == 8;
15760 ok &= in_offset == 312;
15761
15762 if (!ok) {
15763 cm_msg(
MERROR,
"rpc_execute_cxx",
"RPC_TEST2 parameters encoding error!");
15765 }
15766 }
15767
15769 printf("rpc_execute_cxx: calling dispatch()\n");
15770 }
15771
15772
15773
15774
15777 else
15779
15781 printf(
"rpc_execute_cxx: dispatch() status %d\n",
status);
15782 }
15783
15786
15787
15790 }
15791
15794 }
15795
15796
15799 }
15800
15801
15802 if (!sock) {
15804 }
15805
15806 std::vector<char> v_out;
15807
15809
15810 for (
int i = 0;
i < nparams;
i++) {
15814
15817 size_t arg_size = 1 + params[
i].ps->length();
15818 size_t param_size =
ALIGN8(arg_size);
15819
15821 printf(
"rpc_execute_cxx: param %2d, std::string arg_size %zu, param_size %zu, string [%s]\n",
i, arg_size, param_size, params[
i].ps->c_str());
15822
15823 v_out.insert(v_out.end(), params[
i].ps->c_str(), params[
i].ps->c_str() + arg_size);
15824 v_out.resize(v_out.size() + param_size - arg_size);
15826 size_t arg_size = params[
i].pv->size();
15827 size_t param_size =
ALIGN8(arg_size);
15828
15830 printf(
"rpc_execute_cxx: param %2d, std::vector arg_size %zu, param_size %zu\n",
i, arg_size, param_size);
15831
15833 *((
INT *) buf) = arg_size;
15834 if (convert_flags)
15836 v_out.insert(v_out.end(), buf, buf +
ALIGN8(
sizeof(
INT)));
15837 v_out.insert(v_out.end(), params[
i].pv->data(), params[
i].pv->data() + arg_size);
15838 v_out.resize(v_out.size() + param_size - arg_size);
15839 } else {
15840 cm_msg(
MERROR,
"rpc_execute_cxx",
"RPC %d: param %d tid %d flags 0x%x, TID not compatible with flag RPC_CXX", routine_id,
i, tid, flags);
15842 }
15843 } else {
15844 size_t convert_offset = 0;
15845 size_t convert_size = 0;
15846
15848 size_t max_size = params[
i].out_max_size;
15849 char* param_ptr = (
char *) prpc_param[
i];
15850
15851 size_t arg_size = 1 + strlen(param_ptr);
15852 if (arg_size > max_size) {
15853 param_ptr[max_size] = 0;
15854 size_t arg_size = 1 + strlen(param_ptr);
15855 assert(arg_size == max_size);
15856 }
15857 size_t param_size =
ALIGN8(arg_size);
15858
15860 printf(
"rpc_execute_cxx: param %2d, string max_size %zu, string_size %zu, param_size %zu\n",
i, max_size, arg_size, param_size);
15861
15862 v_out.insert(v_out.end(), param_ptr, param_ptr + arg_size);
15863 v_out.resize(v_out.size() + param_size - arg_size);
15865 size_t max_size = params[
i].out_max_size;
15866 size_t arg_size = *((
INT *) prpc_param[
i + 1]);
15867 char* param_ptr = (
char*)prpc_param[
i];
15868 size_t param_size =
ALIGN8(arg_size);
15869
15871 printf(
"rpc_execute_cxx: param %2d, array max_size %zu, param_size %zu\n",
i, max_size, param_size);
15872
15874 *((
INT *) buf) = arg_size;
15875 if (convert_flags)
15877 v_out.insert(v_out.end(), buf, buf +
ALIGN8(
sizeof(
INT)));
15878 convert_offset = v_out.size();
15879 convert_size = arg_size;
15880 v_out.insert(v_out.end(), param_ptr, param_ptr + arg_size);
15881 v_out.resize(v_out.size() + param_size - arg_size);
15882 } else {
15883 char* param_ptr = (
char*)prpc_param[
i];
15887 size_t param_size =
ALIGN8(arg_size);
15888
15891 printf(
"rpc_execute_cxx: param %2d, tid %2d, arg_size %zu, param_size %zu, value %d\n",
i, tid, arg_size, param_size, *(
int*)param_ptr);
15892 } else {
15893 printf(
"rpc_execute_cxx: param %2d, tid %2d, arg_size %zu, param_size %zu\n",
i, tid, arg_size, param_size);
15894 }
15895 }
15896
15897 convert_offset = v_out.size();
15898 convert_size = arg_size;
15899 v_out.insert(v_out.end(), param_ptr, param_ptr + arg_size);
15900 v_out.resize(v_out.size() + param_size - arg_size);
15901 }
15902
15903
15904 if (convert_flags) {
15907 else
15909 }
15910 }
15911 }
15912 }
15913
15915
15916
15919
15920
15921
15922 if (convert_flags) {
15925 }
15926
15928
15932 }
15933
15935 printf(
"rpc_execute_cxx: send_tcp() sent %d bytes\n",
status);
15936
15937
15940
15941
15944
15946}
void rpc_convert_data(void *data, INT tid, INT flags, INT total_size, INT convert_flags)