RCTSurfaceRegistry.mm 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /*
  2. * Copyright (c) Facebook, Inc. and its affiliates.
  3. *
  4. * This source code is licensed under the MIT license found in the
  5. * LICENSE file in the root directory of this source tree.
  6. */
  7. #import "RCTSurfaceRegistry.h"
  8. #import <better/mutex.h>
  9. #import <mutex>
  10. #import <shared_mutex>
  11. #import <React/RCTFabricSurface.h>
  12. using namespace facebook;
  13. @implementation RCTSurfaceRegistry {
  14. better::shared_mutex _mutex;
  15. NSMapTable<id, RCTFabricSurface *> *_registry;
  16. }
  17. - (instancetype)init
  18. {
  19. if (self = [super init]) {
  20. _registry = [NSMapTable mapTableWithKeyOptions:NSPointerFunctionsIntegerPersonality | NSPointerFunctionsOpaqueMemory
  21. valueOptions:NSPointerFunctionsObjectPersonality | NSPointerFunctionsWeakMemory];
  22. }
  23. return self;
  24. }
  25. - (void)enumerateWithBlock:(RCTSurfaceEnumeratorBlock)block
  26. {
  27. std::shared_lock<better::shared_mutex> lock(_mutex);
  28. block([_registry objectEnumerator]);
  29. }
  30. - (void)registerSurface:(RCTFabricSurface *)surface
  31. {
  32. std::unique_lock<better::shared_mutex> lock(_mutex);
  33. ReactTag rootTag = surface.rootViewTag.integerValue;
  34. [_registry setObject:surface forKey:(__bridge id)(void *)rootTag];
  35. }
  36. - (void)unregisterSurface:(RCTFabricSurface *)surface
  37. {
  38. std::unique_lock<better::shared_mutex> lock(_mutex);
  39. ReactTag rootTag = surface.rootViewTag.integerValue;
  40. [_registry removeObjectForKey:(__bridge id)(void *)rootTag];
  41. }
  42. - (RCTFabricSurface *)surfaceForRootTag:(ReactTag)rootTag
  43. {
  44. std::shared_lock<better::shared_mutex> lock(_mutex);
  45. return [_registry objectForKey:(__bridge id)(void *)rootTag];
  46. }
  47. @end