SRIOConsumerPool.m 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. //
  2. // Copyright 2012 Square Inc.
  3. // Portions Copyright (c) 2016-present, Facebook, Inc.
  4. //
  5. // All rights reserved.
  6. //
  7. // This source code is licensed under the BSD-style license found in the
  8. // LICENSE file in the root directory of this source tree. An additional grant
  9. // of patent rights can be found in the PATENTS file in the same directory.
  10. //
  11. #import "SRIOConsumerPool.h"
  12. @implementation SRIOConsumerPool {
  13. NSUInteger _poolSize;
  14. NSMutableArray<SRIOConsumer *> *_bufferedConsumers;
  15. }
  16. - (instancetype)initWithBufferCapacity:(NSUInteger)poolSize;
  17. {
  18. self = [super init];
  19. if (self) {
  20. _poolSize = poolSize;
  21. _bufferedConsumers = [NSMutableArray arrayWithCapacity:poolSize];
  22. }
  23. return self;
  24. }
  25. - (instancetype)init
  26. {
  27. return [self initWithBufferCapacity:8];
  28. }
  29. - (SRIOConsumer *)consumerWithScanner:(stream_scanner)scanner
  30. handler:(data_callback)handler
  31. bytesNeeded:(size_t)bytesNeeded
  32. readToCurrentFrame:(BOOL)readToCurrentFrame
  33. unmaskBytes:(BOOL)unmaskBytes
  34. {
  35. SRIOConsumer *consumer = nil;
  36. if (_bufferedConsumers.count) {
  37. consumer = [_bufferedConsumers lastObject];
  38. [_bufferedConsumers removeLastObject];
  39. } else {
  40. consumer = [[SRIOConsumer alloc] init];
  41. }
  42. [consumer resetWithScanner:scanner
  43. handler:handler
  44. bytesNeeded:bytesNeeded
  45. readToCurrentFrame:readToCurrentFrame
  46. unmaskBytes:unmaskBytes];
  47. return consumer;
  48. }
  49. - (void)returnConsumer:(SRIOConsumer *)consumer;
  50. {
  51. if (_bufferedConsumers.count < _poolSize) {
  52. [_bufferedConsumers addObject:consumer];
  53. }
  54. }
  55. @end