blob: f17beae5475be5e2e6cff79a9e2ffca2d9bf9b8d [file] [log] [blame]
/*
* node.c - convert data between node related messages and perl HVs
*/
#include <EXTERN.h>
#include <perl.h>
#include <XSUB.h>
#include <slurm/slurm.h>
#include "msg.h"
/*
* convert perl HV to slurm_step_ctx_params_t
*/
int
hv_to_slurm_step_ctx_params(HV* hv, slurm_step_ctx_params_t* params)
{
slurm_step_ctx_params_t_init(params);
FETCH_FIELD(hv, params, job_id, uint32_t, TRUE);
FETCH_FIELD(hv, params, uid, uint32_t, FALSE);
FETCH_FIELD(hv, params, name, charp, FALSE);
FETCH_FIELD(hv, params, node_count, uint32_t, FALSE);
FETCH_FIELD(hv, params, cpu_count, uint32_t, FALSE);
FETCH_FIELD(hv, params, task_count, uint32_t, FALSE);
FETCH_FIELD(hv, params, relative, uint16_t, FALSE);
FETCH_FIELD(hv, params, task_dist, uint16_t, FALSE);
FETCH_FIELD(hv, params, plane_size, uint16_t, FALSE);
FETCH_FIELD(hv, params, node_list, charp, FALSE);
FETCH_FIELD(hv, params, network, charp, FALSE);
FETCH_FIELD(hv, params, overcommit, bool, FALSE);
return 0;
}
/*
* convert perl HV to slurm_step_launch_params_t
*/
int
hv_to_slurm_step_launch_params(HV* hv, slurm_step_launch_params_t* params)
{
int i, num_keys;
STRLEN vlen;
I32 klen;
SV** svp;
HV* environ_hv;
AV* argv_av;
SV* val;
char *env_key, *env_val;
slurm_step_launch_params_t_init(params);
if((svp = hv_fetch(hv, "argv", 4, FALSE))) {
if(SvROK(*svp) && SvTYPE(SvRV(*svp)) == SVt_PVAV) {
argv_av = (AV*)SvRV(*svp);
params->argc = av_len(argv_av) + 1;
if (params->argc > 0) {
Newz(0, params->argv, params->argc + 1, char*);
for(i = 0; i < params->argc; i ++) {
if((svp = av_fetch(argv_av, i, FALSE)))
*(params->argv + i) = (char*) SvPV_nolen(*svp);
else {
Perl_warn(aTHX_ "error fetching `argv' of job descriptor");
free_slurm_step_launch_params_memory(params);
return -1;
}
}
}
} else {
Perl_warn(aTHX_ "`argv' of job descriptor is not an array reference");
return -1;
}
} else {
Perl_warn(aTHX_ "`argv' missing in step launching params");
return -1;
}
if((svp = hv_fetch(hv, "env", 3, FALSE))) {
if(SvROK(*svp) && SvTYPE(SvRV(*svp)) == SVt_PVHV) {
environ_hv = (HV*)SvRV(*svp);
num_keys = HvKEYS(environ_hv);
params->envc = num_keys;
Newz(0, params->env, num_keys + 1, char*);
hv_iterinit(environ_hv);
i = 0;
while((val = hv_iternextsv(environ_hv, &env_key, &klen))) {
env_val = SvPV(val, vlen);
Newz(0, (*(params->env + i)), klen + vlen + 2, char);
sprintf((*params->env + i), "%s=%s", env_key, env_val);
i ++;
}
}
else {
Perl_warn(aTHX_ "`env' of job descriptor is not a hash reference, ignored");
}
}
FETCH_FIELD(hv, params, cwd, charp, FALSE);
FETCH_FIELD(hv, params, user_managed_io, bool, FALSE);
FETCH_FIELD(hv, params, buffered_stdio, bool, FALSE);
FETCH_FIELD(hv, params, labelio, bool, FALSE);
FETCH_FIELD(hv, params, remote_output_filename, charp, FALSE);
FETCH_FIELD(hv, params, remote_error_filename, charp, FALSE);
FETCH_FIELD(hv, params, remote_input_filename, charp, FALSE);
/* TODO: local_fds */
FETCH_FIELD(hv, params, gid, uint32_t, FALSE);
FETCH_FIELD(hv, params, multi_prog, bool, FALSE);
FETCH_FIELD(hv, params, slurmd_debug, uint32_t, FALSE);
FETCH_FIELD(hv, params, parallel_debug, bool, FALSE);
FETCH_FIELD(hv, params, task_prolog, charp, FALSE);
FETCH_FIELD(hv, params, task_epilog, charp, FALSE);
FETCH_FIELD(hv, params, cpu_bind_type, uint16_t, FALSE);
FETCH_FIELD(hv, params, cpu_bind, charp, FALSE);
FETCH_FIELD(hv, params, mem_bind_type, uint16_t, FALSE);
FETCH_FIELD(hv, params, mem_bind, charp, FALSE);
FETCH_FIELD(hv, params, cpus_per_task, uint16_t, FALSE);
FETCH_FIELD(hv, params, ntasks_per_node, uint16_t, FALSE);
FETCH_FIELD(hv, params, ntasks_per_socket, uint16_t, FALSE);
FETCH_FIELD(hv, params, ntasks_per_core, uint16_t, FALSE);
FETCH_FIELD(hv, params, task_dist, uint16_t, FALSE);
FETCH_FIELD(hv, params, plane_size, uint16_t, FALSE);
FETCH_FIELD(hv, params, mpi_plugin_name, charp, FALSE);
return 0;
}
/*
* free allocated environment variable memory for job_desc_msg_t
*/
static void
_free_env(char** environ)
{
int i;
if(! environ)
return;
for(i = 0; *(environ + i) ; i ++)
Safefree(*(environ + i));
Safefree(environ);
}
/*
* free allocate memory for job_desc_msg_t
*/
void
free_slurm_step_launch_params_memory(slurm_step_launch_params_t *params)
{
_free_env(params->env);
if (params->argv)
Safefree (params->argv);
}