25 #import <CoreFoundation/CoreFoundation.h>
40 GrpcLibraryInitHolder::GrpcLibraryInitHolder() {
grpc_init(); }
42 GrpcLibraryInitHolder::~GrpcLibraryInitHolder() {
grpc_shutdown(); }
44 void* CFStreamHandle::Retain(
void* info) {
45 CFStreamHandle*
handle =
static_cast<CFStreamHandle*
>(info);
46 CFSTREAM_HANDLE_REF(
handle,
"retain");
50 void CFStreamHandle::Release(
void* info) {
51 CFStreamHandle*
handle =
static_cast<CFStreamHandle*
>(info);
52 CFSTREAM_HANDLE_UNREF(
handle,
"release");
55 CFStreamHandle* CFStreamHandle::CreateStreamHandle(
56 CFReadStreamRef read_stream, CFWriteStreamRef write_stream) {
57 return new CFStreamHandle(read_stream, write_stream);
60 void CFStreamHandle::ReadCallback(CFReadStreamRef
stream,
61 CFStreamEventType
type,
62 void* client_callback_info) {
66 CFErrorRef stream_error;
67 CFStreamHandle*
handle =
static_cast<CFStreamHandle*
>(client_callback_info);
73 case kCFStreamEventOpenCompleted:
74 handle->open_event_.SetReady();
76 case kCFStreamEventHasBytesAvailable:
77 case kCFStreamEventEndEncountered:
78 handle->read_event_.SetReady();
80 case kCFStreamEventErrorOccurred:
81 stream_error = CFReadStreamCopyError(
stream);
83 GRPC_ERROR_CREATE_FROM_CFERROR(stream_error,
"read error"),
85 CFRelease(stream_error);
95 void CFStreamHandle::WriteCallback(CFWriteStreamRef
stream,
96 CFStreamEventType
type,
97 void* clientCallBackInfo) {
101 CFErrorRef stream_error;
102 CFStreamHandle*
handle =
static_cast<CFStreamHandle*
>(clientCallBackInfo);
108 case kCFStreamEventOpenCompleted:
109 handle->open_event_.SetReady();
111 case kCFStreamEventCanAcceptBytes:
112 case kCFStreamEventEndEncountered:
113 handle->write_event_.SetReady();
115 case kCFStreamEventErrorOccurred:
116 stream_error = CFWriteStreamCopyError(
stream);
118 GRPC_ERROR_CREATE_FROM_CFERROR(stream_error,
"write error"),
120 CFRelease(stream_error);
131 CFStreamHandle::CFStreamHandle(CFReadStreamRef read_stream,
132 CFWriteStreamRef write_stream) {
134 open_event_.InitEvent();
135 read_event_.InitEvent();
136 write_event_.InitEvent();
137 dispatch_queue_ = dispatch_queue_create(
nullptr, DISPATCH_QUEUE_SERIAL);
138 CFStreamClientContext
ctx = {0,
static_cast<void*
>(
this),
139 CFStreamHandle::Retain, CFStreamHandle::Release,
141 CFReadStreamSetClient(
143 kCFStreamEventOpenCompleted | kCFStreamEventHasBytesAvailable |
144 kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered,
145 CFStreamHandle::ReadCallback, &
ctx);
146 CFWriteStreamSetClient(
148 kCFStreamEventOpenCompleted | kCFStreamEventCanAcceptBytes |
149 kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered,
150 CFStreamHandle::WriteCallback, &
ctx);
151 grpc_apple_register_read_stream(read_stream, dispatch_queue_);
152 grpc_apple_register_write_stream(write_stream, dispatch_queue_);
155 CFStreamHandle::~CFStreamHandle() {
156 open_event_.DestroyEvent();
157 read_event_.DestroyEvent();
158 write_event_.DestroyEvent();
159 dispatch_release(dispatch_queue_);
171 write_event_.NotifyOn(
closure);
185 "CFStream Handle ref %p : %s %" PRIdPTR
" -> %" PRIdPTR,
this,
186 reason, val, val + 1);
191 void CFStreamHandle::Unref(
const char*
file,
int line,
const char* reason) {
195 "CFStream Handle unref %p : %s %" PRIdPTR
" -> %" PRIdPTR,
this,
196 reason, val, val - 1);