- 主题:可能需要一个std::set或者更复杂的数据结构存储安卓的一个数据
这个数据是用在这个HAL里的
Return<void> Thermal::registerThermalChangedCallback(const sp<IThermalChangedCallback> &callback, bool filterType, TemperatureType_2_0 type, registerThermalChangedCallback_cb _hidl_cb)
这里面首先传入的是callback,如果callback以前见过,就报错。那么就需要一个容器存储一下(另外需要通知所有calblack的时候也是需要这个容器的)。假定需要std::set。
我写std::set<sp<IThermalChangedCallback>> callback;结果报错,说是set需要超过一个的模板类型。就是需要比较函数。
那么,这种callback之间怎样比较?至少要能够判断两个callback不同吧?用什么呢?地址吗?
(然后,其实这个函数还传入了是不是要根据某个类型来回叫,所以其实不是std::set,可能是std::map<TemperatureType_2_0, std::set<sp<IThermalChangedCallback>>>.)
--
修改:bihai FROM 72.199.121.*
FROM 72.199.121.*
那就写一个predicate来比较std::set里的item,比较sp内部的裸指针指向的地址
unordered_set更合适?
--
FROM 221.218.160.*
你给每个callback 一个unique id
然后用std::set<std::pair<int, callback>>
不就可以了吗
或者用一个wrapper把callback放进去
在提供一个field: id
和operator <
也可以把
【 在 bihai 的大作中提到: 】
: 这个数据是用在这个HAL里的
: Return<void> Thermal::registerThermalChangedCallback(const sp<IThermalChangedCallback> &callback, bool filterType, TemperatureType_2_0 type, registerThermalChangedCallback_cb _hidl_cb)
: 这里面首先传入的是callback,如果callback以前见过,就报错。那么就需要一个容器存储一下(另外需要通知所有calblack的时候也是需要这个容器的)。假定需要std::set。
: ...................
--
修改:mvtec FROM 24.0.210.*
FROM 24.0.210.*
用引用传递shared_ptr是不是有什么坑来着,lambda或是多线程问题?
【 在 bihai (new half life) 的大作中提到: 】
: 这个数据是用在这个HAL里的
:
: Return<void> Thermal::registerThermalChangedCallback(const sp<IThermalChangedCallback> &callback, bool filterType, TemperatureType_2_0 type, registerThermalChangedCallback_cb _hidl_cb)
:
--
FROM 183.179.53.*
你用什么判断两个callback相等?
【 在 bihai 的大作中提到: 】
: 这个数据是用在这个HAL里的
: Return<void> Thermal::registerThermalChangedCallback(const sp<IThermalChangedCallback> &callback, bool filterType, TemperatureType_2_0 type, registerThermalChangedCallback_cb _hidl_cb)
: 这里面首先传入的是callback,如果callback以前见过,就报错。那么就需要一个容器存储一下(另外需要通知所有calblack的时候也是需要这个容器的)。假定需要std::set。
: ...................
--
FROM 158.140.1.*
难道不是你自己的业务需求来定义什么叫“这个callback见过”
BTW:通常的callback应该都是一段过程,大部分甚至都是可重入的,压根就不应该搞“见过就不能执行”这种逻辑。
如果你需要的是调度Task,可以根据Task不可重复执行的理由给Task设置唯一标志,或者Task的逻辑就应该设置成可重入,根据相应的标志不重复执行操作就行。
【 在 bihai 的大作中提到: 】
: 这个数据是用在这个HAL里的
: Return<void> Thermal::registerThermalChangedCallback(const sp<IThermalChangedCallback> &callback, bool filterType, TemperatureType_2_0 type, registerThermalChangedCallback_cb _hidl_cb)
: 这里面首先传入的是callback,如果callback以前见过,就报错。那么就需要一个容器存储一下(另外需要通知所有calblack的时候也是需要这个容器的)。假定需要std::set。
: ...................
--
修改:ble FROM 222.129.49.*
FROM 222.129.49.*
刚查到,在安卓代码库里面有个例子Thermal.cpp
using ::android::hardware::interfacesEqual;
// std::vector<CallbackSetting> callbacks_;
if (std::any_of(callbacks_.begin(), callbacks_.end(), [&](const CallbackSetting &c) {
return interfacesEqual(c.callback, callback);
})) {
status.code = ThermalStatusCode::FAILURE;
status.debugMessage = "Same callback registered already";
LOG(ERROR) << status.debugMessage;
} else {
callbacks_.emplace_back(callback, filterType, type);
LOG(INFO) << "a callback has been registered to ThermalHAL, isFilter: " << filterType
<< " Type: " << android::hardware::thermal::V2_0::toString(type);
}
不是std::set,也许他们也不知道怎么比较大小?不多的话,一个一个比较是不是相等也行吧
【 在 allegro 的大作中提到: 】
: 你用什么判断两个callback相等?
--
FROM 72.199.121.*
这个是安卓HAL层逻辑的规定,就是当有人写的程序registerThermalChangedCallback(callback);两次的时候,第二次会出错。第一次会成功。当然,如果第二次之前unregister,又可以再次register。所以需要在HAL里面实现registerThermalChangedCallback的时候要判断这个callback以前作为参数传进来没有。这个HAL的函数会被不同程序调用多次。
【 在 ble 的大作中提到: 】
: 难道不是你自己的业务需求来定义什么叫“这个callback见过”
: BTW:通常的callback应该都是一段过程,大部分甚至都是可重入的,压根就不应该搞“见过就不能执行”这种逻辑。
: 如果你需要的是调度Task,可以根据Task不可重复执行的理由给Task设置唯一标志,或者Task的逻辑就应该设置成可重入,根据相应的标志不重复执行操作就行。
: ...................
--
修改:bihai FROM 72.199.121.*
FROM 72.199.121.*
那不是调用的interfacesEqual()吗?查一下这个的实现
而且是不需要比较大小的,只需要比较是否相同/相等。
你也可以调用这个android::hardware::interfacesEqual()函数
/**
* Returns whether two interfaces represent the same interface. References to interfaces in the same
* process will always be equivalent. However, in order to compare a service that is a proxy to a
* different process, its underlying structure may have to be checked.
*/
bool interfacesEqual(const sp<::android::hidl::base::V1_0::IBase>& left,
const sp<::android::hidl::base::V1_0::IBase>& right);
bool interfacesEqual(const sp<IBase>& left, const sp<IBase>& right) {
if (left == nullptr || right == nullptr || !left->isRemote() || !right->isRemote()) {
return left == right;
}
return getOrCreateCachedBinder(left.get()) == getOrCreateCachedBinder(right.get());
}
【 在 bihai 的大作中提到: 】
: 刚查到,在安卓代码库里面有个例子Thermal.cpp
: using ::android::hardware::interfacesEqual;
: // std::vector<CallbackSetting> callbacks_;
: ...................
--
修改:z16166 FROM 221.218.160.*
FROM 221.218.160.*