rc_t lg_tag_chunks_h::update(uint4_t start_byte, const vec_t& data) const { FUNC(lg_tag_chunks_h::update); uint4_t amount; // amount to update on page uint4_t pid_count = start_byte/lgdata_p::data_sz; // first page uint4_t data_size = data.size(); lpid_t curr_pid(_page.pid().vol(), _cref.store, 0); uint4_t offset = start_byte%lgdata_p::data_sz; uint4_t num_bytes = 0; while (num_bytes < data_size) { amount = MIN(lgdata_p::data_sz-offset, data_size-num_bytes); curr_pid.page = _pid(pid_count); lgdata_p lgdata; W_DO( lgdata.fix(curr_pid, LATCH_EX) ); W_DO(lgdata.update(offset, data, num_bytes, amount)); offset = 0; num_bytes += amount; pid_count++; } // verify last page touched is same as calculated last page w_assert9(pid_count-1 == (start_byte+data.size()-1)/lgdata_p::data_sz); return RCOK; }
rc_t lg_tag_indirect_h::update(uint4_t start_byte, const vec_t& data) const { FUNC(lg_tag_indirect_h::update); uint4_t amount; // amount to update on page uint page_to_update = start_byte/lgdata_p::data_sz; // first page uint4_t data_size = data.size(); lpid_t curr_pid(stid(), 0); uint4_t offset = start_byte%lgdata_p::data_sz; uint4_t num_bytes = 0; while (num_bytes < data_size) { amount = MIN(lgdata_p::data_sz-offset, data_size-num_bytes); curr_pid.page = _pid(page_to_update); lgdata_p lgdata; W_DO( lgdata.fix(curr_pid, LATCH_EX) ); W_DO(lgdata.update(offset, data, num_bytes, amount)); offset = 0; num_bytes += amount; page_to_update++; } w_assert9(page_to_update-1 == (start_byte+data.size()-1)/lgdata_p::data_sz); return RCOK; }
/*------------------------------------------- | Name:start_kernel | Description: | Parameters: | Return Type: | Comments: | See: ---------------------------------------------*/ void _start_kernel(char* arg){ pthread_mutexattr_t mutex_attr=0; pthread_attr_t thread_attr; rttmr_attr_t rttmr_attr={0}; // __kernel_static_mode_in(); //init kernel system _pid(); // _vfs(); // _flocks(); // kernel_pthread_mutex_init(&kernel_mutex,&mutex_attr); // rttmr_attr.tm_msec=__KERNEL_ALARM_TIMER; // rttmr_attr.func = _kernel_timer; // rttmr_create(&kernel_tmr,&rttmr_attr); // rttmr_start(&kernel_tmr); //stdio init(mutex for stdin, stdout, stderr) __stdio_init(); // thread_attr.stacksize = KERNEL_STACK_SIZE; thread_attr.stackaddr = (void*)&kernel_stack; thread_attr.priority = KERNEL_PRIORITY; thread_attr.timeslice = 0; thread_attr.name ="kernel_thread"; kernel_pthread_create(&kernel_thread,&thread_attr,kernel_routine,arg); // _kernel_warmup_profiler(); //create directory /dev, /bin, /usr, /etc. //detect and create devices in /dev _kernel_warmup_rootfs(); // _kernel_warmup_cpu(); // _kernel_warmup_load_mount_cpufs(); // _kernel_warmup_i2c(); // _kernel_warmup_spi(); // _kernel_warmup_dev(); // _kernel_warmup_tty(); // _kernel_warmup_stream(); // _kernel_warmup_object_manager(); // _kernel_warmup_rtc(); // _kernel_warmup_mount(); // _kernel_warmup_boot(); //only in bootstrap configuration //_kernel_warmup_elfloader(); // #if defined (__KERNEL_NET_IPSTACK) #if defined(USE_UIP) uip_core_run(); #endif #endif // kernel_printk_init(); // __kernel_static_mode_out(); }