⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rds_hostfile.c

📁 MPI stands for the Message Passing Interface. Written by the MPI Forum (a large committee comprising
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana *                         University Research and Technology *                         Corporation.  All rights reserved. * Copyright (c) 2004-2005 The University of Tennessee and The University *                         of Tennessee Research Foundation.  All rights *                         reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, *                         University of Stuttgart.  All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. *                         All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow * * $HEADER$ */#include "orte_config.h"#ifdef HAVE_UNISTD_H#include <unistd.h>#endif#include <errno.h>#include <string.h>#include "opal/class/opal_list.h"#include "opal/util/output.h"#include "opal/util/argv.h"#include "opal/mca/mca.h"#include "opal/mca/base/base.h"#include "opal/util/show_help.h"#include "orte/orte_constants.h"#include "orte/util/sys_info.h"#include "orte/mca/ns/ns.h"#include "orte/mca/errmgr/errmgr.h"#include "orte/mca/ras/ras.h"#include "orte/mca/ras/base/ras_private.h"#include "orte/runtime/runtime_types.h"#include "orte/mca/rds/rds.h"#include "orte/mca/rds/base/rds_private.h"#include "orte/mca/rds/hostfile/rds_hostfile.h"#include "orte/mca/rds/hostfile/rds_hostfile_lex.h"static bool orte_rds_hostfile_queried = false;static orte_cellid_t local_cellid;static bool need_cellid = true;static char *cur_hostfile_name = NULL;static void orte_rds_hostfile_parse_error(int token){    switch (token) {    case ORTE_RDS_HOSTFILE_STRING:        opal_show_help("help-rds-hostfile.txt", "rds:parse_error_string",                       true,                       cur_hostfile_name,                        orte_rds_hostfile_line,                        token,                        orte_rds_hostfile_value.sval);        break;    case ORTE_RDS_HOSTFILE_IPV4:    case ORTE_RDS_HOSTFILE_INT:        opal_show_help("help-rds-hostfile.txt", "rds:parse_error_int",                       true,                       cur_hostfile_name,                        orte_rds_hostfile_line,                        token,                        orte_rds_hostfile_value.ival);        break;     default:        opal_show_help("help-rds-hostfile.txt", "rds:parse_error",                       true,                       cur_hostfile_name,                        orte_rds_hostfile_line,                        token );        break;    }} /**  * Return the integer following an = (actually may only return positive ints)  */static int orte_rds_hostfile_parse_int(void){    if (ORTE_RDS_HOSTFILE_EQUAL != orte_rds_hostfile_lex())        return -1;    if (ORTE_RDS_HOSTFILE_INT != orte_rds_hostfile_lex())        return -1;    return orte_rds_hostfile_value.ival;}/** * Return the string following an = (option to a keyword) */static char * orte_rds_hostfile_parse_string(void){    int rc;    if (ORTE_RDS_HOSTFILE_EQUAL != orte_rds_hostfile_lex())        return NULL;    rc = orte_rds_hostfile_lex();    if (ORTE_RDS_HOSTFILE_STRING != rc)        return NULL;    return strdup(orte_rds_hostfile_value.sval);}static orte_ras_node_t* orte_rds_hostfile_lookup(opal_list_t* nodes, const char* name){    opal_list_item_t* item;    for(item =  opal_list_get_first(nodes);        item != opal_list_get_end(nodes);        item =  opal_list_get_next(item)) {        orte_ras_node_t* node = (orte_ras_node_t*)item;        if(strcmp(node->node_name, name) == 0) {            opal_list_remove_item(nodes, item);            return node;        }    }    return NULL;}static int orte_rds_hostfile_parse_line(int token, opal_list_t* existing, opal_list_t* updates){    char buff[64];    int rc;    orte_ras_node_t* node;    bool update = false;    bool got_count = false;    bool got_max = false;    if (ORTE_RDS_HOSTFILE_STRING == token ||        ORTE_RDS_HOSTFILE_HOSTNAME == token ||        ORTE_RDS_HOSTFILE_INT == token ||        ORTE_RDS_HOSTFILE_IPV4 == token) {        char* value;        char** argv;        char* node_name = NULL;        char* username = NULL;        int cnt;        if(ORTE_RDS_HOSTFILE_INT == token) {            sprintf(buff,"%d", orte_rds_hostfile_value.ival);            value = buff;        } else {            value = orte_rds_hostfile_value.sval;        }        argv = opal_argv_split (value, '@');        cnt = opal_argv_count (argv);        if (1 == cnt) {            node_name = strdup(argv[0]);        } else if (2 == cnt) {            username = strdup(argv[0]);            node_name = strdup(argv[1]);        } else {            opal_output(0, "WARNING: Unhandeled user@host-combination\n"); /* XXX */        }        opal_argv_free (argv);        /* convert this into something globally unique */        if(strcmp(node_name, "localhost") == 0) {            /* Nodename has been allocated, that is for sure */            free (node_name);            node_name = strdup(orte_system_info.nodename);        }        /* Do we need to make a new node object?  First check to see           if it's in the existing list. */        if (NULL == (node = orte_rds_hostfile_lookup(existing, node_name))) {            /* If it wasn't, see if it's already in the updates list */            if (NULL == (node = orte_rds_hostfile_lookup(updates,                                                         node_name))) {                node = OBJ_NEW(orte_ras_node_t);                node->node_name = node_name;                node->node_username = username;                node->node_slots = 0;#if 0                /* get a new cellid for this node */                /* JMS Temporarily turned off until cell IDs are                   properly handled elsewhere in the code */                /* JJH This assumes that each hostname listed should be                   placed in a new cell. Is this accurate to the design?                */                if (ORTE_SUCCESS !=                    (rc = orte_ns.create_cellid(&(node->node_cellid),                                                "UNKNOWN-SITE",                                                node->node_name))) {                    ORTE_ERROR_LOG(rc);                    return rc;                }#endif            }            /* Note that we need to set update to true regardless of               whether the node was found on the updates list or not.               If it was found, we just removed it (in               orte_rds_hostfile_lookup()), so the update puts it back               (potentially after updating it, of course).  If it was               not found, then we have a new node instance that needs               to be added to the updates list. */            update = true;        }        else {            /* If it was in the existing list, then we can use its cellid             * to add the reset of the hosts in the file to. */            local_cellid = node->node_cellid;            need_cellid = false;        }    } else {        orte_rds_hostfile_parse_error(token);        return ORTE_ERROR;    }    got_count = false;    while (!orte_rds_hostfile_done) {        token = orte_rds_hostfile_lex();        switch (token) {        case ORTE_RDS_HOSTFILE_DONE:            goto done;        case ORTE_RDS_HOSTFILE_NEWLINE:            goto done;        case ORTE_RDS_HOSTFILE_USERNAME:            node->node_username = orte_rds_hostfile_parse_string();            break;        case ORTE_RDS_HOSTFILE_COUNT:        case ORTE_RDS_HOSTFILE_CPU:        case ORTE_RDS_HOSTFILE_SLOTS:            rc = orte_rds_hostfile_parse_int();            if (rc < 0) {                opal_show_help("help-rds-hostfile.txt", "rds:slots",                               true,                               cur_hostfile_name, rc);                OBJ_RELEASE(node);                return ORTE_ERROR;            }            node->node_slots += rc;            update = true;            got_count = true;            /* Ensure that node_slots_max >= node_slots */            if (node->node_slots_max != 0 && node->node_slots_max < node->node_slots) {                node->node_slots_max = node->node_slots;            }            break;        case ORTE_RDS_HOSTFILE_SLOTS_MAX:            rc = orte_rds_hostfile_parse_int();            if (rc < 0) {                opal_show_help("help-rds-hostfile.txt", "rds:max_slots",                               true,                               cur_hostfile_name, ((size_t) rc));                OBJ_RELEASE(node);                return ORTE_ERROR;            }            /* Only take this update if it puts us >= node_slots */            if (rc >= node->node_slots) {                if (node->node_slots_max != rc) {                    node->node_slots_max = rc;                    update = true;                    got_max = true;                }            } else {                opal_show_help("help-rds-hostfile.txt", "rds:max_slots_lt",                               true,                               cur_hostfile_name, node->node_slots, rc);                ORTE_ERROR_LOG(ORTE_ERR_BAD_PARAM);                OBJ_RELEASE(node);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -