*rt_com3.c **1210行目 #contents 関数sss_loadbalanse **sss_loadbalanse get_taskinfo_address → L_TASKINFOのポインタを取得(ssscore.h 1484行目) **1361行目 1361行目 > ret = mbcf_k_cmp_swap(0,get_accesskey(),&swap_data0,t_val); mbcf_k_cmp_swap(target_task,key,target_addr,val) > if (ret == 0) { r = sss_migration_request(next_node,0); ret = mbcf_k_cmp_swap(0,get_accesskey(),&swap_data0,0); if (r < 0) return r; *my_pnidp = tinfop->task[-1].node; mynodep = (tinfop->nodeinfop+tinfop->task[-1].node); return tinfop->task[-1].node; } else return -1; **mbcf_k_cmp_swap 1138行目 > int mbcf_k_cmp_swap(target_task,key,target_addr,val) int target_task,key,val; unsigned target_addr; { MBCF_PBOX pbox; volatile int swap_data; volatile int stat_flag; stat_flag = 0; swap_data = val; ↓ここからpboxの中身詰め込み > pbox.ltask = target_task; pbox.key = key; pbox.addr = target_addr; pbox.addr2 = 0; pbox.data = (BYTE*)&swap_data; pbox.len = sizeof(int); ↓ここからMBCF発動 valが非0のとき > if (val != 0) { pbox.comm = MBCF_K_CMP_SWAP; do { int ret; ret = k_cmpswap_taskdata(&pbox, &stat_flag); if (ret != -1) break; self_sleep(1); } while (1); ↓valが0のとき > } else { pbox.comm = MBCF_WRITE; do { int ret; ret = mbcf_send(&pbox,&stat_flag); if (ret != -1) break; self_sleep(1); } while (1); } ↓終了処理 > for (;stat_flag == 0;) ; if (stat_flag < 0) swap_data = stat_flag; return swap_data; } **関連ページ [[Lab]]