📄 smpd_command.c
字号:
/* -*- 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 + -