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

📄 smpd_command.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 2 页
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* *  (C) 2001 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. */#include <stdio.h>#include <stdlib.h>#include "mpiexec.h"#include "smpd.h"#undef FCNAME#define FCNAME "smpd_get_cmd_state_string"const char * smpd_get_cmd_state_string(smpd_command_state_t state){    const char *result;    static char unknown_str[100];    smpd_enter_fn(FCNAME);    switch (state)    {    case SMPD_CMD_INVALID:	result = "SMPD_CMD_INVALID";	break;    case SMPD_CMD_READING_HDR:	result = "SMPD_CMD_READING_HDR";	break;    case SMPD_CMD_READING_CMD:	result = "SMPD_CMD_READING_CMD";	break;    case SMPD_CMD_WRITING_CMD:	result = "SMPD_CMD_WRITING_CMD";	break;    case SMPD_CMD_READY:	result = "SMPD_CMD_READY";	break;    case SMPD_CMD_HANDLED:	result = "SMPD_CMD_HANDLED";	break;    default:	sprintf(unknown_str, "unknown state %d", state);	result = unknown_str;	break;    }    smpd_exit_fn(FCNAME);    return result;}#undef FCNAME#define FCNAME "smpd_command_to_string"SMPD_BOOL smpd_command_to_string(char **str_pptr, int *len_ptr, int indent, smpd_command_t *cmd_ptr){    char indent_str[SMPD_MAX_TO_STRING_INDENT+1];    smpd_enter_fn(FCNAME);    if (*len_ptr < 1)    {	smpd_exit_fn(FCNAME);	return SMPD_FALSE;    }    if (indent > SMPD_MAX_TO_STRING_INDENT)	indent = SMPD_MAX_TO_STRING_INDENT;    memset(indent_str, MPIU_STR_SEPAR_CHAR, indent);    indent_str[indent] = '\0';    smpd_snprintf_update(str_pptr, len_ptr, "%sstate: %s\n", indent_str, smpd_get_cmd_state_string(cmd_ptr->state));    if (*len_ptr < 1) { smpd_exit_fn(FCNAME); return SMPD_FALSE; }    smpd_snprintf_update(str_pptr, len_ptr, "%scmd_str: %s\n", indent_str, cmd_ptr->cmd_str);    if (*len_ptr < 1) { smpd_exit_fn(FCNAME); return SMPD_FALSE; }    smpd_snprintf_update(str_pptr, len_ptr, "%ssrc: %d\n", indent_str, cmd_ptr->src);    if (*len_ptr < 1) { smpd_exit_fn(FCNAME); return SMPD_FALSE; }    smpd_snprintf_update(str_pptr, len_ptr, "%sdest: %d\n", indent_str, cmd_ptr->dest);    if (*len_ptr < 1) { smpd_exit_fn(FCNAME); return SMPD_FALSE; }    smpd_snprintf_update(str_pptr, len_ptr, "%stag: %d\n", indent_str, cmd_ptr->tag);    if (*len_ptr < 1) { smpd_exit_fn(FCNAME); return SMPD_FALSE; }    smpd_snprintf_update(str_pptr, len_ptr, "%swait: %s\n", indent_str, cmd_ptr->wait ? "TRUE" : "FALSE");    if (*len_ptr < 1) { smpd_exit_fn(FCNAME); return SMPD_FALSE; }    smpd_snprintf_update(str_pptr, len_ptr, "%scmd_hdr_str: %s\n", indent_str, cmd_ptr->cmd_hdr_str);    if (*len_ptr < 1) { smpd_exit_fn(FCNAME); return SMPD_FALSE; }    smpd_snprintf_update(str_pptr, len_ptr, "%slength: %d\n", indent_str, cmd_ptr->length);    if (*len_ptr < 1) { smpd_exit_fn(FCNAME); return SMPD_FALSE; }    smpd_snprintf_update(str_pptr, len_ptr, "%scmd: %s\n", indent_str, cmd_ptr->cmd);    if (*len_ptr < 1) { smpd_exit_fn(FCNAME); return SMPD_FALSE; }    smpd_snprintf_update(str_pptr, len_ptr, "%sfreed: %d\n", indent_str, cmd_ptr->freed);    if (*len_ptr < 1) { smpd_exit_fn(FCNAME); return SMPD_FALSE; }    smpd_snprintf_update(str_pptr, len_ptr, "%siov[0].buf: %p\n", indent_str, cmd_ptr->iov[0].MPID_IOV_BUF);    if (*len_ptr < 1) { smpd_exit_fn(FCNAME); return SMPD_FALSE; }    smpd_snprintf_update(str_pptr, len_ptr, "%siov[0].len: %d\n", indent_str, cmd_ptr->iov[0].MPID_IOV_LEN);    if (*len_ptr < 1) { smpd_exit_fn(FCNAME); return SMPD_FALSE; }    smpd_snprintf_update(str_pptr, len_ptr, "%siov[1].buf: %p\n", indent_str, cmd_ptr->iov[1].MPID_IOV_BUF);    if (*len_ptr < 1) { smpd_exit_fn(FCNAME); return SMPD_FALSE; }    smpd_snprintf_update(str_pptr, len_ptr, "%siov[1].len: %d\n", indent_str, cmd_ptr->iov[1].MPID_IOV_LEN);    if (*len_ptr < 1) { smpd_exit_fn(FCNAME); return SMPD_FALSE; }    smpd_snprintf_update(str_pptr, len_ptr, "%sstdin_read_offset: %d\n", indent_str, cmd_ptr->stdin_read_offset);    if (*len_ptr < 1) { smpd_exit_fn(FCNAME); return SMPD_FALSE; }    smpd_snprintf_update(str_pptr, len_ptr, "%snext: %p\n", indent_str, cmd_ptr->next);    if (*len_ptr < 1) { smpd_exit_fn(FCNAME); return SMPD_FALSE; } /* this misses the case of an exact fit */    smpd_exit_fn(FCNAME);    return SMPD_TRUE;}#undef FCNAME#define FCNAME "smpd_command_destination"int smpd_command_destination(int dest, smpd_context_t **dest_context){    int src, level_bit, sub_tree_mask;    smpd_enter_fn(FCNAME);    /* get the source */    src = smpd_process.id;    /*smpd_dbg_printf("determining destination context for %d -> %d\n", src, dest);*/    /* determine the route and return the context */    if (src == dest)    {	*dest_context = NULL;	smpd_dbg_printf("%d -> %d : returning NULL context\n", src, dest);	smpd_exit_fn(FCNAME);	return SMPD_SUCCESS;    }    if (src == 1 && dest == 0 && smpd_process.map0to1)    {	*dest_context = NULL;	smpd_dbg_printf("%d -> %d : returning NULL context\n", src, dest);	smpd_exit_fn(FCNAME);	return SMPD_SUCCESS;    }    if (src == 0)    {	/* this assumes that the root uses the left context for it's only child. */	if (smpd_process.left_context == NULL)	{	    smpd_exit_fn(FCNAME);	    return SMPD_FAIL;	}	*dest_context = smpd_process.left_context;	smpd_dbg_printf("%d -> %d : returning left_context\n", src, dest);	smpd_exit_fn(FCNAME);	return SMPD_SUCCESS;    }    if (dest < src)    {	if (smpd_process.parent_context == NULL)	{	    smpd_exit_fn(FCNAME);	    return SMPD_FAIL;	}	*dest_context = smpd_process.parent_context;	smpd_dbg_printf("%d -> %d : returning parent_context: %d < %d\n", src, dest, dest, src);	smpd_exit_fn(FCNAME);	return SMPD_SUCCESS;    }    level_bit = 0x1 << smpd_process.level;    sub_tree_mask = (level_bit << 1) - 1;    if (( src ^ level_bit ) == ( dest & sub_tree_mask ))    {	if (smpd_process.left_context == NULL)	{	    smpd_exit_fn(FCNAME);	    return SMPD_FAIL;	}	*dest_context = smpd_process.left_context;	smpd_dbg_printf("%d -> %d : returning left_context\n", src, dest);	smpd_exit_fn(FCNAME);	return SMPD_SUCCESS;    }    if ( src == ( dest & sub_tree_mask ) )    {	if (smpd_process.right_context == NULL)	{	    smpd_exit_fn(FCNAME);	    return SMPD_FAIL;	}	*dest_context = smpd_process.right_context;	smpd_dbg_printf("%d -> %d : returning right_context\n", src, dest);	smpd_exit_fn(FCNAME);	return SMPD_SUCCESS;    }    if (smpd_process.parent_context == NULL)    {	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    *dest_context = smpd_process.parent_context;    smpd_dbg_printf("%d -> %d : returning parent_context: fall through\n", src, dest);    smpd_exit_fn(FCNAME);    return SMPD_SUCCESS;}#undef FCNAME#define FCNAME "smpd_init_command"int smpd_init_command(smpd_command_t *cmd){    smpd_enter_fn(FCNAME);    if (cmd == NULL)    {	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    cmd->cmd_hdr_str[0] = '\0';    cmd->cmd_str[0] = '\0';    cmd->cmd[0] = '\0';    cmd->dest = -1;    cmd->src = -1;    cmd->tag = -1;    cmd->next = NULL;    cmd->length = 0;    cmd->wait = SMPD_FALSE;    cmd->state = SMPD_CMD_INVALID;    cmd->stdin_read_offset = 0;    cmd->freed = 0;    cmd->context = NULL;    smpd_exit_fn(FCNAME);    return SMPD_SUCCESS;}#undef FCNAME#define FCNAME "smpd_parse_command"int smpd_parse_command(smpd_command_t *cmd_ptr){    smpd_enter_fn(FCNAME);    /* get the source */    if (MPIU_Str_get_int_arg(cmd_ptr->cmd, "src", &cmd_ptr->src) != MPIU_STR_SUCCESS)    {	smpd_err_printf("no src flag in the command.\n");	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    if (cmd_ptr->src < 0)    {	smpd_err_printf("invalid command src: %d\n", cmd_ptr->src);	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    /* get the destination */    if (MPIU_Str_get_int_arg(cmd_ptr->cmd, "dest", &cmd_ptr->dest) != MPIU_STR_SUCCESS)    {	smpd_err_printf("no dest flag in the command.\n");	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    if (cmd_ptr->dest < 0)    {	smpd_err_printf("invalid command dest: %d\n", cmd_ptr->dest);	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    /* get the command string */    if (MPIU_Str_get_string_arg(cmd_ptr->cmd, "cmd", cmd_ptr->cmd_str, SMPD_MAX_CMD_STR_LENGTH) != MPIU_STR_SUCCESS)    {	smpd_err_printf("no cmd string in the command.\n");	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    /* get the tag */    /* A command does not have to have a tag so don't check for failure */    MPIU_Str_get_int_arg(cmd_ptr->cmd, "tag", &cmd_ptr->tag);    smpd_exit_fn(FCNAME);    return SMPD_SUCCESS;}#undef FCNAME#define FCNAME "smpd_create_command"int smpd_create_command(char *cmd, int src, int dest, int want_reply, smpd_command_t **cmd_pptr){    smpd_command_t *cmd_ptr;    char *str;    int len;    int result;    smpd_enter_fn(FCNAME);    cmd_ptr = (smpd_command_t*)MPIU_Malloc(sizeof(smpd_command_t));    if (cmd_ptr == NULL)    {	smpd_err_printf("unable to allocate memory for a command.\n");	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    memset(cmd_ptr, 0, sizeof(smpd_command_t));    smpd_init_command(cmd_ptr);    cmd_ptr->src = src;    cmd_ptr->dest = dest;    cmd_ptr->tag = smpd_process.cur_tag++;    if (strlen(cmd) >= SMPD_MAX_CMD_STR_LENGTH)    {	smpd_err_printf("command string too long: %s\n", cmd);	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    strcpy(cmd_ptr->cmd_str, cmd);    str = cmd_ptr->cmd;    len = SMPD_MAX_CMD_LENGTH;    result = MPIU_Str_add_string_arg(&str, &len, "cmd", cmd);    if (result != MPIU_STR_SUCCESS)    {	smpd_err_printf("unable to create the command.\n");	smpd_free_command(cmd_ptr);	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    result = MPIU_Str_add_int_arg(&str, &len, "src", src);    if (result != MPIU_STR_SUCCESS)    {	smpd_err_printf("unable to add the src to the command.\n");	smpd_free_command(cmd_ptr);	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    result = MPIU_Str_add_int_arg(&str, &len, "dest", dest);    if (result != MPIU_STR_SUCCESS)    {	smpd_err_printf("unable to add the dest to the command.\n");	smpd_free_command(cmd_ptr);	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    result = MPIU_Str_add_int_arg(&str, &len, "tag", cmd_ptr->tag);    if (result != MPIU_STR_SUCCESS)    {	smpd_err_printf("unable to add the tag to the command.\n");	smpd_free_command(cmd_ptr);	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    if (want_reply)    {	cmd_ptr->wait = SMPD_TRUE;    }    *cmd_pptr = cmd_ptr;    smpd_exit_fn(FCNAME);    return SMPD_SUCCESS;}#undef FCNAME#define FCNAME "smpd_create_command_copy"int smpd_create_command_copy(smpd_command_t *src_ptr, smpd_command_t **cmd_pptr){    smpd_command_t *cmd_ptr;    smpd_enter_fn(FCNAME);    cmd_ptr = (smpd_command_t*)MPIU_Malloc(sizeof(smpd_command_t));    if (cmd_ptr == NULL)    {	smpd_err_printf("unable to allocate memory for a command.\n");	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }        *cmd_ptr = *src_ptr;    *cmd_pptr = cmd_ptr;    smpd_exit_fn(FCNAME);    return SMPD_SUCCESS;}#undef FCNAME#define FCNAME "smpd_free_command"int smpd_free_command(smpd_command_t *cmd_ptr){    smpd_enter_fn(FCNAME);    if (cmd_ptr)    {	/* this check isn't full-proof because random data might match SMPD_FREE_COOKIE */	if (cmd_ptr->freed == SMPD_FREE_COOKIE)	{	    smpd_err_printf("attempt to free a command more than once.\n");	    smpd_exit_fn(FCNAME);	    return SMPD_FAIL;	}	/* erase the contents to help track down use of freed structures */	smpd_init_command(cmd_ptr);	cmd_ptr->freed = SMPD_FREE_COOKIE;	MPIU_Free(cmd_ptr); /* unfortunately, free probably erases the data making the cookie check ineffective */    }    smpd_exit_fn(FCNAME);    return SMPD_SUCCESS;}#undef FCNAME#define FCNAME "smpd_create_context"int smpd_create_context(smpd_context_type_t type, MPIDU_Sock_set_t set, MPIDU_Sock_t sock, int id, smpd_context_t **context_pptr){    int result;    smpd_context_t *context;        smpd_enter_fn(FCNAME);    context = (smpd_context_t*)MPIU_Malloc(sizeof(smpd_context_t));    if (context == NULL)    {	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    memset(context, 0, sizeof(smpd_context_t));    result = smpd_init_context(context, type, set, sock, id);

⌨️ 快捷键说明

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