Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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();
}