1 // 2 // 3 // Copyright 2018 gRPC authors. 4 // 5 // Licensed under the Apache License, Version 2.0 (the "License"); 6 // you may not use this file except in compliance with the License. 7 // You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, software 12 // distributed under the License is distributed on an "AS IS" BASIS, 13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 // See the License for the specific language governing permissions and 15 // limitations under the License. 16 // 17 // 18 19 // The CFStream handle acts as an event synchronization entity for 20 // read/write/open/error/eos events happening on CFStream streams. 21 22 #ifndef GRPC_SRC_CORE_LIB_IOMGR_CFSTREAM_HANDLE_H 23 #define GRPC_SRC_CORE_LIB_IOMGR_CFSTREAM_HANDLE_H 24 25 #include <grpc/support/port_platform.h> 26 27 #include "src/core/lib/iomgr/port.h" 28 29 #ifdef GRPC_CFSTREAM 30 #import <CoreFoundation/CoreFoundation.h> 31 32 #include "src/core/lib/gprpp/memory.h" 33 #include "src/core/lib/iomgr/closure.h" 34 #include "src/core/lib/iomgr/lockfree_event.h" 35 36 class GrpcLibraryInitHolder { 37 public: 38 GrpcLibraryInitHolder(); 39 virtual ~GrpcLibraryInitHolder(); 40 }; 41 42 class CFStreamHandle : public GrpcLibraryInitHolder { 43 public: 44 static CFStreamHandle* CreateStreamHandle(CFReadStreamRef read_stream, 45 CFWriteStreamRef write_stream); 46 /// Use CreateStreamHandle function instead of using this directly. 47 CFStreamHandle(CFReadStreamRef read_stream, CFWriteStreamRef write_stream); 48 CFStreamHandle(const CFStreamHandle& ref) = delete; 49 CFStreamHandle(CFStreamHandle&& ref) = delete; 50 CFStreamHandle& operator=(const CFStreamHandle& rhs) = delete; 51 ~CFStreamHandle() override; 52 53 void NotifyOnOpen(grpc_closure* closure); 54 void NotifyOnRead(grpc_closure* closure); 55 void NotifyOnWrite(grpc_closure* closure); 56 void Shutdown(grpc_error_handle error); 57 58 void Ref(const char* file = "", int line = 0, const char* reason = nullptr); 59 void Unref(const char* file = "", int line = 0, const char* reason = nullptr); 60 61 private: 62 static void ReadCallback(CFReadStreamRef stream, CFStreamEventType type, 63 void* client_callback_info); 64 static void WriteCallback(CFWriteStreamRef stream, CFStreamEventType type, 65 void* client_callback_info); 66 static void* Retain(void* info); 67 static void Release(void* info); 68 69 grpc_core::LockfreeEvent open_event_; 70 grpc_core::LockfreeEvent read_event_; 71 grpc_core::LockfreeEvent write_event_; 72 73 dispatch_queue_t dispatch_queue_; 74 75 gpr_refcount refcount_; 76 }; 77 78 #ifdef DEBUG 79 #define CFSTREAM_HANDLE_REF(handle, reason) \ 80 (handle)->Ref(__FILE__, __LINE__, (reason)) 81 #define CFSTREAM_HANDLE_UNREF(handle, reason) \ 82 (handle)->Unref(__FILE__, __LINE__, (reason)) 83 #else 84 #define CFSTREAM_HANDLE_REF(handle, reason) (handle)->Ref() 85 #define CFSTREAM_HANDLE_UNREF(handle, reason) (handle)->Unref() 86 #endif 87 88 #endif 89 90 #endif // GRPC_SRC_CORE_LIB_IOMGR_CFSTREAM_HANDLE_H 91