定义在pkg\uvmm\server\src\device.h文件中:
template< typename T, typename... Args > cxx::Ref_ptr<T> make_device(Args &&... args) { return cxx::make_ref_obj<Dev_ref_obj<T> >(cxx::forward<Args>(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<T> {……} |
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<T> make_ref_obj(Args &&... args) { return cxx::Ref_ptr<T>(new T(cxx::forward<Args>(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指向它。