一个还不错的symbian面试题

一个还不错的symbian面试题

刚想到一个还不错的symbian面试题

问题:根据AO的运行机制,通常会有如下的调用,
TRequestStatus *status=&iStatus;
User::RequestComplete(status, KErrNone);
SetActive();

假设,现在把User::RequestComplete(status, KErrNone); 换成iStatus = KErrNone。会有什么样的后果,请说明为什么?

分析:

这个题目考察了AO的运行原理和AS的内部机制,如果对AO的机制不是特别了解是没办法解答这道题目的。

首先,我们来看看AS的运行机制
1.  调用 User::WaitForAnyRequest,这个函数会一直block住,直到当前线程收到一个semaphore
2.  当收到一个信号时,
3.  循环AS中所有的AO
4.       检查AO的iStatus是否是KRequestPending,如果是,继续往下不是,则检查下一个AO
5.          检查该AO是否已经active了,即SetActive已经调用过了。
6.            如果满足条件,调用AO的RunL
7.  Goto 1

好了,我们现在来看题目,这个AO已经调用了SetActive(),所以它满足第5行的条件,然后iStatus = KErrNone,那么它也满足第4行的条件。所以,就掉入了下面的假设。

如果系统里面就这么一个AO,那么什么都不会发生。
如果系统里面有超过一个AO,而又有别的AO调用了例如User::RequestComplete(iStatus, KErrNone)之类的语句,使得第1行的条件满足,那么我们修改的AO就有可能被调用。什么情况下会被调用呢?是在我们改动的AO的优先级比别的AO都高时,它就会被调用。这么说来,这样的改动是可行的吗?当然不是,如果当前AO被调用到,那么意味着系统中一个期待被响应的AO被抢占了,所以,AS状态就乱了,最终会导致E32USER-CBase 46的panic,这是因为系统始终多处理一个AO,最后一次第一行响应后,发现没有AO了,就会报错。

缩写:
AO — Active Object
AS — Active Scheduler

One thought on “一个还不错的symbian面试题

Leave a Reply

Your email address will not be published. Required fields are marked *