Symbian R-class
Symbian中的类经常分为C类,T类,R类,M类,就是分别以C/T/R/M开头的类名。
R类的"R"是Resource的第一个字母,资源类。
具有"R"前缀的类表示某个资源的客户端句柄。应用程序实际上并不拥有资源,资源由设备上一个Symbian OS 服务器所拥有,服务器管理资源的使用。客户可以使用这些句柄访问服务器管理的资源,并请求使用它的功能。
R类没有任何公共的基类,有些分块的派系类,比如,有些类是从RHandleBase派生—RFs,而有的什么都不 是—RWindow等。一般来说,R类是在栈上实例化或是嵌套在C类中,然后通过某种方式打开他们(通常通过一个方法调用来打开,例如调用Open()或 Connect())。结束使用它们时,有必要使用适当的方法来处理这些类(通常使用Close()函数)。如果在完成这项工作时失败,则R类所连接的服 务器内存和其他资源泄漏。
Symbian 里的R类到底是啥?基本上所有R类都包含一个指向kernel-side object的handle,这个handle是一个整数!通过这个整数,在DObjectIx这个容器中可以索引到R类指向的对象,这些对象都是从DObject派生出来的,具有引用计数的功能!当user-side的R类调用Close方法后,对应的计 数减1,到0时,就会自动析构内核的对象。
那么内核是如何把一个handle的32位整数解析成一个指向内核对象的指针的呢?
struct SDObjectIxRec
{
TInt16 instance;
TInt16 uniqueID;
DObject* obj;
};
这些指针通过SDObjectIxRec包装,放到DObjectIx的数组中,每一个DProcess或者DThread都有一个这样一个数组!(所以,当你创建一个R类的时候需要你指明是thread范围的还是process范围的,他们会被放到不同的地方)。
1.根据bit30看这个handle是存在thread里还是process的DObjectIx里
2.根据这个handle的bit0-14来判断这个handle真的在DObjectIx里,数组不越界
3.根据bit0-14获取这个index对应的SDObjectIxRec
4.根据bit16-29和获得SDObjectIxRec的instance比对
5.如果一致就无措,这些操作可能会需要NKern::LockSystem()
6.获得SDObjectIxRec的obj指针
那么内核是如何把一个handle的32位整数解析成一个指向内核对象的指针的呢?
struct SDObjectIxRec
{
TInt16 instance;
TInt16 uniqueID;
DObject* obj;
};
这些指针通过SDObjectIxRec包装,放到DObjectIx的数组中,每一个DProcess或者DThread都有一个这样一个数组!(所以,当你创建一个R类的时候需要你指明是thread范围的还是process范围的,他们会被放到不同的地方)。
1.根据bit30看这个handle是存在thread里还是process的DObjectIx里
2.根据这个handle的bit0-14来判断这个handle真的在DObjectIx里,数组不越界
3.根据bit0-14获取这个index对应的SDObjectIxRec
4.根据bit16-29和获得SDObjectIxRec的instance比对
5.如果一致就无措,这些操作可能会需要NKern::LockSystem()
6.获得SDObjectIxRec的obj指针