8736a1c138
http://www.open-mpi.org/community/lists/devel/2014/05/14822.php Revamp the ORTE global data structures to reduce memory footprint and add new features. Add ability to control/set cpu frequency, though this can only be done if the sys admin has setup the system to support it (or you run as root). This commit was SVN r31916.
151 строка
4.9 KiB
C
151 строка
4.9 KiB
C
/*
|
|
* Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
|
|
* University Research and Technology
|
|
* Corporation. All rights reserved.
|
|
* Copyright (c) 2004-2008 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 (c) 2008 Sun Microsystems, Inc. All rights reserved.
|
|
* Copyright (c) 2008-2010 Cisco Systems, Inc. All rights reserved.
|
|
* Copyright (c) 2014 Intel, Inc. All rights reserved.
|
|
* $COPYRIGHT$
|
|
*
|
|
* Additional copyrights may follow
|
|
*
|
|
* $HEADER$
|
|
*/
|
|
#include "orte_config.h"
|
|
#include "orte/constants.h"
|
|
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#ifdef HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
#endif
|
|
#ifdef HAVE_SYS_TYPES_H
|
|
#include <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_SYS_STAT_H
|
|
#include <sys/stat.h>
|
|
#endif
|
|
#ifdef HAVE_SYS_PARAM_H
|
|
#include <sys/param.h>
|
|
#endif
|
|
#ifdef HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
#endif
|
|
#ifdef HAVE_NETDB_H
|
|
#include <netdb.h>
|
|
#endif
|
|
#include <errno.h>
|
|
|
|
#include "opal/util/basename.h"
|
|
#include "opal/util/path.h"
|
|
#include "opal/util/opal_environ.h"
|
|
|
|
#include "orte/runtime/orte_globals.h"
|
|
|
|
#include "orte/util/context_fns.h"
|
|
|
|
int orte_util_check_context_cwd(orte_app_context_t *context,
|
|
bool want_chdir)
|
|
{
|
|
bool good = true;
|
|
const char *tmp;
|
|
|
|
/* If we want to chdir and the chdir fails (for any reason -- such
|
|
as if the dir doesn't exist, it isn't a dir, we don't have
|
|
permissions, etc.), then set good to false. */
|
|
if (want_chdir && 0 != chdir(context->cwd)) {
|
|
good = false;
|
|
}
|
|
|
|
/* If either of the above failed, go into this block */
|
|
if (!good) {
|
|
/* See if the directory was a user-specified directory. If it
|
|
was, barf because they specifically asked for something we
|
|
can't provide. */
|
|
if (orte_get_attribute(&context->attributes, ORTE_APP_USER_CWD,
|
|
NULL, OPAL_BOOL)) {
|
|
return ORTE_ERR_WDIR_NOT_FOUND;
|
|
}
|
|
|
|
/* If the user didn't specifically ask for it, then it
|
|
was a system-supplied default directory, so it's ok
|
|
to not go there. Try to go to the $HOME directory
|
|
instead. */
|
|
tmp = opal_home_directory();
|
|
if (NULL != tmp) {
|
|
/* Try $HOME. Same test as above. */
|
|
good = true;
|
|
if (want_chdir && 0 != chdir(tmp)) {
|
|
good = false;
|
|
}
|
|
if (!good) {
|
|
return ORTE_ERR_WDIR_NOT_FOUND;
|
|
}
|
|
|
|
/* Reset the pwd in this local copy of the
|
|
context */
|
|
if (NULL != context->cwd) free(context->cwd);
|
|
context->cwd = strdup(tmp);
|
|
}
|
|
|
|
/* If we couldn't find $HOME, then just take whatever
|
|
the default directory is -- assumedly there *is*
|
|
one, or we wouldn't be running... */
|
|
}
|
|
|
|
/* All happy */
|
|
return ORTE_SUCCESS;
|
|
}
|
|
|
|
int orte_util_check_context_app(orte_app_context_t *context, char **env)
|
|
{
|
|
char *tmp;
|
|
|
|
/* If the app is a naked filename, we need to do a path search for
|
|
it. orterun will send in whatever the user specified (e.g.,
|
|
"orterun -np 2 uptime"), so in some cases, we need to search
|
|
the path to verify that we can find it. Here's the
|
|
possibilities:
|
|
|
|
1. The user specified an absolute pathname for the executable.
|
|
We simply need to verify that it exists and we can run it.
|
|
|
|
2. The user specified a relative pathname for the executable.
|
|
Ditto with #1 -- based on the cwd, we need to verify that it
|
|
exists and we can run it.
|
|
|
|
3. The user specified a naked filename. We need to search the
|
|
path, find a match, and verify that we can run it.
|
|
|
|
Note that in some cases, we won't be doing this work here --
|
|
bproc, for example, does not use the fork pls for launching, so
|
|
it does this same work over there. */
|
|
|
|
tmp = opal_basename(context->argv[0]);
|
|
if (strlen(tmp) == strlen(context->argv[0])) {
|
|
/* If this is a naked executable -- no relative or absolute
|
|
pathname -- then search the PATH for it */
|
|
free(tmp);
|
|
tmp = opal_path_findv(context->argv[0], X_OK, env, context->cwd);
|
|
if (NULL == tmp) {
|
|
return ORTE_ERR_EXE_NOT_FOUND;
|
|
}
|
|
if (NULL != context->app) free(context->app);
|
|
context->app = tmp;
|
|
} else {
|
|
if (0 != access(context->app, X_OK)) {
|
|
return ORTE_ERR_EXE_NOT_ACCESSIBLE;
|
|
}
|
|
}
|
|
|
|
/* All was good */
|
|
return ORTE_SUCCESS;
|
|
}
|