|  | 
| 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