|
88 | 88 | pmix_data_range_t range, |
89 | 89 | pmix_info_t info[], size_t ninfo, |
90 | 90 | pmix_op_cbfunc_t cbfunc, void *cbdata); |
| 91 | + #if HAVE_PMIX_QUERY_FUNCTION |
| 92 | +static pmix_status_t server_query(pmix_proc_t *proct, |
| 93 | + pmix_info_t *info, size_t ninfo, |
| 94 | + pmix_info_t *directives, size_t ndirs, |
| 95 | + pmix_info_cbfunc_t cbfunc, |
| 96 | + void *cbdata); |
| 97 | +static void server_tool_connection(pmix_info_t *info, size_t ninfo, |
| 98 | + pmix_tool_connection_cbfunc_t cbfunc, |
| 99 | + void *cbdata); |
| 100 | +#endif |
| 101 | + |
91 | 102 | pmix_server_module_t mymodule = { |
92 | 103 | .client_connected = server_client_connected_fn, |
93 | 104 | .client_finalized = server_client_finalized_fn, |
|
102 | 113 | .disconnect = server_disconnect_fn, |
103 | 114 | .register_events = server_register_events, |
104 | 115 | .deregister_events = server_deregister_events, |
105 | | - .notify_event = server_notify_event |
| 116 | + .notify_event = server_notify_event, |
| 117 | +#if HAVE_PMIX_QUERY_FUNCTION |
| 118 | + .query = server_query, |
| 119 | + .tool_connected = server_tool_connection |
| 120 | +#endif |
106 | 121 | }; |
107 | 122 |
|
108 | 123 | opal_pmix_server_module_t *host_module = NULL; |
@@ -787,3 +802,159 @@ static pmix_status_t server_notify_event(pmix_status_t code, |
787 | 802 | { |
788 | 803 | return PMIX_ERR_NOT_SUPPORTED; |
789 | 804 | } |
| 805 | + |
| 806 | +#if HAVE_PMIX_QUERY_FUNCTION |
| 807 | +static void _info_rel(void *cbdata) |
| 808 | +{ |
| 809 | + pmix20_opcaddy_t *pcaddy = (pmix20_opcaddy_t*)cbdata; |
| 810 | + |
| 811 | + OBJ_RELEASE(pcaddy); |
| 812 | +} |
| 813 | +static void info_cbfunc(int status, |
| 814 | + opal_list_t *info, |
| 815 | + void *cbdata, |
| 816 | + opal_pmix_release_cbfunc_t release_fn, |
| 817 | + void *release_cbdata) |
| 818 | +{ |
| 819 | + pmix20_opalcaddy_t *opalcaddy = (pmix20_opalcaddy_t*)cbdata; |
| 820 | + pmix20_opcaddy_t *pcaddy; |
| 821 | + opal_value_t *kv; |
| 822 | + size_t n; |
| 823 | + |
| 824 | + pcaddy = OBJ_NEW(pmix20_opcaddy_t); |
| 825 | + |
| 826 | + /* convert the status */ |
| 827 | + pcaddy->status = pmix20_convert_opalrc(status); |
| 828 | + |
| 829 | + /* convert the list to a pmix_info_t array */ |
| 830 | + if (NULL != info) { |
| 831 | + pcaddy->ninfo = opal_list_get_size(info); |
| 832 | + if (0 < pcaddy->ninfo) { |
| 833 | + PMIX_INFO_CREATE(pcaddy->info, pcaddy->ninfo); |
| 834 | + n = 0; |
| 835 | + OPAL_LIST_FOREACH(kv, info, opal_value_t) { |
| 836 | + (void)strncpy(pcaddy->info[n].key, kv->key, PMIX_MAX_KEYLEN); |
| 837 | + pmix20_value_load(&pcaddy->info[n].value, kv); |
| 838 | + } |
| 839 | + } |
| 840 | + } |
| 841 | + /* we are done with the incoming data */ |
| 842 | + if (NULL != release_fn) { |
| 843 | + release_fn(release_cbdata); |
| 844 | + } |
| 845 | + |
| 846 | + /* provide the answer downward */ |
| 847 | + if (NULL != opalcaddy->infocbfunc) { |
| 848 | + opalcaddy->infocbfunc(pcaddy->status, pcaddy->info, pcaddy->ninfo, |
| 849 | + opalcaddy->cbdata, _info_rel, pcaddy); |
| 850 | + } |
| 851 | + OBJ_RELEASE(opalcaddy); |
| 852 | +} |
| 853 | + |
| 854 | +static pmix_status_t server_query(pmix_proc_t *proct, |
| 855 | + pmix_info_t *info, size_t ninfo, |
| 856 | + pmix_info_t *directives, size_t ndirs, |
| 857 | + pmix_info_cbfunc_t cbfunc, |
| 858 | + void *cbdata) |
| 859 | +{ |
| 860 | + pmix20_opalcaddy_t *opalcaddy; |
| 861 | + opal_process_name_t requestor; |
| 862 | + int rc; |
| 863 | + size_t n; |
| 864 | + opal_value_t *oinfo; |
| 865 | + |
| 866 | + if (NULL == host_module || NULL == host_module->query) { |
| 867 | + return PMIX_ERR_NOT_SUPPORTED; |
| 868 | + } |
| 869 | + |
| 870 | + /* setup the caddy */ |
| 871 | + opalcaddy = OBJ_NEW(pmix20_opalcaddy_t); |
| 872 | + opalcaddy->infocbfunc = cbfunc; |
| 873 | + opalcaddy->cbdata = cbdata; |
| 874 | + |
| 875 | + /* convert the requestor */ |
| 876 | + if (OPAL_SUCCESS != (rc = opal_convert_string_to_jobid(&requestor.jobid, proct->nspace))) { |
| 877 | + OBJ_RELEASE(opalcaddy); |
| 878 | + return pmix20_convert_opalrc(rc); |
| 879 | + } |
| 880 | + requestor.vpid = proct->rank; |
| 881 | + |
| 882 | + /* convert the info */ |
| 883 | + for (n=0; n < ninfo; n++) { |
| 884 | + oinfo = OBJ_NEW(opal_value_t); |
| 885 | + opal_list_append(&opalcaddy->info, &oinfo->super); |
| 886 | + oinfo->key = strdup(info[n].key); |
| 887 | + if (OPAL_SUCCESS != (rc = pmix20_value_unload(oinfo, &info[n].value))) { |
| 888 | + OBJ_RELEASE(opalcaddy); |
| 889 | + return pmix20_convert_opalrc(rc); |
| 890 | + } |
| 891 | + } |
| 892 | + |
| 893 | + /* we ignore directives for now */ |
| 894 | + |
| 895 | + /* pass the call upwards */ |
| 896 | + if (OPAL_SUCCESS != (rc = host_module->query(&requestor, |
| 897 | + &opalcaddy->info, NULL, |
| 898 | + info_cbfunc, opalcaddy))) { |
| 899 | + OBJ_RELEASE(opalcaddy); |
| 900 | + } |
| 901 | + |
| 902 | + return pmix20_convert_opalrc(rc); |
| 903 | +} |
| 904 | + |
| 905 | +static void toolcbfunc(int status, |
| 906 | + opal_process_name_t proc, |
| 907 | + void *cbdata) |
| 908 | +{ |
| 909 | + pmix20_opalcaddy_t *opalcaddy = (pmix20_opalcaddy_t*)cbdata; |
| 910 | + pmix_status_t rc; |
| 911 | + pmix_proc_t p; |
| 912 | + |
| 913 | + |
| 914 | + /* convert the status */ |
| 915 | + rc = pmix20_convert_opalrc(status); |
| 916 | + |
| 917 | + /* convert the process name */ |
| 918 | + (void)opal_snprintf_jobid(p.nspace, PMIX_MAX_NSLEN, proc.jobid); |
| 919 | + p.rank = proc.vpid; |
| 920 | + |
| 921 | + /* pass it down */ |
| 922 | + if (NULL != opalcaddy->toolcbfunc) { |
| 923 | + opalcaddy->toolcbfunc(rc, &p, opalcaddy->cbdata); |
| 924 | + } |
| 925 | + OBJ_RELEASE(opalcaddy); |
| 926 | +} |
| 927 | + |
| 928 | +static void server_tool_connection(pmix_info_t *info, size_t ninfo, |
| 929 | + pmix_tool_connection_cbfunc_t cbfunc, |
| 930 | + void *cbdata) |
| 931 | +{ |
| 932 | + pmix20_opalcaddy_t *opalcaddy; |
| 933 | + size_t n; |
| 934 | + opal_value_t *oinfo; |
| 935 | + int rc; |
| 936 | + pmix_status_t err; |
| 937 | + |
| 938 | + /* setup the caddy */ |
| 939 | + opalcaddy = OBJ_NEW(pmix20_opalcaddy_t); |
| 940 | + opalcaddy->toolcbfunc = cbfunc; |
| 941 | + opalcaddy->cbdata = cbdata; |
| 942 | + |
| 943 | + /* convert the info */ |
| 944 | + for (n=0; n < ninfo; n++) { |
| 945 | + oinfo = OBJ_NEW(opal_value_t); |
| 946 | + opal_list_append(&opalcaddy->info, &oinfo->super); |
| 947 | + oinfo->key = strdup(info[n].key); |
| 948 | + if (OPAL_SUCCESS != (rc = pmix20_value_unload(oinfo, &info[n].value))) { |
| 949 | + OBJ_RELEASE(opalcaddy); |
| 950 | + err = pmix20_convert_opalrc(rc); |
| 951 | + if (NULL != cbfunc) { |
| 952 | + cbfunc(err, NULL, cbdata); |
| 953 | + } |
| 954 | + } |
| 955 | + } |
| 956 | + |
| 957 | + /* pass it up */ |
| 958 | + host_module->tool_connected(&opalcaddy->info, toolcbfunc, opalcaddy); |
| 959 | +} |
| 960 | +#endif |
0 commit comments