GRPC C++  1.39.1
cfstream_handle.h
Go to the documentation of this file.
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_CORE_LIB_IOMGR_CFSTREAM_HANDLE_H
23 #define GRPC_CORE_LIB_IOMGR_CFSTREAM_HANDLE_H
24 
26 
28 
29 #ifdef GRPC_CFSTREAM
30 #import <CoreFoundation/CoreFoundation.h>
31 
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);
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_CORE_LIB_IOMGR_CFSTREAM_HANDLE_H */
Definition: lockfree_event.h:32
grpc_error_handle error
Definition: lame_client.cc:54
grpc_closure closure
Definition: server.cc:460
Definition: sync_generic.h:36
A closure over a grpc_iomgr_cb_func.
Definition: closure.h:56
Definition: error_internal.h:41
DiscoveryMechanismType type
Definition: xds_cluster_resolver.cc:73