15530{
15532
15533 bool debug =
false;
15534
15535
15537
15538
15539 if (convert_flags) {
15542 }
15543
15544
15545
15546
15547
15548
15550 sock = 0;
15551
15553
15554 assert(xroutine_id == routine_id);
15555
15556#if 0
15559
15562
15565
15568#endif
15569
15570
15571
15572 char* in_param_ptr = (
char*)nc_in->
param;
15573
15575 printf(
"rpc_execute_cxx: routine_id %d, name \"%s\"\n", routine_id, rl.
name);
15576
15578
15581
15582 std::vector<RPE> params;
15583
15584 int nparams = 0;
15586 nparams++;
15587 }
15588
15589 params.resize(nparams);
15590
15591 size_t in_offset = 0;
15592
15593 for (
int i = 0;
i < nparams;
i++) {
15594 in_param_size[
i] = 0;
15595 in_param_offset[
i] = 0;
15596
15599
15602
15604 arg_size = 1 + strlen((char *) (in_param_ptr));
15605 }
15606
15608
15609 int arg_size_align8 = *((
INT *) in_param_ptr);
15610 if (convert_flags)
15615
15616 arg_size = arg_size_align8;
15617 } else {
15618
15619 arg_size = *((
INT *) (((
char*)in_param_ptr) +
ALIGN8(arg_size_align8)));
15620 if (convert_flags)
15622 }
15623
15624
15626 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);
15628 }
15629 }
15630
15633 }
15634
15635 int param_size =
ALIGN8(arg_size);
15636
15637 in_param_size[
i] = param_size;
15638 in_param_offset[
i] = in_offset;
15639
15640 params[
i].offset = in_offset;
15641 params[
i].arg_size = arg_size;
15642 params[
i].param_size = param_size;
15643
15644
15645 if (convert_flags) {
15648 } else {
15650 }
15651 }
15652
15653 in_param_ptr += param_size;
15654 in_offset += param_size;
15655 }
15656
15659
15661 params[
i].out_max_size = 0;
15663
15664
15665
15666
15667
15668 params[
i].out_max_size_offset = in_offset;
15669
15670 INT max_size = *((
INT *) in_param_ptr);
15671
15672 if (convert_flags)
15674
15675 params[
i].out_max_size = max_size;
15676 }
15677
15679 params[
i].out_max_size = rl.
param[
i].
n;
15680 }
15681 }
15682
15685 params[
i].ps =
new std::string;
15687 *(params[
i].ps) = (
char*)nc_in->
param + in_param_offset[
i];
15688
15689 }
15690 prpc_param[
i] = (
void*) params[
i].ps;
15692 params[
i].pv =
new std::vector<char>;
15694 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);
15695
15696 }
15697 prpc_param[
i] = (
void*) params[
i].pv;
15698 } else {
15699 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);
15701 }
15702 } else {
15704 params[
i].pv =
new std::vector<char>;
15705 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);
15706 size_t want_size = params[
i].out_max_size;
15707
15708 if (params[
i].pv->size() < want_size)
15709 params[
i].pv->resize(want_size);
15710 prpc_param[
i] = params[
i].pv->data();
15711 }
else if (flags &
RPC_IN) {
15712 prpc_param[
i] = (
char*)nc_in->
param + in_param_offset[
i];
15713
15714 }
else if (flags &
RPC_OUT) {
15715 params[
i].pv =
new std::vector<char>;
15716 params[
i].pv->resize(params[
i].out_max_size);
15717 prpc_param[
i] = params[
i].pv->data();
15718
15719 }
15720 }
15721
15723 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]);
15724 }
15725
15727 printf(
"rpc_execute_cxx: nc_in size %d, in_offset %zu\n", nc_in->
header.
param_size, in_offset);
15728
15730 bool ok = true;
15731
15732 ok &= in_param_offset[ 0] == 0; ok &= in_param_size[ 0] == 8;
15733 ok &= in_param_offset[ 1] == 0; ok &= in_param_size[ 1] == 0;
15734 ok &= in_param_offset[ 2] == 8; ok &= in_param_size[ 2] == 8;
15735 ok &= in_param_offset[ 3] == 16; ok &= in_param_size[ 3] == 16;
15736 ok &= in_param_offset[ 4] == 0; ok &= in_param_size[ 4] == 0;
15737 ok &= in_param_offset[ 5] == 32; ok &= in_param_size[ 5] == 8;
15738 ok &= in_param_offset[ 6] == 0; ok &= in_param_size[ 6] == 0;
15739 ok &= in_param_offset[ 7] == 40; ok &= in_param_size[ 7] == 8;
15740 ok &= in_param_offset[ 8] == 48; ok &= in_param_size[ 8] == 16;
15741 ok &= in_param_offset[ 9] == 64; ok &= in_param_size[ 9] == 8;
15742 ok &= in_param_offset[10] == 72; ok &= in_param_size[10] == 72;
15743 ok &= in_param_offset[11] == 0; ok &= in_param_size[11] == 0;
15744 ok &= in_param_offset[12] == 144; ok &= in_param_size[12] == 72;
15745 ok &= in_param_offset[13] == 224; ok &= in_param_size[13] == 40;
15746 ok &= in_param_offset[14] == 264; ok &= in_param_size[14] == 8;
15747 ok &= in_param_offset[15] == 280; ok &= in_param_size[15] == 16;
15748 ok &= in_param_offset[16] == 296; ok &= in_param_size[16] == 8;
15749 ok &= in_param_offset[17] == 0; ok &= in_param_size[17] == 0;
15750 ok &= in_param_offset[18] == 304; ok &= in_param_size[18] == 8;
15751 ok &= in_offset == 312;
15752
15753 if (!ok) {
15754 cm_msg(
MERROR,
"rpc_execute_cxx",
"RPC_TEST2 parameters encoding error!");
15756 }
15757 }
15758
15760 printf("rpc_execute_cxx: calling dispatch()\n");
15761 }
15762
15763
15764
15765
15768 else
15770
15772 printf(
"rpc_execute_cxx: dispatch() status %d\n",
status);
15773 }
15774
15777
15778
15781 }
15782
15785 }
15786
15787
15790 }
15791
15792
15793 if (!sock) {
15795 }
15796
15797 std::vector<char> v_out;
15798
15800
15801 for (
int i = 0;
i < nparams;
i++) {
15805
15808 size_t arg_size = 1 + params[
i].ps->length();
15809 size_t param_size =
ALIGN8(arg_size);
15810
15812 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());
15813
15814 v_out.insert(v_out.end(), params[
i].ps->c_str(), params[
i].ps->c_str() + arg_size);
15815 v_out.resize(v_out.size() + param_size - arg_size);
15817 size_t arg_size = params[
i].pv->size();
15818 size_t param_size =
ALIGN8(arg_size);
15819
15821 printf(
"rpc_execute_cxx: param %2d, std::vector arg_size %zu, param_size %zu\n",
i, arg_size, param_size);
15822
15824 *((
INT *) buf) = arg_size;
15825 if (convert_flags)
15827 v_out.insert(v_out.end(), buf, buf +
ALIGN8(
sizeof(
INT)));
15828 v_out.insert(v_out.end(), params[
i].pv->data(), params[
i].pv->data() + arg_size);
15829 v_out.resize(v_out.size() + param_size - arg_size);
15830 } else {
15831 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);
15833 }
15834 } else {
15835 size_t convert_offset = 0;
15836 size_t convert_size = 0;
15837
15839 size_t max_size = params[
i].out_max_size;
15840 char* param_ptr = (
char *) prpc_param[
i];
15841
15842 size_t arg_size = 1 + strlen(param_ptr);
15843 if (arg_size > max_size) {
15844 param_ptr[max_size] = 0;
15845 size_t arg_size = 1 + strlen(param_ptr);
15846 assert(arg_size == max_size);
15847 }
15848 size_t param_size =
ALIGN8(arg_size);
15849
15851 printf(
"rpc_execute_cxx: param %2d, string max_size %zu, string_size %zu, param_size %zu\n",
i, max_size, arg_size, param_size);
15852
15853 v_out.insert(v_out.end(), param_ptr, param_ptr + arg_size);
15854 v_out.resize(v_out.size() + param_size - arg_size);
15856 size_t max_size = params[
i].out_max_size;
15857 size_t arg_size = *((
INT *) prpc_param[
i + 1]);
15858 char* param_ptr = (
char*)prpc_param[
i];
15859 size_t param_size =
ALIGN8(arg_size);
15860
15862 printf(
"rpc_execute_cxx: param %2d, array max_size %zu, param_size %zu\n",
i, max_size, param_size);
15863
15865 *((
INT *) buf) = arg_size;
15866 if (convert_flags)
15868 v_out.insert(v_out.end(), buf, buf +
ALIGN8(
sizeof(
INT)));
15869 convert_offset = v_out.size();
15870 convert_size = arg_size;
15871 v_out.insert(v_out.end(), param_ptr, param_ptr + arg_size);
15872 v_out.resize(v_out.size() + param_size - arg_size);
15873 } else {
15874 char* param_ptr = (
char*)prpc_param[
i];
15878 size_t param_size =
ALIGN8(arg_size);
15879
15882 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);
15883 } else {
15884 printf(
"rpc_execute_cxx: param %2d, tid %2d, arg_size %zu, param_size %zu\n",
i, tid, arg_size, param_size);
15885 }
15886 }
15887
15888 convert_offset = v_out.size();
15889 convert_size = arg_size;
15890 v_out.insert(v_out.end(), param_ptr, param_ptr + arg_size);
15891 v_out.resize(v_out.size() + param_size - arg_size);
15892 }
15893
15894
15895 if (convert_flags) {
15898 else
15900 }
15901 }
15902 }
15903 }
15904
15906
15907
15910
15911
15912
15913 if (convert_flags) {
15916 }
15917
15919
15923 }
15924
15926 printf(
"rpc_execute_cxx: send_tcp() sent %d bytes\n",
status);
15927
15928
15931
15932
15935
15937}
void rpc_convert_data(void *data, INT tid, INT flags, INT total_size, INT convert_flags)