2
* partition.c - convert data between partition related messages and perl HVs
10
#include <slurm/slurm.h>
11
#include "slurm-perl.h"
14
* convert partition_info_t to perl HV
17
partition_info_to_hv(partition_info_t *part_info, HV *hv)
19
if (part_info->allow_alloc_nodes)
20
STORE_FIELD(hv, part_info, allow_alloc_nodes, charp);
21
if (part_info->allow_groups)
22
STORE_FIELD(hv, part_info, allow_groups, charp);
23
if (part_info->alternate)
24
STORE_FIELD(hv, part_info, alternate, charp);
25
STORE_FIELD(hv, part_info, default_time, uint32_t);
26
STORE_FIELD(hv, part_info, flags, uint16_t);
27
STORE_FIELD(hv, part_info, max_nodes, uint32_t);
28
STORE_FIELD(hv, part_info, max_share, uint16_t);
29
STORE_FIELD(hv, part_info, max_time, uint32_t);
30
STORE_FIELD(hv, part_info, min_nodes, uint32_t);
32
STORE_FIELD(hv, part_info, name, charp);
34
Perl_warn(aTHX_ "partition name missing in partition_info_t");
37
/* no store for int pointers yet */
38
if (part_info->node_inx) {
41
for(j = 0; ; j += 2) {
42
if(part_info->node_inx[j] == -1)
44
av_store(av, j, newSVuv(part_info->node_inx[j]));
45
av_store(av, j+1, newSVuv(part_info->node_inx[j+1]));
47
hv_store_sv(hv, "node_inx", newRV_noinc((SV*)av));
51
STORE_FIELD(hv, part_info, nodes, charp);
52
STORE_FIELD(hv, part_info, preempt_mode, uint16_t);
53
STORE_FIELD(hv, part_info, priority, uint16_t);
54
STORE_FIELD(hv, part_info, state_up, uint16_t);
55
STORE_FIELD(hv, part_info, total_cpus, uint32_t);
56
STORE_FIELD(hv, part_info, total_nodes, uint32_t);
62
* convert perl HV to partition_info_t
65
hv_to_partition_info(HV *hv, partition_info_t *part_info)
71
memset(part_info, 0, sizeof(partition_info_t));
73
FETCH_FIELD(hv, part_info, allow_alloc_nodes, charp, FALSE);
74
FETCH_FIELD(hv, part_info, allow_groups, charp, FALSE);
75
FETCH_FIELD(hv, part_info, alternate, charp, FALSE);
76
FETCH_FIELD(hv, part_info, default_time, uint32_t, TRUE);
77
FETCH_FIELD(hv, part_info, flags, uint16_t, TRUE);
78
FETCH_FIELD(hv, part_info, max_nodes, uint32_t, TRUE);
79
FETCH_FIELD(hv, part_info, max_share, uint16_t, TRUE);
80
FETCH_FIELD(hv, part_info, max_time, uint32_t, TRUE);
81
FETCH_FIELD(hv, part_info, min_nodes, uint32_t, TRUE);
82
FETCH_FIELD(hv, part_info, name, charp, TRUE);
83
FETCH_FIELD(hv, part_info, name, charp, TRUE);
84
svp = hv_fetch(hv, "node_inx", 8, FALSE);
85
if (svp && SvROK(*svp) && SvTYPE(SvRV(*svp)) == SVt_PVAV) {
87
n = av_len(av) + 2; /* for trailing -1 */
88
part_info->node_inx = xmalloc(n * sizeof(int));
89
for (i = 0 ; i < n-1; i += 2) {
90
part_info->node_inx[i] = (int)SvIV(*(av_fetch(av, i, FALSE)));
91
part_info->node_inx[i+1] = (int)SvIV(*(av_fetch(av, i+1 ,FALSE)));
93
part_info->node_inx[n-1] = -1;
97
FETCH_FIELD(hv, part_info, nodes, charp, FALSE);
98
FETCH_FIELD(hv, part_info, preempt_mode, uint16_t, TRUE);
99
FETCH_FIELD(hv, part_info, priority, uint16_t, TRUE);
100
FETCH_FIELD(hv, part_info, state_up, uint16_t, TRUE);
101
FETCH_FIELD(hv, part_info, total_cpus, uint32_t, TRUE);
102
FETCH_FIELD(hv, part_info, total_nodes, uint32_t, TRUE);
107
* convert partition_info_msg_t to perl HV
110
partition_info_msg_to_hv(partition_info_msg_t *part_info_msg, HV *hv)
116
STORE_FIELD(hv, part_info_msg, last_update, time_t);
117
/* record_count implied in partition_array */
119
for(i = 0; i < part_info_msg->record_count; i ++) {
121
if (partition_info_to_hv(part_info_msg->partition_array + i, hv_info)
123
SvREFCNT_dec(hv_info);
127
av_store(av, i, newRV_noinc((SV*)hv_info));
129
hv_store_sv(hv, "partition_array", newRV_noinc((SV*)av));
134
* convert perl HV to partition_info_msg_t
137
hv_to_partition_info_msg(HV *hv, partition_info_msg_t *part_info_msg)
143
memset(part_info_msg, 0, sizeof(partition_info_msg_t));
145
FETCH_FIELD(hv, part_info_msg, last_update, time_t, TRUE);
146
svp = hv_fetch(hv, "partition_array", 15, TRUE);
147
if (! (svp && SvROK(*svp) && SvTYPE(SvRV(*svp)) == SVt_PVAV)) {
148
Perl_warn (aTHX_ "partition_array is not an array reference in HV for partition_info_msg_t");
152
av = (AV*)SvRV(*svp);
154
part_info_msg->record_count = n;
156
part_info_msg->partition_array = xmalloc(n * sizeof(partition_info_t));
157
for (i = 0; i < n; i ++) {
158
svp = av_fetch(av, i, FALSE);
159
if (! (svp && SvROK(*svp) && SvTYPE(SvRV(*svp)) == SVt_PVHV)) {
160
Perl_warn (aTHX_ "element %d in partition_array is not valid", i);
163
if (hv_to_partition_info((HV*)SvRV(*svp), &part_info_msg->partition_array[i]) < 0) {
164
Perl_warn (aTHX_ "failed to convert element %d in partition_array", i);
172
* convert perl HV to update_part_msg_t
175
hv_to_update_part_msg(HV *hv, update_part_msg_t *part_msg)
177
slurm_init_part_desc_msg(part_msg);
179
FETCH_FIELD(hv, part_msg, allow_alloc_nodes, charp, FALSE);
180
FETCH_FIELD(hv, part_msg, allow_groups, charp, FALSE);
181
FETCH_FIELD(hv, part_msg, default_time, uint32_t, FALSE);
182
FETCH_FIELD(hv, part_msg, flags, uint16_t, FALSE);
183
FETCH_FIELD(hv, part_msg, max_nodes, uint32_t, FALSE);
184
FETCH_FIELD(hv, part_msg, max_share, uint16_t, FALSE);
185
FETCH_FIELD(hv, part_msg, max_time, uint32_t, FALSE);
186
FETCH_FIELD(hv, part_msg, min_nodes, uint32_t, FALSE);
187
FETCH_FIELD(hv, part_msg, name, charp, TRUE);
188
/*not used node_inx */
189
FETCH_FIELD(hv, part_msg, nodes, charp, FALSE);
190
FETCH_FIELD(hv, part_msg, priority, uint16_t, FALSE);
191
FETCH_FIELD(hv, part_msg, state_up, uint16_t, FALSE);
192
FETCH_FIELD(hv, part_msg, total_cpus, uint32_t, FALSE);
193
FETCH_FIELD(hv, part_msg, total_nodes, uint32_t, FALSE);
198
* convert perl HV to delete_part_msg_t
201
hv_to_delete_part_msg(HV *hv, delete_part_msg_t *delete_msg)
203
FETCH_FIELD(hv, delete_msg, name, charp, TRUE);