改正 抢占式camera的可能带来死锁问题

背景:

cameraapp open camera

camera service

问题:概率性死锁

分析:

关闭:JNI–》CameraClient::disconnect(){…… :

Mutex::Autolock lock(mLock);获取lock:mLock—->属于某camera应用:A进程空间。

CameraService::Client::disconnect();—》要去关闭server端的client

//尚未退出所以mlock不会被释放

}

voidCameraService::removeClientByRemote(const wp<IBinder>& remoteBinder){

int callingPid = getCallingPid();

LOG1("CameraService::removeClientByRemote E (pid %d)",callingPid);

// Declare this before the lock to makeabsolutely sure the

// destructor won’t be called with the lockheld.

Mutex::Autolocklock(mServiceLock);—-//获取lock:mServiceLock —->属于某camera应用进程空间。

打开:android_hardware_Camera_native_setup()—》Camera::connect—-》binder —-》mediaserver进程—-》CameraService::connect(){

….

Mutex::Autolocklock(mServiceLock);//获取lock:mServiceLock —->属于mediaserver进程空间。

….

}—》canConnectUnsafe()

{

….

client->disconnect();—–>调用CameraClient::disconnect(){Mutex::Autolocklock(mLock);}//同样也会获取lock:mLock —->属于mediaserver应用进程空间。

小结:对于mLock与mServiceLock,也就是说关闭过程,它们属于应用进程空间。打开过程,它们属于mediaserver进程。因此,mLock 与mServiceLock 有可能死锁。

比如:A进程在关闭camera的过程,跑到CameraService::removeClientByRemote()尝试获取lock:mServiceLock,但是进程B先运行了,,且尝试去打开camera,就会跑到mediaserver进程也获取lock:mServiceLock。也就是mediaserver进程先获取了mServiceLock,再尝试去获取mLock,但是A进程先获得了mLock。

不必在乎目的地,在乎的是沿途的风景以及看风景的心情,让心灵去旅行!

改正 抢占式camera的可能带来死锁问题

相关文章:

你感兴趣的文章:

标签云: