| @@ -0,0 +1,16 @@ | |||
| package slurm | |||
| /* | |||
| #cgo LDFLAGS: -lslurm | |||
| #include <stdio.h> | |||
| #include <stdlib.h> | |||
| #include <stdint.h> | |||
| #include<slurm/slurm.h> | |||
| #include<slurm/slurm_errno.h> | |||
| */ | |||
| import "C" | |||
| func GetErrorString(errno uint32) string { | |||
| msg := C.GoString(C.slurm_strerror(C.int(errno))) | |||
| return msg | |||
| } | |||
| @@ -0,0 +1,227 @@ | |||
| package slurm | |||
| /* | |||
| #cgo LDFLAGS: -lslurm | |||
| #include <stdio.h> | |||
| #include <stdlib.h> | |||
| #include <stdint.h> | |||
| #include<slurm/slurm.h> | |||
| #include<slurm/slurm_errno.h> | |||
| inline uint8_t uint8_ptr(uint8_t* pointer) { | |||
| if (NULL == pointer) { | |||
| return -1;} | |||
| return *pointer; | |||
| } | |||
| inline int8_t int8_ptr(int8_t* pointer) { | |||
| if (NULL == pointer) { | |||
| return -1;} | |||
| return *pointer; | |||
| } | |||
| inline uint16_t uint16_ptr(uint16_t* pointer) { | |||
| if (NULL == pointer) { | |||
| return -1;} | |||
| return *pointer; | |||
| } | |||
| inline int16_t int16_ptr(int16_t* pointer) { | |||
| if (NULL == pointer) { | |||
| return -1;} | |||
| return *pointer; | |||
| } | |||
| inline uint32_t uint32_ptr(uint32_t* pointer) { | |||
| if (NULL == pointer) { | |||
| return -1;} | |||
| return *pointer; | |||
| } | |||
| inline int32_t int32_ptr(int32_t* pointer) { | |||
| if (NULL == pointer) { | |||
| return -1;} | |||
| return *pointer; | |||
| } | |||
| inline uint64_t uint64_ptr(uint64_t* pointer) { | |||
| if (NULL == pointer) { | |||
| return -1;} | |||
| return *pointer; | |||
| } | |||
| inline int64_t int64_ptr(int16_t* pointer) { | |||
| if (NULL == pointer) { | |||
| return -1;} | |||
| return *pointer; | |||
| } | |||
| */ | |||
| import "C" | |||
| func Job_info_convert_c_to_go(c_struct *C.struct_job_info) Job_info { | |||
| var go_struct Job_info | |||
| go_struct.account = C.GoString(c_struct.account) | |||
| go_struct.alloc_node = C.GoString(c_struct.alloc_node) | |||
| go_struct.alloc_sid = uint32(c_struct.alloc_sid) | |||
| go_struct.array_job_id = uint32(c_struct.array_job_id) | |||
| go_struct.array_task_id = uint16(c_struct.array_task_id) | |||
| go_struct.assoc_id = uint32(c_struct.assoc_id) | |||
| go_struct.batch_flag = uint16(c_struct.batch_flag) | |||
| go_struct.batch_host = C.GoString(c_struct.batch_host) | |||
| go_struct.boards_per_node = uint16(c_struct.boards_per_node) | |||
| go_struct.batch_script = C.GoString(c_struct.batch_script) | |||
| go_struct.command = C.GoString(c_struct.command) | |||
| go_struct.comment = C.GoString(c_struct.comment) | |||
| go_struct.contiguous = uint16(c_struct.contiguous) | |||
| go_struct.cores_per_socket = uint16(c_struct.cores_per_socket) | |||
| go_struct.cpus_per_task = uint16(c_struct.cpus_per_task) | |||
| go_struct.dependency = C.GoString(c_struct.dependency) | |||
| go_struct.derived_ec = uint32(c_struct.derived_ec) | |||
| go_struct.eligible_time = int64(c_struct.eligible_time) | |||
| go_struct.end_time = int64(c_struct.end_time) | |||
| go_struct.exc_nodes = C.GoString(c_struct.exc_nodes) | |||
| go_struct.exc_node_inx = int32(C.int32_ptr(c_struct.exc_node_inx)) | |||
| go_struct.exit_code = uint32(c_struct.exit_code) | |||
| go_struct.features = C.GoString(c_struct.features) | |||
| go_struct.group_id = uint32(c_struct.group_id) | |||
| go_struct.gres = C.GoString(c_struct.gres) | |||
| go_struct.job_id = uint32(c_struct.job_id) | |||
| go_struct.job_state = uint16(c_struct.job_state) | |||
| go_struct.licenses = C.GoString(c_struct.licenses) | |||
| go_struct.max_cpus = uint32(c_struct.max_cpus) | |||
| go_struct.max_nodes = uint32(c_struct.max_nodes) | |||
| go_struct.name = C.GoString(c_struct.name) | |||
| go_struct.network = C.GoString(c_struct.network) | |||
| go_struct.nodes = C.GoString(c_struct.nodes) | |||
| go_struct.nice = uint16(c_struct.nice) | |||
| go_struct.node_inx = int32(C.int32_ptr(c_struct.node_inx)) | |||
| go_struct.ntasks_per_core = uint16(c_struct.ntasks_per_core) | |||
| go_struct.ntasks_per_node = uint16(c_struct.ntasks_per_node) | |||
| go_struct.ntasks_per_socket = uint16(c_struct.ntasks_per_socket) | |||
| go_struct.ntasks_per_board = uint16(c_struct.ntasks_per_board) | |||
| go_struct.num_cpus = uint32(c_struct.num_cpus) | |||
| go_struct.num_nodes = uint32(c_struct.num_nodes) | |||
| go_struct.partition = C.GoString(c_struct.partition) | |||
| go_struct.pn_min_memory = uint32(c_struct.pn_min_memory) | |||
| go_struct.pn_min_cpus = uint16(c_struct.pn_min_cpus) | |||
| go_struct.pn_min_tmp_disk = uint32(c_struct.pn_min_tmp_disk) | |||
| go_struct.preempt_time = int64(c_struct.preempt_time) | |||
| go_struct.pre_sus_time = int64(c_struct.pre_sus_time) | |||
| go_struct.priority = uint32(c_struct.priority) | |||
| go_struct.profile = uint32(c_struct.profile) | |||
| go_struct.qos = C.GoString(c_struct.qos) | |||
| go_struct.req_nodes = C.GoString(c_struct.req_nodes) | |||
| go_struct.req_node_inx = int32(C.int32_ptr(c_struct.req_node_inx)) | |||
| go_struct.req_switch = uint32(c_struct.req_switch) | |||
| go_struct.requeue = uint16(c_struct.requeue) | |||
| go_struct.resize_time = int64(c_struct.resize_time) | |||
| go_struct.restart_cnt = uint16(c_struct.restart_cnt) | |||
| go_struct.resv_name = C.GoString(c_struct.resv_name) | |||
| go_struct.shared = uint16(c_struct.shared) | |||
| go_struct.show_flags = uint16(c_struct.show_flags) | |||
| go_struct.sockets_per_board = uint16(c_struct.sockets_per_board) | |||
| go_struct.sockets_per_node = uint16(c_struct.sockets_per_node) | |||
| go_struct.start_time = int64(c_struct.start_time) | |||
| go_struct.state_desc = C.GoString(c_struct.state_desc) | |||
| go_struct.state_reason = uint16(c_struct.state_reason) | |||
| go_struct.submit_time = int64(c_struct.submit_time) | |||
| go_struct.suspend_time = int64(c_struct.suspend_time) | |||
| go_struct.time_limit = uint32(c_struct.time_limit) | |||
| go_struct.time_min = uint32(c_struct.time_min) | |||
| go_struct.threads_per_core = uint16(c_struct.threads_per_core) | |||
| go_struct.user_id = uint32(c_struct.user_id) | |||
| go_struct.wait4switch = uint32(c_struct.wait4switch) | |||
| go_struct.wckey = C.GoString(c_struct.wckey) | |||
| go_struct.work_dir = C.GoString(c_struct.work_dir) | |||
| return go_struct | |||
| } | |||
| func Job_descriptor_convert_c_to_go(c_struct *C.struct_job_descriptor) Job_descriptor { | |||
| var go_struct Job_descriptor | |||
| go_struct.Account = C.GoString(c_struct.account) | |||
| go_struct.Acctg_freq = C.GoString(c_struct.acctg_freq) | |||
| go_struct.Alloc_node = C.GoString(c_struct.alloc_node) | |||
| go_struct.Alloc_resp_port = uint16(c_struct.alloc_resp_port) | |||
| go_struct.Alloc_sid = uint32(c_struct.alloc_sid) | |||
| go_struct.Argc = uint32(c_struct.argc) | |||
| go_struct.Array_inx = C.GoString(c_struct.array_inx) | |||
| go_struct.Begin_time = int64(c_struct.begin_time) | |||
| go_struct.Ckpt_interval = uint16(c_struct.ckpt_interval) | |||
| go_struct.Ckpt_dir = C.GoString(c_struct.ckpt_dir) | |||
| go_struct.Comment = C.GoString(c_struct.comment) | |||
| go_struct.Contiguous = uint16(c_struct.contiguous) | |||
| go_struct.Cpu_bind = C.GoString(c_struct.cpu_bind) | |||
| go_struct.Cpu_bind_type = uint16(c_struct.cpu_bind_type) | |||
| go_struct.Dependency = C.GoString(c_struct.dependency) | |||
| go_struct.End_time = int64(c_struct.end_time) | |||
| go_struct.Env_size = uint32(c_struct.env_size) | |||
| go_struct.Exc_nodes = C.GoString(c_struct.exc_nodes) | |||
| go_struct.Features = C.GoString(c_struct.features) | |||
| go_struct.Group_id = uint32(c_struct.group_id) | |||
| go_struct.Immediate = uint16(c_struct.immediate) | |||
| go_struct.Job_id = uint32(c_struct.job_id) | |||
| go_struct.Kill_on_node_fail = uint16(c_struct.kill_on_node_fail) | |||
| go_struct.Licenses = C.GoString(c_struct.licenses) | |||
| go_struct.Mail_type = uint16(c_struct.mail_type) | |||
| go_struct.Mail_user = C.GoString(c_struct.mail_user) | |||
| go_struct.Mem_bind = C.GoString(c_struct.mem_bind) | |||
| go_struct.Mem_bind_type = uint16(c_struct.mem_bind_type) | |||
| go_struct.Name = C.GoString(c_struct.name) | |||
| go_struct.Network = C.GoString(c_struct.network) | |||
| go_struct.Nice = uint16(c_struct.nice) | |||
| go_struct.Num_tasks = uint32(c_struct.num_tasks) | |||
| go_struct.Open_mode = uint8(c_struct.open_mode) | |||
| go_struct.Other_port = uint16(c_struct.other_port) | |||
| go_struct.Overcommit = uint8(c_struct.overcommit) | |||
| go_struct.Partition = C.GoString(c_struct.partition) | |||
| go_struct.Plane_size = uint16(c_struct.plane_size) | |||
| go_struct.Priority = uint32(c_struct.priority) | |||
| go_struct.Profile = uint32(c_struct.profile) | |||
| go_struct.Qos = C.GoString(c_struct.qos) | |||
| go_struct.Reboot = uint16(c_struct.reboot) | |||
| go_struct.Resp_host = C.GoString(c_struct.resp_host) | |||
| go_struct.Req_nodes = C.GoString(c_struct.req_nodes) | |||
| go_struct.Requeue = uint16(c_struct.requeue) | |||
| go_struct.Reservation = C.GoString(c_struct.reservation) | |||
| go_struct.Script = C.GoString(c_struct.script) | |||
| go_struct.Shared = uint16(c_struct.shared) | |||
| go_struct.Spank_job_env_size = uint32(c_struct.spank_job_env_size) | |||
| go_struct.Task_dist = uint16(c_struct.task_dist) | |||
| go_struct.Time_limit = uint32(c_struct.time_limit) | |||
| go_struct.Time_min = uint32(c_struct.time_min) | |||
| go_struct.User_id = uint32(c_struct.user_id) | |||
| go_struct.Wait_all_nodes = uint16(c_struct.wait_all_nodes) | |||
| go_struct.Warn_signal = uint16(c_struct.warn_signal) | |||
| go_struct.Warn_time = uint16(c_struct.warn_time) | |||
| go_struct.Work_dir = C.GoString(c_struct.work_dir) | |||
| go_struct.Cpus_per_task = uint16(c_struct.cpus_per_task) | |||
| go_struct.Min_cpus = uint32(c_struct.min_cpus) | |||
| go_struct.Max_cpus = uint32(c_struct.max_cpus) | |||
| go_struct.Min_nodes = uint32(c_struct.min_nodes) | |||
| go_struct.Max_nodes = uint32(c_struct.max_nodes) | |||
| go_struct.Boards_per_node = uint16(c_struct.boards_per_node) | |||
| go_struct.Sockets_per_board = uint16(c_struct.sockets_per_board) | |||
| go_struct.Sockets_per_node = uint16(c_struct.sockets_per_node) | |||
| go_struct.Cores_per_socket = uint16(c_struct.cores_per_socket) | |||
| go_struct.Threads_per_core = uint16(c_struct.threads_per_core) | |||
| go_struct.Ntasks_per_node = uint16(c_struct.ntasks_per_node) | |||
| go_struct.Ntasks_per_socket = uint16(c_struct.ntasks_per_socket) | |||
| go_struct.Ntasks_per_core = uint16(c_struct.ntasks_per_core) | |||
| go_struct.Ntasks_per_board = uint16(c_struct.ntasks_per_board) | |||
| go_struct.Pn_min_cpus = uint16(c_struct.pn_min_cpus) | |||
| go_struct.Pn_min_memory = uint32(c_struct.pn_min_memory) | |||
| go_struct.Pn_min_tmp_disk = uint32(c_struct.pn_min_tmp_disk) | |||
| go_struct.Req_switch = uint32(c_struct.req_switch) | |||
| go_struct.Std_err = C.GoString(c_struct.std_err) | |||
| go_struct.Std_in = C.GoString(c_struct.std_in) | |||
| go_struct.Std_out = C.GoString(c_struct.std_out) | |||
| go_struct.Wait4switch = uint32(c_struct.wait4switch) | |||
| go_struct.Wckey = C.GoString(c_struct.wckey) | |||
| return go_struct | |||
| } | |||
| func submit_response_msg_convert_c_to_go(c_struct *C.struct_submit_response_msg) Submit_response_msg { | |||
| var go_struct Submit_response_msg | |||
| go_struct.Job_id = uint32(c_struct.job_id) | |||
| go_struct.Step_id = uint32(c_struct.step_id) | |||
| go_struct.Error_code = uint32(c_struct.error_code) | |||
| return go_struct | |||
| } | |||
| @@ -0,0 +1,94 @@ | |||
| package slurm | |||
| /* | |||
| #cgo LDFLAGS: -lslurm | |||
| #include <stdio.h> | |||
| #include <stdlib.h> | |||
| #include <stdint.h> | |||
| #include<slurm/slurm.h> | |||
| #include<slurm/slurm_errno.h> | |||
| struct job_info_msg *get_job_info(){ | |||
| struct job_info_msg* job_buffer; | |||
| if(slurm_load_jobs ((time_t) NULL, | |||
| &job_buffer, SHOW_ALL)) { | |||
| return NULL; | |||
| } | |||
| return job_buffer; | |||
| } | |||
| struct job_info* job_from_list(struct job_info_msg *list, int i){ | |||
| return &list->job_array[i]; | |||
| } | |||
| struct job_info_msg *get_single_job_info(uint32_t id){ | |||
| struct job_info_msg* job_buffer; | |||
| if( slurm_load_job (&job_buffer, id, SHOW_DETAIL)) { | |||
| return NULL; | |||
| } | |||
| return job_buffer; | |||
| } | |||
| //static time_t last_update_time = (time_t) NULL; | |||
| //int error_code; | |||
| //job_info_msg_t * job_info_msg_ptr = NULL; | |||
| // | |||
| //error_code = slurm_load_jobs (last_update_time, &job_info_msg_ptr, 1); | |||
| //if (error_code) { | |||
| // slurm_perror ("slurm_load_jobs"); | |||
| // return (error_code); | |||
| //} | |||
| // | |||
| //slurm_print_job_info_msg ( stdout, job_info_msg_ptr, 1 ) ; | |||
| // | |||
| //slurm_free_job_info_msg ( job_info_msg_ptr ) ; | |||
| */ | |||
| import "C" | |||
| func Get_all_jobs() Job_info_msg { | |||
| var go_job_buffer Job_info_msg | |||
| c_job_buffer := C.get_job_info() | |||
| if c_job_buffer == nil { | |||
| go_job_buffer.Last_update = int64(0) | |||
| go_job_buffer.Record_count = uint32(0) | |||
| go_job_buffer.Job_list = nil | |||
| return go_job_buffer | |||
| } | |||
| go_job_buffer.Last_update = int64(c_job_buffer.last_update) | |||
| go_job_buffer.Record_count = uint32(c_job_buffer.record_count) | |||
| go_job_buffer.Job_list = make([]Job_info, c_job_buffer.record_count, c_job_buffer.record_count) | |||
| for i := uint32(0); i < go_job_buffer.Record_count; i++ { | |||
| job := C.job_from_list(c_job_buffer, C.int(i)) | |||
| go_job := Job_info_convert_c_to_go(job) | |||
| go_job_buffer.Job_list[i] = go_job | |||
| } | |||
| C.slurm_free_job_info_msg(c_job_buffer) | |||
| return go_job_buffer | |||
| } | |||
| func Get_job(id uint32) Job_info_msg { | |||
| var go_job_buffer Job_info_msg | |||
| c_job_buffer := C.get_single_job_info(C.uint32_t(id)) | |||
| if c_job_buffer == nil { | |||
| go_job_buffer.Last_update = int64(0) | |||
| go_job_buffer.Record_count = uint32(0) | |||
| go_job_buffer.Job_list = nil | |||
| return go_job_buffer | |||
| } | |||
| go_job_buffer.Last_update = int64(c_job_buffer.last_update) | |||
| go_job_buffer.Record_count = uint32(c_job_buffer.record_count) | |||
| go_job_buffer.Job_list = make([]Job_info, c_job_buffer.record_count, c_job_buffer.record_count) | |||
| for i := uint32(0); i < go_job_buffer.Record_count; i++ { | |||
| job := C.job_from_list(c_job_buffer, C.int(i)) | |||
| go_job := Job_info_convert_c_to_go(job) | |||
| go_job_buffer.Job_list[i] = go_job | |||
| } | |||
| C.slurm_free_job_info_msg(c_job_buffer) | |||
| return go_job_buffer | |||
| } | |||
| @@ -0,0 +1,367 @@ | |||
| package slurm | |||
| /* | |||
| #cgo LDFLAGS: -lslurm | |||
| #include <stdio.h> | |||
| #include <stdlib.h> | |||
| #include <stdint.h> | |||
| #include<slurm/slurm.h> | |||
| #include<slurm/slurm_errno.h> | |||
| struct submit_response_msg *submit_job(struct job_descriptor *desc) | |||
| { | |||
| struct submit_response_msg *resp_msg; | |||
| if (slurm_submit_batch_job(desc, | |||
| &resp_msg)) { | |||
| return NULL; | |||
| } | |||
| return resp_msg; | |||
| } | |||
| void free_submit_response_msg(struct submit_response_msg *msg) | |||
| { | |||
| slurm_free_submit_response_response_msg(msg); | |||
| } | |||
| */ | |||
| import "C" | |||
| import ( | |||
| "fmt" | |||
| "unsafe" | |||
| ) | |||
| func Submit_job(go_struct *Job_descriptor) Submit_response_msg { | |||
| var c_struct C.struct_job_descriptor | |||
| C.slurm_init_job_desc_msg(&c_struct) | |||
| if go_struct.Account != "" { | |||
| account_s := C.CString(go_struct.Account) | |||
| defer C.free(unsafe.Pointer(account_s)) | |||
| c_struct.account = account_s | |||
| } | |||
| if go_struct.Acctg_freq != "" { | |||
| acctg_freq_s := C.CString(go_struct.Acctg_freq) | |||
| defer C.free(unsafe.Pointer(acctg_freq_s)) | |||
| c_struct.acctg_freq = acctg_freq_s | |||
| } | |||
| if go_struct.Alloc_node != "" { | |||
| alloc_node_s := C.CString(go_struct.Alloc_node) | |||
| defer C.free(unsafe.Pointer(alloc_node_s)) | |||
| c_struct.alloc_node = alloc_node_s | |||
| } | |||
| if go_struct.Alloc_resp_port != 0 { | |||
| c_struct.alloc_resp_port = C.uint16_t(go_struct.Alloc_resp_port) | |||
| } | |||
| if go_struct.Alloc_sid != 0 { | |||
| c_struct.alloc_sid = C.uint32_t(go_struct.Alloc_sid) | |||
| } | |||
| if len(go_struct.Argv) > 0 { | |||
| c_struct.argc = C.uint32_t(len(go_struct.Argv)) | |||
| cArray := C.malloc(C.size_t(C.size_t(len(go_struct.Argv)) * C.size_t(unsafe.Sizeof(uintptr(0))))) | |||
| a := (*[1<<30 - 1]*C.char)(cArray) | |||
| for i := 0; i < len(go_struct.Argv); i++ { | |||
| a[i] = C.CString(go_struct.Argv[i]) | |||
| } | |||
| c_struct.argv = (**C.char)(cArray) | |||
| fmt.Printf("test\n") | |||
| } | |||
| if go_struct.Array_inx != "" { | |||
| array_inx_s := C.CString(go_struct.Array_inx) | |||
| defer C.free(unsafe.Pointer(array_inx_s)) | |||
| c_struct.array_inx = array_inx_s | |||
| } | |||
| if go_struct.Begin_time != 0 { | |||
| c_struct.begin_time = C.int64_t(go_struct.Begin_time) | |||
| } | |||
| if go_struct.Ckpt_interval != 0 { | |||
| c_struct.ckpt_interval = C.uint16_t(go_struct.Ckpt_interval) | |||
| } | |||
| if go_struct.Ckpt_dir != "" { | |||
| ckpt_dir_s := C.CString(go_struct.Ckpt_dir) | |||
| defer C.free(unsafe.Pointer(ckpt_dir_s)) | |||
| c_struct.ckpt_dir = ckpt_dir_s | |||
| } | |||
| if go_struct.Comment != "" { | |||
| comment_s := C.CString(go_struct.Comment) | |||
| defer C.free(unsafe.Pointer(comment_s)) | |||
| c_struct.comment = comment_s | |||
| } | |||
| if go_struct.Contiguous != 0 { | |||
| c_struct.contiguous = C.uint16_t(go_struct.Contiguous) | |||
| } | |||
| if go_struct.Cpu_bind != "" { | |||
| cpu_bind_s := C.CString(go_struct.Cpu_bind) | |||
| defer C.free(unsafe.Pointer(cpu_bind_s)) | |||
| c_struct.cpu_bind = cpu_bind_s | |||
| } | |||
| if go_struct.Cpu_bind_type != 0 { | |||
| c_struct.cpu_bind_type = C.uint16_t(go_struct.Cpu_bind_type) | |||
| } | |||
| if go_struct.Dependency != "" { | |||
| dependency_s := C.CString(go_struct.Dependency) | |||
| defer C.free(unsafe.Pointer(dependency_s)) | |||
| c_struct.dependency = dependency_s | |||
| } | |||
| if go_struct.End_time != 0 { | |||
| c_struct.end_time = C.int64_t(go_struct.End_time) | |||
| } | |||
| if len(go_struct.Environment) > 0 { | |||
| c_struct.env_size = C.uint32_t(len(go_struct.Environment)) | |||
| cArray := C.malloc(C.size_t(C.size_t(len(go_struct.Environment)) * C.size_t(unsafe.Sizeof(uintptr(0))))) | |||
| a := (*[1<<30 - 1]*C.char)(cArray) | |||
| for i := 0; i < len(go_struct.Environment); i++ { | |||
| a[i] = C.CString(go_struct.Environment[i]) | |||
| defer C.free(unsafe.Pointer(a[i])) | |||
| } | |||
| c_struct.environment = (**C.char)(cArray) | |||
| } else { | |||
| c_struct.env_size = 1 | |||
| cArray := C.malloc(C.size_t(C.size_t(1) * C.size_t(unsafe.Sizeof(uintptr(0))))) | |||
| a := (*[1<<30 - 1]*C.char)(cArray) | |||
| a[0] = C.CString("SLURM_GO_JOB=TRUE") | |||
| defer C.free(unsafe.Pointer(a[0])) | |||
| c_struct.environment = (**C.char)(cArray) | |||
| } | |||
| if go_struct.Exc_nodes != "" { | |||
| exc_nodes_s := C.CString(go_struct.Exc_nodes) | |||
| defer C.free(unsafe.Pointer(exc_nodes_s)) | |||
| c_struct.exc_nodes = exc_nodes_s | |||
| } | |||
| if go_struct.Features != "" { | |||
| features_s := C.CString(go_struct.Features) | |||
| defer C.free(unsafe.Pointer(features_s)) | |||
| c_struct.features = features_s | |||
| } | |||
| if go_struct.Group_id != 0 { | |||
| c_struct.group_id = C.uint32_t(go_struct.Group_id) | |||
| } | |||
| if go_struct.Immediate != 0 { | |||
| c_struct.immediate = C.uint16_t(go_struct.Immediate) | |||
| } | |||
| if go_struct.Job_id != 0 { | |||
| c_struct.job_id = C.uint32_t(go_struct.Job_id) | |||
| } | |||
| if go_struct.Kill_on_node_fail != 0 { | |||
| c_struct.kill_on_node_fail = C.uint16_t(go_struct.Kill_on_node_fail) | |||
| } | |||
| if go_struct.Licenses != "" { | |||
| licenses_s := C.CString(go_struct.Licenses) | |||
| defer C.free(unsafe.Pointer(licenses_s)) | |||
| c_struct.licenses = licenses_s | |||
| } | |||
| if go_struct.Mail_type != 0 { | |||
| c_struct.mail_type = C.uint16_t(go_struct.Mail_type) | |||
| } | |||
| if go_struct.Mail_user != "" { | |||
| mail_user_s := C.CString(go_struct.Mail_user) | |||
| defer C.free(unsafe.Pointer(mail_user_s)) | |||
| c_struct.mail_user = mail_user_s | |||
| } | |||
| if go_struct.Mem_bind != "" { | |||
| mem_bind_s := C.CString(go_struct.Mem_bind) | |||
| defer C.free(unsafe.Pointer(mem_bind_s)) | |||
| c_struct.mem_bind = mem_bind_s | |||
| } | |||
| if go_struct.Mem_bind_type != 0 { | |||
| c_struct.mem_bind_type = C.uint16_t(go_struct.Mem_bind_type) | |||
| } | |||
| if go_struct.Name != "" { | |||
| name_s := C.CString(go_struct.Name) | |||
| defer C.free(unsafe.Pointer(name_s)) | |||
| c_struct.name = name_s | |||
| } | |||
| if go_struct.Network != "" { | |||
| network_s := C.CString(go_struct.Network) | |||
| defer C.free(unsafe.Pointer(network_s)) | |||
| c_struct.network = network_s | |||
| } | |||
| if go_struct.Nice != 0 { | |||
| c_struct.nice = C.uint16_t(go_struct.Nice) | |||
| } | |||
| if go_struct.Num_tasks != 0 { | |||
| c_struct.num_tasks = C.uint32_t(go_struct.Num_tasks) | |||
| } | |||
| if go_struct.Open_mode != 0 { | |||
| c_struct.open_mode = C.uint8_t(go_struct.Open_mode) | |||
| } | |||
| if go_struct.Other_port != 0 { | |||
| c_struct.other_port = C.uint16_t(go_struct.Other_port) | |||
| } | |||
| if go_struct.Overcommit != 0 { | |||
| c_struct.overcommit = C.uint8_t(go_struct.Overcommit) | |||
| } | |||
| if go_struct.Partition != "" { | |||
| partition_s := C.CString(go_struct.Partition) | |||
| defer C.free(unsafe.Pointer(partition_s)) | |||
| c_struct.partition = partition_s | |||
| } | |||
| if go_struct.Plane_size != 0 { | |||
| c_struct.plane_size = C.uint16_t(go_struct.Plane_size) | |||
| } | |||
| if go_struct.Priority != 0 { | |||
| c_struct.priority = C.uint32_t(go_struct.Priority) | |||
| } | |||
| if go_struct.Profile != 0 { | |||
| c_struct.profile = C.uint32_t(go_struct.Profile) | |||
| } | |||
| if go_struct.Qos != "" { | |||
| qos_s := C.CString(go_struct.Qos) | |||
| defer C.free(unsafe.Pointer(qos_s)) | |||
| c_struct.qos = qos_s | |||
| } | |||
| if go_struct.Reboot != 0 { | |||
| c_struct.reboot = C.uint16_t(go_struct.Reboot) | |||
| } | |||
| if go_struct.Resp_host != "" { | |||
| resp_host_s := C.CString(go_struct.Resp_host) | |||
| defer C.free(unsafe.Pointer(resp_host_s)) | |||
| c_struct.resp_host = resp_host_s | |||
| } | |||
| if go_struct.Req_nodes != "" { | |||
| req_nodes_s := C.CString(go_struct.Req_nodes) | |||
| defer C.free(unsafe.Pointer(req_nodes_s)) | |||
| c_struct.req_nodes = req_nodes_s | |||
| } | |||
| if go_struct.Requeue != 0 { | |||
| c_struct.requeue = C.uint16_t(go_struct.Requeue) | |||
| } | |||
| if go_struct.Reservation != "" { | |||
| reservation_s := C.CString(go_struct.Reservation) | |||
| defer C.free(unsafe.Pointer(reservation_s)) | |||
| c_struct.reservation = reservation_s | |||
| } | |||
| if go_struct.Script != "" { | |||
| script_s := C.CString(go_struct.Script) | |||
| defer C.free(unsafe.Pointer(script_s)) | |||
| c_struct.script = script_s | |||
| } | |||
| if go_struct.Shared != 0 { | |||
| c_struct.shared = C.uint16_t(go_struct.Shared) | |||
| } | |||
| if go_struct.Spank_job_env_size != 0 { | |||
| c_struct.spank_job_env_size = C.uint32_t(go_struct.Spank_job_env_size) | |||
| } | |||
| if go_struct.Task_dist != 0 { | |||
| c_struct.task_dist = C.uint16_t(go_struct.Task_dist) | |||
| } | |||
| if go_struct.Time_limit != 0 { | |||
| c_struct.time_limit = C.uint32_t(go_struct.Time_limit) | |||
| } | |||
| if go_struct.Time_min != 0 { | |||
| c_struct.time_min = C.uint32_t(go_struct.Time_min) | |||
| } | |||
| //if go_struct.User_id != 0 { | |||
| // c_struct.user_id = C.uint32_t(go_struct.User_id) | |||
| //} | |||
| c_struct.user_id = C.uint32_t(go_struct.User_id) | |||
| if go_struct.Wait_all_nodes != 0 { | |||
| c_struct.wait_all_nodes = C.uint16_t(go_struct.Wait_all_nodes) | |||
| } | |||
| if go_struct.Warn_signal != 0 { | |||
| c_struct.warn_signal = C.uint16_t(go_struct.Warn_signal) | |||
| } | |||
| if go_struct.Warn_time != 0 { | |||
| c_struct.warn_time = C.uint16_t(go_struct.Warn_time) | |||
| } | |||
| if go_struct.Work_dir != "" { | |||
| work_dir_s := C.CString(go_struct.Work_dir) | |||
| defer C.free(unsafe.Pointer(work_dir_s)) | |||
| c_struct.work_dir = work_dir_s | |||
| } | |||
| if go_struct.Cpus_per_task != 0 { | |||
| c_struct.cpus_per_task = C.uint16_t(go_struct.Cpus_per_task) | |||
| } | |||
| if go_struct.Min_cpus != 0 { | |||
| c_struct.min_cpus = C.uint32_t(go_struct.Min_cpus) | |||
| } | |||
| if go_struct.Max_cpus != 0 { | |||
| c_struct.max_cpus = C.uint32_t(go_struct.Max_cpus) | |||
| } | |||
| if go_struct.Min_nodes != 0 { | |||
| c_struct.min_nodes = C.uint32_t(go_struct.Min_nodes) | |||
| } | |||
| if go_struct.Max_nodes != 0 { | |||
| c_struct.max_nodes = C.uint32_t(go_struct.Max_nodes) | |||
| } | |||
| if go_struct.Boards_per_node != 0 { | |||
| c_struct.boards_per_node = C.uint16_t(go_struct.Boards_per_node) | |||
| } | |||
| if go_struct.Sockets_per_board != 0 { | |||
| c_struct.sockets_per_board = C.uint16_t(go_struct.Sockets_per_board) | |||
| } | |||
| if go_struct.Sockets_per_node != 0 { | |||
| c_struct.sockets_per_node = C.uint16_t(go_struct.Sockets_per_node) | |||
| } | |||
| if go_struct.Cores_per_socket != 0 { | |||
| c_struct.cores_per_socket = C.uint16_t(go_struct.Cores_per_socket) | |||
| } | |||
| if go_struct.Threads_per_core != 0 { | |||
| c_struct.threads_per_core = C.uint16_t(go_struct.Threads_per_core) | |||
| } | |||
| if go_struct.Ntasks_per_node != 0 { | |||
| c_struct.ntasks_per_node = C.uint16_t(go_struct.Ntasks_per_node) | |||
| } | |||
| if go_struct.Ntasks_per_socket != 0 { | |||
| c_struct.ntasks_per_socket = C.uint16_t(go_struct.Ntasks_per_socket) | |||
| } | |||
| if go_struct.Ntasks_per_core != 0 { | |||
| c_struct.ntasks_per_core = C.uint16_t(go_struct.Ntasks_per_core) | |||
| } | |||
| if go_struct.Ntasks_per_board != 0 { | |||
| c_struct.ntasks_per_board = C.uint16_t(go_struct.Ntasks_per_board) | |||
| } | |||
| if go_struct.Pn_min_cpus != 0 { | |||
| c_struct.pn_min_cpus = C.uint16_t(go_struct.Pn_min_cpus) | |||
| } | |||
| if go_struct.Pn_min_memory != 0 { | |||
| c_struct.pn_min_memory = C.uint32_t(go_struct.Pn_min_memory) | |||
| } | |||
| if go_struct.Pn_min_tmp_disk != 0 { | |||
| c_struct.pn_min_tmp_disk = C.uint32_t(go_struct.Pn_min_tmp_disk) | |||
| } | |||
| if go_struct.Req_switch != 0 { | |||
| c_struct.req_switch = C.uint32_t(go_struct.Req_switch) | |||
| } | |||
| if go_struct.Std_err != "" { | |||
| std_err_s := C.CString(go_struct.Std_err) | |||
| defer C.free(unsafe.Pointer(std_err_s)) | |||
| c_struct.std_err = std_err_s | |||
| } | |||
| if go_struct.Std_in != "" { | |||
| std_in_s := C.CString(go_struct.Std_in) | |||
| defer C.free(unsafe.Pointer(std_in_s)) | |||
| c_struct.std_in = std_in_s | |||
| } | |||
| if go_struct.Std_out != "" { | |||
| std_out_s := C.CString(go_struct.Std_out) | |||
| defer C.free(unsafe.Pointer(std_out_s)) | |||
| c_struct.std_out = std_out_s | |||
| } | |||
| if go_struct.Wait4switch != 0 { | |||
| c_struct.wait4switch = C.uint32_t(go_struct.Wait4switch) | |||
| } | |||
| if go_struct.Wckey != "" { | |||
| wckey_s := C.CString(go_struct.Wckey) | |||
| defer C.free(unsafe.Pointer(wckey_s)) | |||
| c_struct.wckey = wckey_s | |||
| } | |||
| c_msg := C.submit_job(&c_struct) | |||
| defer C.free_submit_response_msg(c_msg) | |||
| if c_msg == nil { | |||
| go_msg := Submit_response_msg{} | |||
| go_msg.Job_id = 1<<31 - 1 | |||
| go_msg.Error_code = uint32(C.slurm_get_errno()) | |||
| return go_msg | |||
| } | |||
| go_msg := submit_response_msg_convert_c_to_go(c_msg) | |||
| return go_msg | |||
| } | |||
| @@ -0,0 +1,254 @@ | |||
| package slurm | |||
| type Job_descriptor struct { | |||
| Account string /* charge to specified account */ | |||
| Acctg_freq string /* accounting polling intervals (seconds) */ | |||
| Alloc_node string /* node making resource allocation request | |||
| * NOTE: Normally set by slurm_submit* or | |||
| * slurm_allocate* function */ | |||
| Alloc_resp_port uint16 /* port to send allocation confirmation to */ | |||
| Alloc_sid uint32 /* local sid making resource allocation request | |||
| * NOTE: Normally set by slurm_submit* or | |||
| * slurm_allocate* function | |||
| * NOTE: Also used for update flags, see | |||
| * ALLOC_SID_* flags */ | |||
| Argc uint32 /* number of arguments to the script */ | |||
| Argv []string /* arguments to the script */ | |||
| Array_inx string /* job array index values */ | |||
| //void *array_bitmap; /* NOTE: Set by slurmctld */ | |||
| Begin_time int64 /* delay initiation until this time */ | |||
| Ckpt_interval uint16 /* periodically checkpoint this job */ | |||
| Ckpt_dir string /* directory to store checkpoint images */ | |||
| Comment string /* arbitrary comment (used by Moab scheduler) */ | |||
| Contiguous uint16 /* 1 if job requires contiguous nodes, | |||
| * 0 otherwise,default=0 */ | |||
| Cpu_bind string /* binding map for map/mask_cpu */ | |||
| Cpu_bind_type uint16 /* see cpu_bind_type_t */ | |||
| Dependency string /* synchronize job execution with other jobs */ | |||
| End_time int64 /* time by which job must complete, used for | |||
| * job update only now, possible deadline | |||
| * scheduling in the future */ | |||
| Environment []string /* environment variables to set for job, | |||
| * name=value pairs, one per line */ | |||
| Env_size uint32 /* element count in environment */ | |||
| Exc_nodes string /* comma separated list of nodes excluded | |||
| * from job's allocation, default NONE */ | |||
| Features string /* comma separated list of required features, | |||
| * default NONE */ | |||
| Gres string /* comma separated list of required generic | |||
| * resources, default NONE */ | |||
| Group_id uint32 /* group to assume, if run as root. */ | |||
| Immediate uint16 /* 1 if allocate to run or fail immediately, | |||
| * 0 if to be queued awaiting resources */ | |||
| Job_id uint32 /* job ID, default set by SLURM */ | |||
| Kill_on_node_fail uint16 /* 1 if node failure to kill job, | |||
| * 0 otherwise,default=1 */ | |||
| Licenses string /* licenses required by the job */ | |||
| Mail_type uint16 /* see MAIL_JOB_ definitions above */ | |||
| Mail_user string /* user to receive notification */ | |||
| Mem_bind string /* binding map for map/mask_cpu */ | |||
| Mem_bind_type uint16 /* see mem_bind_type_t */ | |||
| Name string /* name of the job, default "" */ | |||
| Network string /* network use spec */ | |||
| Nice uint16 /* requested priority change, | |||
| * NICE_OFFSET == no change */ | |||
| Num_tasks uint32 /* number of tasks to be started, | |||
| * for batch only */ | |||
| Open_mode uint8 /* out/err open mode truncate or append, | |||
| * see OPEN_MODE_* */ | |||
| Other_port uint16 /* port to send various notification msg to */ | |||
| Overcommit uint8 /* over subscribe resources, for batch only */ | |||
| Partition string /* name of requested partition, | |||
| * default in SLURM config */ | |||
| Plane_size uint16 /* plane size when task_dist = | |||
| SLURM_DIST_PLANE */ | |||
| Priority uint32 /* relative priority of the job, | |||
| * explicitly set only for user root, | |||
| * 0 == held (don't initiate) */ | |||
| Profile uint32 /* Level of acct_gather_profile {all | none} */ | |||
| Qos string /* Quality of Service */ | |||
| Resp_host string /* NOTE: Set by slurmctld */ | |||
| Req_nodes string /* comma separated list of required nodes | |||
| * default NONE */ | |||
| Requeue uint16 /* enable or disable job requeue option */ | |||
| Reservation string /* name of reservation to use */ | |||
| Script string /* the actual job script, default NONE */ | |||
| Shared uint16 /* 1 if job can share nodes with other jobs, | |||
| * 0 if job needs exclusive access to the node, | |||
| * or NO_VAL to accept the system default. | |||
| * SHARED_FORCE to eliminate user control. */ | |||
| //char **spank_job_env; environment variables for job prolog/epilog | |||
| // * scripts as set by SPANK plugins | |||
| Spank_job_env_size uint32 /* element count in spank_env */ | |||
| Task_dist uint16 /* see enum task_dist_state */ | |||
| Time_limit uint32 /* maximum run time in minutes, default is | |||
| * partition limit */ | |||
| Time_min uint32 /* minimum run time in minutes, default is | |||
| * time_limit */ | |||
| User_id uint32 /* set only if different from current UID, | |||
| * can only be explicitly set by user root */ | |||
| Wait_all_nodes uint16 /* 0 to start job immediately after allocation | |||
| * 1 to start job after all nodes booted | |||
| * or NO_VAL to use system default */ | |||
| Warn_signal uint16 /* signal to send when approaching end time */ | |||
| Warn_time uint16 /* time before end to send signal (seconds) */ | |||
| Work_dir string /* pathname of working directory */ | |||
| /* job constraints: */ | |||
| Cpus_per_task uint16 /* number of processors required for | |||
| * each task */ | |||
| Min_cpus uint32 /* minimum number of processors required, | |||
| * default=0 */ | |||
| Max_cpus uint32 /* maximum number of processors required, | |||
| * default=0 */ | |||
| Min_nodes uint32 /* minimum number of nodes required by job, | |||
| * default=0 */ | |||
| Max_nodes uint32 /* maximum number of nodes usable by job, | |||
| * default=0 */ | |||
| Boards_per_node uint16 /* boards per node required by job */ | |||
| Sockets_per_board uint16 /* sockets per board required by job */ | |||
| Sockets_per_node uint16 /* sockets per node required by job */ | |||
| Cores_per_socket uint16 /* cores per socket required by job */ | |||
| Threads_per_core uint16 /* threads per core required by job */ | |||
| Ntasks_per_node uint16 /* number of tasks to invoke on each node */ | |||
| Ntasks_per_socket uint16 /* number of tasks to invoke on | |||
| * each socket */ | |||
| Ntasks_per_core uint16 /* number of tasks to invoke on each core */ | |||
| Ntasks_per_board uint16 /* number of tasks to invoke on each board */ | |||
| Pn_min_cpus uint16 /* minimum # CPUs per node, default=0 */ | |||
| Pn_min_memory uint32 /* minimum real memory per node OR | |||
| * real memory per CPU | MEM_PER_CPU, | |||
| * default=0 (no limit) */ | |||
| Pn_min_tmp_disk uint32 /* minimum tmp disk per node, | |||
| * default=0 */ | |||
| /* | |||
| * The following parameters are only meaningful on a Blue Gene | |||
| * system at present. Some will be of value on other system. Don't remove these | |||
| * they are needed for LCRM and others that can't talk to the opaque data type | |||
| * select_jobinfo. | |||
| */ | |||
| //uint16_t geometry[HIGHEST_DIMENSIONS]; node count in various | |||
| // * dimensions, e.g. X, Y, and Z | |||
| //uint16_t conn_type[HIGHEST_DIMENSIONS]; see enum connection_type | |||
| Reboot uint16 /* force node reboot before startup */ | |||
| Rotate uint16 /* permit geometry rotation if set */ | |||
| //char *blrtsimage; /* BlrtsImage for block */ | |||
| //char *linuximage; /* LinuxImage for block */ | |||
| //char *mloaderimage; /* MloaderImage for block */ | |||
| //char *ramdiskimage; /* RamDiskImage for block */ | |||
| /* End of Blue Gene specific values */ | |||
| Req_switch uint32 /* Minimum number of switches */ | |||
| //dynamic_plugin_data_t *select_jobinfo; /* opaque data type, | |||
| // * SLURM internal use only */ | |||
| Std_err string /* pathname of stderr */ | |||
| Std_in string /* pathname of stdin */ | |||
| Std_out string /* pathname of stdout */ | |||
| Wait4switch uint32 /* Maximum time to wait for minimum switches */ | |||
| Wckey string /* wckey for job */ | |||
| } | |||
| type Submit_response_msg struct { | |||
| Job_id uint32 | |||
| Step_id uint32 | |||
| Error_code uint32 | |||
| } | |||
| type Job_info struct { | |||
| account string /* charge to specified account */ | |||
| alloc_node string /* local node making resource alloc */ | |||
| alloc_sid uint32 /* local sid making resource alloc */ | |||
| array_job_id uint32 /* job_id of a job array or 0 if N/A */ | |||
| array_task_id uint16 /* task_id of a job array */ | |||
| assoc_id uint32 /* association id for job */ | |||
| batch_flag uint16 /* 1 if batch: queued job with script */ | |||
| batch_host string /* name of host running batch script */ | |||
| batch_script string /* contents of batch script */ | |||
| command string /* command to be executed, built from submitted | |||
| * job's argv and NULL for salloc command */ | |||
| comment string /* arbitrary comment (used by Moab scheduler) */ | |||
| contiguous uint16 /* 1 if job requires contiguous nodes */ | |||
| cpus_per_task uint16 /* number of processors required for | |||
| * each task */ | |||
| dependency string /* synchronize job execution with other jobs */ | |||
| derived_ec uint32 /* highest exit code of all job steps */ | |||
| eligible_time int64 /* time job is eligible for running */ | |||
| end_time int64 /* time of termination, actual or expected */ | |||
| exc_nodes string /* comma separated list of excluded nodes */ | |||
| exc_node_inx int32 /* excluded list index pairs into node_table: | |||
| * start_range_1, end_range_1, | |||
| * start_range_2, .., -1 */ | |||
| exit_code uint32 /* exit code for job (status from wait call) */ | |||
| features string /* comma separated list of required features */ | |||
| gres string /* comma separated list of generic resources */ | |||
| group_id uint32 /* group job sumitted as */ | |||
| job_id uint32 /* job ID */ | |||
| job_state uint16 /* state of the job, see enum job_states */ | |||
| licenses string /* licenses required by the job */ | |||
| max_cpus uint32 /* maximum number of cpus usable by job */ | |||
| max_nodes uint32 /* maximum number of nodes usable by job */ | |||
| boards_per_node uint16 /* boards per node required by job */ | |||
| sockets_per_board uint16 /* sockets per board required by job */ | |||
| sockets_per_node uint16 /* sockets per node required by job */ | |||
| cores_per_socket uint16 /* cores per socket required by job */ | |||
| threads_per_core uint16 /* threads per core required by job */ | |||
| name string /* name of the job */ | |||
| network string /* network specification */ | |||
| nodes string /* list of nodes allocated to job */ | |||
| nice uint16 /* requested priority change */ | |||
| node_inx int32 /* list index pairs into node_table for *nodes: | |||
| * start_range_1, end_range_1, | |||
| * start_range_2, .., -1 */ | |||
| ntasks_per_core uint16 /* number of tasks to invoke on each core */ | |||
| ntasks_per_node uint16 /* number of tasks to invoke on each node */ | |||
| ntasks_per_socket uint16 /* number of tasks to invoke on each socket*/ | |||
| ntasks_per_board uint16 /* number of tasks to invoke on each board */ | |||
| num_nodes uint32 /* minimum number of nodes required by job */ | |||
| num_cpus uint32 /* minimum number of cpus required by job */ | |||
| partition string /* name of assigned partition */ | |||
| pn_min_memory uint32 /* minimum real memory per node, default=0 */ | |||
| pn_min_cpus uint16 /* minimum # CPUs per node, default=0 */ | |||
| pn_min_tmp_disk uint32 /* minimum tmp disk per node, default=0 */ | |||
| pre_sus_time int64 /* time job ran prior to last suspend */ | |||
| priority uint32 /* relative priority of the job, | |||
| * 0=held, 1=required nodes DOWN/DRAINED */ | |||
| profile uint32 /* Level of acct_gather_profile {all | none} */ | |||
| qos string /* Quality of Service */ | |||
| req_nodes string /* comma separated list of required nodes */ | |||
| req_node_inx int32 /* required list index pairs into node_table: | |||
| * start_range_1, end_range_1, | |||
| * start_range_2, .., -1 */ | |||
| req_switch uint32 /* Minimum number of switches */ | |||
| requeue uint16 /* enable or disable job requeue option */ | |||
| resize_time int64 /* time of latest size change */ | |||
| restart_cnt uint16 /* count of job restarts */ | |||
| resv_name string /* reservation name */ | |||
| /*dynamic_plugin_data_t *select_jobinfo;*/ /* opaque data type, | |||
| * process using | |||
| * slurm_get_select_jobinfo() | |||
| */ | |||
| /*job_resources_t *job_resrcs;*/ /* opaque data type, job resources */ | |||
| shared uint16 /* 1 if job can share nodes with other jobs */ | |||
| show_flags uint16 /* conveys level of details requested */ | |||
| start_time int64 /* time execution begins, actual or expected */ | |||
| state_desc string /* optional details for state_reason */ | |||
| state_reason uint16 /* reason job still pending or failed, see | |||
| * slurm.h:enum job_state_reason */ | |||
| submit_time int64 /* time of job submission */ | |||
| suspend_time int64 /* time job last suspended or resumed */ | |||
| time_limit uint32 /* maximum run time in minutes or INFINITE */ | |||
| time_min uint32 /* minimum run time in minutes or INFINITE */ | |||
| user_id uint32 /* user the job runs as */ | |||
| preempt_time int64 /* preemption signal time */ | |||
| wait4switch uint32 /* Maximum time to wait for minimum switches */ | |||
| wckey string /* wckey for job */ | |||
| work_dir string /* pathname of working directory */ | |||
| } | |||
| type Job_info_msg struct { | |||
| Last_update int64 | |||
| Record_count uint32 | |||
| Job_list []Job_info | |||
| } | |||