make_device函数分析

定义在pkg\uvmm\server\src\device.h文件中:

template< typename T, typename... Args >

cxx::Ref_ptr

make_device(Args &&... args)

{ return cxx::make_ref_obj >(cxx::forward(args)...); }

 

返回值:

cxx::Ref_ptr定义在pkg\l4re-core\cxx\lib\tl\include\ref_ptr中

template <

  typename T = void,

  template< typename X > class CNT = Default_ref_counter

>

class Ref_ptr : public Ref_ptr_base, private CNT

{……}

cxx::Ref_ptr相当于c++11中的shared_ptr,“A reference-counting pointer with automatic cleanup”,意为一个带引用计数的指针。

 

参数:

带模板的变长参数

 

函数体:

直接调用cxx::make_ref_obj函数,定义在pkg\l4re-core\cxx\lib\tl\include\ref_ptr中

template< typename T, typename... Args >

Ref_ptr

make_ref_obj(Args &&... args)

{ return cxx::Ref_ptr(new T(cxx::forward(args)...)); }

返回值和参数和make_device一样;函数体部分,new了一个T对象返回其引用。

 

总结:包裹了很多层,其实就是通过new利用参数args创建一个T对象,并创建T对象的一个shared_ptr返回。实例分析如,vcpu创建时:

_cpus[id] = Vdev::make_device<Cpu_dev>(id, cpu_mask, node);

其实就是调用Cpu_dev的构造函数

Cpu_dev(unsigned idx, unsigned phys_id, Vdev::Dt_node const *);

,new了一个对象,同时创建并返回一个shared_ptr指向它。

你可能感兴趣的:(l4re/fiasco,L4/fiasco研究)