改正 抢占式camera的可能带来死锁问题
来源:互联网 发布:手机网页游戏平台源码 编辑:程序博客网 时间:2024/05/24 20:07
背景:
实现强占式camera service,当某些应用(如手电筒)在后台打开camera后,当cameraapp open camera时可以强占被后台应用占有的camera.
注意,由于这样修改破坏了android原生的camera service规则,有可能导致某些三方apk出现异常
问题:概率性死锁
分析:
关闭: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的可能带来死锁问题
- tomcat7可能带来的问题
- tomcat7可能带来的问题
- tomcat7可能带来的问题
- android屏幕旋转可能带来的问题
- pthread_cancel的带来的一个死锁问题(验证)
- mysql中 insert …select …带来的死锁问题
- mysql中 insert …select …带来的死锁问题
- 在外键末加索引的情况下,可能带来的问题
- Linux下char类型可能带来的问题
- Linux下char类型可能带来的问题
- Linux下char类型可能带来的问题
- 浅析Context及可能带来的内存泄漏问题
- 浅析Context及可能带来的内存泄漏问题
- 字节对齐详解,及可能带来的问题
- Android——关于混淆代码可能带来的问题
- 分享一个 变量没有初始化 可能带来的问题
- 关系型数据表分表可能带来的问题
- 走进软考(1)— 完成看视频和看教程的时代
- php 引用变量机制
- Webview && 浏览器
- 捕捉信号SIGSEGV并回溯栈帧
- 获取json数据的属性名
- 改正 抢占式camera的可能带来死锁问题
- SDUT 2084 DOTA-人王之战(博弈论)
- Java基本输入输出
- iOS网络开发——解析与封装JSON数据
- 01背包
- VS报错:Missing type map configuration or unsupported mapping.
- SDUT 2044 Number Sequence(循环)
- MFC 设置颜色SetDialogBkColor为什么不好使?
- 组合数