EventHandlerWrapper::EventHandlerWrapper(const EventHandlerPtr& handler, Selector& selector) : _handler(handler), _streamNativeInfo(StreamNativeInfoPtr::dynamicCast(handler->getNativeInfo())), _selector(selector), _ready(SocketOperationNone), _finish(false), _socket(0), _source(0) { if(_streamNativeInfo) { _streamNativeInfo->initStreams(this); } else if(handler->getNativeInfo()) { SOCKET fd = handler->getNativeInfo()->fd(); CFSocketContext ctx = { 0, this, 0, 0, 0 }; _socket = CFSocketCreateWithNative(kCFAllocatorDefault, fd, kCFSocketReadCallBack | kCFSocketWriteCallBack | kCFSocketConnectCallBack, eventHandlerSocketCallback, &ctx); // Disable automatic re-enabling of callbacks and closing of the native socket. CFSocketSetSocketFlags(_socket, 0); CFSocketDisableCallBacks(_socket, kCFSocketReadCallBack | kCFSocketWriteCallBack | kCFSocketConnectCallBack); _source = CFSocketCreateRunLoopSource(kCFAllocatorDefault, _socket, 0); } }
void IceInternal::ThreadPool::initialize(const EventHandlerPtr& handler) { Lock sync(*this); assert(!_destroyed); _selector.initialize(handler.get()); class ReadyCallbackI : public ReadyCallback { public: ReadyCallbackI(const ThreadPoolPtr& threadPool, const EventHandlerPtr& handler) : _threadPool(threadPool), _handler(handler) { } virtual void ready(SocketOperation op, bool value) { _threadPool->ready(_handler, op, value); } private: const ThreadPoolPtr _threadPool; const EventHandlerPtr _handler; }; handler->getNativeInfo()->setReadyCallback(new ReadyCallbackI(this, handler)); }