/* 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); }
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; }
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; }