/*
	diagnostic code
*/
void peer_show()
{
	int i;
	__u16 * pp;
	__u8 * p8;
	char tbuf[64];
	ktime_t t;
	
	printf("Mode=%s,state=%s,flags=%08x,peermode=%s,%s.\n", ke_get_mode_name(kernelState), 
		state_name(get_state()), g_kernel.status.flags, ke_get_mode_name(peerState),
		ke_get_flag(FKERN_LED_SYNCHRONIZED)? "Synchronized":"Out of sync");
	pp=(__u16*)&g_kernel.status.prog_id;
	printf("  version : %04x-%04x-%04x-%04x\n", pp[0], pp[1], pp[2], pp[3]);
	pp=(__u16*)&g_kernel.peer_status.prog_id;
	printf("p-version : %04x-%04x-%04x-%04x\n", pp[0], pp[1], pp[2], pp[3]);
	p8=(__u8*)g_kernel.peer->localAddress;
	printf("Local addr: %02x-%02x-%02x-%02x-%02x-%02x\n",p8[0],p8[1],p8[2],p8[3],p8[4],p8[5]);
	p8=(__u8*)g_kernel.peer->peerAddress;
	printf("Peer addr : %02x-%02x-%02x-%02x-%02x-%02x\n",p8[0],p8[1],p8[2],p8[3],p8[4],p8[5]);
	t=ke_get_time();
	ke_time_to_string(t,tbuf,sizeof(tbuf));
	printf("Local time: %s\n",tbuf);
	ke_time_to_string(t+hspTimeOffset,tbuf,sizeof(tbuf));
	printf("Peer time : %s\n",tbuf);
	printf("Time Bias : %d milliseconds\n",hspTimeOffset/10/1000);
	printf("Counters  : ");
	for(i=0; i<sizeof peerCounters/sizeof peerCounters[0]; i++){
		printf("%d=%d,", i, peerCounters[i]);
	}
	printf("\n");
	ke_time_to_string(g_kernel.peer->lastMsgTime,tbuf,sizeof(tbuf));
	printf("Last msg from peer arrived at : %s\n",tbuf);
}
Exemple #2
0
FKERN_API f8_bool ke_lock(HF8_KERNEL _kernel, int writeMode)
{
    pthread_rwlock_fcfs_t * lk;
    if(writeMode && ke_get_flag(FKERN_KEY_LOCK)) {
        return f8_false;
    }
    lk = (pthread_rwlock_fcfs_t * )((struct kernel_t*)_kernel)->lock;
    if(writeMode) {
        pthread_rwlock_fcfs_gain_write(lk);
    } else {
        pthread_rwlock_fcfs_gain_read(lk);
    }
    return f8_true;
}
Exemple #3
0
FKERN_API f8_bool ke_lock(HF8_KERNEL _kernel, int writeMode)
{
	// DEBUG_PRINTF(("%08x:T%08x ke_lock(%d,%08x)\n", GetTickCount(),GetCurrentThreadId(),writeMode,((struct kernel_t*)_kernel)->lock));
	if(writeMode && ke_get_flag(FKERN_KEY_LOCK)){
		return f8_false;
	}
	if(writeMode){
		wr_lock_rtk_object(((struct kernel_t*)_kernel)->lock);
	}else{
		rd_lock_rtk_object(((struct kernel_t*)_kernel)->lock);
	}
	// DEBUG_PRINTF(("%08x:T%08x ke_lock(%d,%08x) ok.\n", GetTickCount(),GetCurrentThreadId(),writeMode,((struct kernel_t*)_kernel)->lock));
	return f8_true;
}
/*
	standby_sync()
	- standby phase of the BPC
*/
LOCAL f8_status standby_sync()
{
	int cookie;
	ktime_t t;
	f8_uint i, size;
	long size2;
	f8_status ret = F8_BUSY;
	f8_u8 st;
	static ktime_t syncTime;
	
	t = ke_get_time();

	/* check automata */
	cookie = peer_lock();

	st = get_state();
	switch(st){
	case hsp_s_complete:
		size = 0;
		ke_toggle_flag(FKERN_LED_DBG1);
		syncTime=t;
		ke_set_flag(FKERN_LED_SYNCHRONIZED,1);
		for(i=0; i<KERN_NUM_SECTIONS; i++){
			if(peerHdr.x_mem_sizes[i] != g_kernel.x_mem_sizes[i]){
				ret = F8_VERSION_MISMATCH;
				set_state(hsp_s_idle);
				goto __done;
			}
			size += peerHdr.x_mem_sizes[i];
		}
		size += sizeof(struct marshalled_timer_t) * peerHdr.timer_q_len +
			sizeof(struct marshalled_event_t) * peerHdr.event_q_len +
			peerHdr.i_mem_size;
		if(size + sizeof(struct kpeer_hdr_t) > F8_VOLATILE_MEM_SIZE){
			ret = F8_LOW_MEMORY;
			set_state(hsp_s_idle);
			goto __done;
		}

		size2=sizeof(peerData);
		if(uncompress(peerData, &size2, peerDataZipped, peerHdr.zipped_data_len) != Z_OK){
			ret=F8_INVALID_DATA;
			set_state(hsp_s_idle);
			break;
		}
		
		/* indicate how much memory we can use */
		peerGuardian = peerData + size2;
		ki_load_volatile(&g_kernel);
		
		/* start another session */
		//peer_flush();
		set_state(hsp_s_idle);
		ret = F8_SUCCESS;
		peerCounters[1]++;
		break;

	case hsp_s_idle:
		break;
		
	case hsp_s_active:
		if(!ke_get_flag(FKERN_LED_SYNCHRONIZED)){
			//peer_flush();
			set_state(hsp_s_idle);
		}
		break;

	default:
		/* last error */
		peerCounters[5]++;
		peerCounters[3] = st;
		//peer_flush();
		set_state(hsp_s_idle);
		break;
	}
	
__done:	
	peer_unlock(cookie);

	if(t>syncTime+ki_get_primary_life()*5)
		ke_set_flag(FKERN_LED_SYNCHRONIZED,0);

	if(!ke_get_flag(FKERN_LED_SOFT_STOP)){
		if(t > g_kernel.peer->lastMsgTime + ki_get_primary_life()||
			(peerState!=KERN_S_RUNNING && !ke_get_peer_flag(FKERN_LED_SOFT_LOCK))
		){
			/* primary failure detected */
			/* try switch to primary state */
			if(g_kernel.peer_status.prog_id == g_kernel.status.prog_id && ke_get_flag(FKERN_LED_SYNCHRONIZED)){
				/* adjust kernel clock */
				kern_time_bias += hspTimeOffset;
				ki_log(&g_kernel, F8_PRIMARY_FAILURE,0,0,0);
				ki_switch_to(KERN_S_ARBITRATING);
				set_state(hsp_s_idle);
			}
			/* reset peer to unknown state */
			memset(&g_kernel.peer_status, 0, sizeof g_kernel.peer_status);
		}
	}
	
	return ret;
}