*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]]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS