| /* |
| * 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; |
| } |
| |