static int compare_sw_ins(const void *a, const void *b) { SW_INS_PTR sw_ins_a, sw_ins_b; TERM msw_a, msw_b; sw_ins_a = *(const SW_INS_PTR *)(a); sw_ins_b = *(const SW_INS_PTR *)(b); msw_a = prism_sw_ins_term(sw_ins_a->id); msw_b = prism_sw_ins_term(sw_ins_b->id); return bpx_compare(bpx_get_arg(1,msw_a), bpx_get_arg(1,msw_b)); }
int pc_mp_recv_swlayout_0(void) { occ_position = MALLOC(sizeof(int) * occ_switch_tab_size); MPI_Recv(occ_position, occ_switch_tab_size, MPI_INT, 0, TAG_SWITCH_RES, MPI_COMM_WORLD, NULL); /* debug */ { int i; TERM msw; for (i = 0; i < occ_switch_tab_size; i++) { msw = bpx_get_arg(1, prism_sw_ins_term(occ_switches[i]->id)); mp_debug("%s -> %d", bpx_term_2_string(msw), occ_position[i]); } } return BP_TRUE; }
int pc_mp_send_switches_0(void) { char *msg, *str; TERM msw; int msglen, msgsiz; int vals[2]; int i, n; msglen = 0; msgsiz = 65536; msg = MALLOC(msgsiz); for (i = 0; i < occ_switch_tab_size; i++) { msw = bpx_get_arg(1, prism_sw_ins_term(occ_switches[i]->id)); str = (char *)bpx_term_2_string(msw); n = strlen(str) + 1; if (msgsiz <= msglen + n) { msgsiz = (msglen + n + 65536) & ~65535; msg = REALLOC(msg, msgsiz); } strcpy(msg + msglen, str); msglen += n; } msg[msglen++] = '\0'; /* this is safe */ vals[0] = msglen; vals[1] = occ_switch_tab_size; MPI_Gather(vals, 2, MPI_INT, NULL, 0, MPI_INT, 0, MPI_COMM_WORLD); MPI_Send(msg, msglen, MPI_CHAR, 0, TAG_SWITCH_REQ, MPI_COMM_WORLD); free(msg); return BP_TRUE; }