Files
react-native/ReactCommon/fabric/imagemanager/ImageResponseObserverCoordinator.cpp
T
Valentin Shergin 69f9fd4f96 Fabirc: Improvements in ImageResponseObserverCoordinator
Summary:
This diff contains some small improvements in `ImageResponseObserverCoordinator` which are pretty minor:
 * Now we use `small_vector` instead of a normal one. In the vast majority of cases, the coordinator has only one observer, so having `small_vector` with default size `1` saves us a memory allocation (which is a dozen of allocations for a screen, not bad).
 * Empty constructor and destructor were removed.
 * Unnecessary copying of ImageResponse was removed. ImageResponse is a practically a shared_pointer, it has value semantic and does not need to be copied. We don't need to acquire mutex to access that.

Reviewed By: sammy-SC

Differential Revision: D17368740

fbshipit-source-id: 828e27a72b9c8ac0063c5fbda00f83ddb255309c
2019-09-23 15:59:44 -07:00

94 lines
2.5 KiB
C++

/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include "ImageResponseObserverCoordinator.h"
#include <algorithm>
namespace facebook {
namespace react {
void ImageResponseObserverCoordinator::addObserver(
ImageResponseObserver *observer) const {
ImageResponse::Status status = [this] {
std::shared_lock<better::shared_mutex> read(mutex_);
return status_;
}();
if (status == ImageResponse::Status::Loading) {
std::unique_lock<better::shared_mutex> write(mutex_);
observers_.push_back(observer);
} else if (status == ImageResponse::Status::Completed) {
ImageResponse imageResponseCopy = [this] {
std::unique_lock<better::shared_mutex> read(mutex_);
return ImageResponse(imageData_);
}();
observer->didReceiveImage(imageResponseCopy);
} else {
observer->didReceiveFailure();
}
}
void ImageResponseObserverCoordinator::removeObserver(
ImageResponseObserver *observer) const {
std::unique_lock<better::shared_mutex> write(mutex_);
auto position = std::find(observers_.begin(), observers_.end(), observer);
if (position != observers_.end()) {
observers_.erase(position, observers_.end());
}
}
void ImageResponseObserverCoordinator::nativeImageResponseProgress(
float progress) const {
auto observersCopy = [this] {
std::shared_lock<better::shared_mutex> read(mutex_);
return observers_;
}();
for (auto observer : observersCopy) {
observer->didReceiveProgress(progress);
}
}
void ImageResponseObserverCoordinator::nativeImageResponseComplete(
const ImageResponse &imageResponse) const {
{
std::unique_lock<better::shared_mutex> write(mutex_);
imageData_ = imageResponse.getImage();
status_ = ImageResponse::Status::Completed;
}
auto observersCopy = [this] {
std::shared_lock<better::shared_mutex> read(mutex_);
return observers_;
}();
for (auto observer : observersCopy) {
observer->didReceiveImage(imageResponse);
}
}
void ImageResponseObserverCoordinator::nativeImageResponseFailed() const {
{
std::unique_lock<better::shared_mutex> write(mutex_);
status_ = ImageResponse::Status::Failed;
}
auto observersCopy = [this] {
std::shared_lock<better::shared_mutex> read(mutex_);
return observers_;
}();
for (auto observer : observersCopy) {
observer->didReceiveFailure();
}
}
} // namespace react
} // namespace facebook