blob: bda3f0eae8f38e87982956a7277cbe3b34bf3732 [file] [log] [blame] [edit]
/*
* 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 node_info_t to perl HV
*/
int
node_info_to_hv(node_info_t* node_info, HV* hv)
{
if(node_info->arch)
STORE_FIELD(hv, node_info, arch, charp);
STORE_FIELD(hv, node_info, cores, uint16_t);
STORE_FIELD(hv, node_info, cpus, uint16_t);
if(node_info->features)
STORE_FIELD(hv, node_info, features, charp);
if (node_info->name)
STORE_FIELD(hv, node_info, name, charp);
else {
Perl_warn (aTHX_ "node name missing in node_info_t");
return -1;
}
STORE_FIELD(hv, node_info, node_state, uint16_t);
if(node_info->os)
STORE_FIELD(hv, node_info, os, charp);
STORE_FIELD(hv, node_info, real_memory, uint32_t);
if(node_info->reason)
STORE_FIELD(hv, node_info, reason, charp);
STORE_FIELD(hv, node_info, sockets, uint16_t);
STORE_FIELD(hv, node_info, threads, uint16_t);
STORE_FIELD(hv, node_info, tmp_disk, uint32_t);
STORE_FIELD(hv, node_info, used_cpus, uint16_t);
STORE_FIELD(hv, node_info, weight, uint32_t);
return 0;
}
/*
* convert node_info_msg_t to perl HV
*/
int
node_info_msg_to_hv(node_info_msg_t* node_info_msg, HV* hv)
{
int i;
HV* hvp;
AV* avp;
STORE_FIELD(hv, node_info_msg, last_update, time_t);
/* record_count implied in node_array */
avp = newAV();
for(i = 0; i < node_info_msg->record_count; i ++) {
hvp =newHV();
if (node_info_to_hv(node_info_msg->node_array + i, hvp) < 0) {
SvREFCNT_dec((SV*)hvp);
SvREFCNT_dec((SV*)avp);
return -1;
}
av_store(avp, i, newRV_noinc((SV*)hvp));
}
hv_store_sv(hv, "node_array", newRV_noinc((SV*)avp));
return 0;
}
/*
* convert perl HV to update_node_msg_t
*/
int
hv_to_update_node_msg(HV* hv, update_node_msg_t *update_msg)
{
update_msg->node_names = NULL;
update_msg->features = NULL;
update_msg->reason = NULL;
update_msg->node_state = (uint16_t) NO_VAL;
update_msg->weight = (uint32_t) NO_VAL;
FETCH_FIELD(hv, update_msg, node_names, charp, TRUE);
FETCH_FIELD(hv, update_msg, node_state, uint16_t, FALSE);
FETCH_FIELD(hv, update_msg, reason, charp, FALSE);
FETCH_FIELD(hv, update_msg, features, charp, FALSE);
FETCH_FIELD(hv, update_msg, weight, uint32_t, FALSE);
return 0;
}