Index: src/OFRunLoop+Private.h ================================================================== --- src/OFRunLoop+Private.h +++ src/OFRunLoop+Private.h @@ -39,100 +39,91 @@ + (void)of_addAsyncReadForStream: (OFStream *) stream buffer: (void *)buffer length: (size_t)length mode: (of_run_loop_mode_t)mode - delegate: (id )delegate; +# ifdef OF_HAVE_BLOCKS + block: (nullable of_stream_async_read_block_t)block +# endif + delegate: (nullable id )delegate; + (void)of_addAsyncReadForStream: (OFStream *) stream buffer: (void *)buffer exactLength: (size_t)length mode: (of_run_loop_mode_t)mode - delegate: (id )delegate; +# ifdef OF_HAVE_BLOCKS + block: (nullable of_stream_async_read_block_t)block +# endif + delegate: (nullable id )delegate; + (void)of_addAsyncReadLineForStream: (OFStream *) stream encoding: (of_string_encoding_t)encoding mode: (of_run_loop_mode_t)mode - delegate: (id )delegate; +# ifdef OF_HAVE_BLOCKS + block: (nullable + of_stream_async_read_line_block_t) + block +# endif + delegate: (nullable id )delegate; + (void)of_addAsyncWriteForStream: (OFStream *) stream data: (OFData *)data mode: (of_run_loop_mode_t)mode - delegate: (id )delegate; +# ifdef OF_HAVE_BLOCKS + block: (nullable of_stream_async_write_data_block_t) + block +# endif + delegate: (nullable id )delegate; + (void)of_addAsyncWriteForStream: (OFStream *) stream string: (OFString *)string encoding: (of_string_encoding_t)encoding mode: (of_run_loop_mode_t)mode - delegate: (id )delegate; +# ifdef OF_HAVE_BLOCKS + block: (nullable + of_stream_async_write_string_block_t) + block +# endif + delegate: (nullable id )delegate; + (void)of_addAsyncConnectForTCPSocket: (OFTCPSocket *)socket mode: (of_run_loop_mode_t)mode delegate: (id ) delegate; + (void)of_addAsyncAcceptForTCPSocket: (OFTCPSocket *)socket mode: (of_run_loop_mode_t)mode - delegate: (id )delegate; -+ (void)of_addAsyncReceiveForUDPSocket: (OFUDPSocket *)socket - buffer: (void *)buffer - length: (size_t)length - mode: (of_run_loop_mode_t)mode - delegate: (id )delegate; -+ (void)of_addAsyncSendForUDPSocket: (OFUDPSocket *)socket - buffer: (const void *)buffer - length: (size_t)length - receiver: (of_socket_address_t)receiver - mode: (of_run_loop_mode_t)mode - delegate: (id )delegate; -# ifdef OF_HAVE_BLOCKS -+ (void)of_addAsyncReadForStream: (OFStream *) - stream - buffer: (void *)buffer - length: (size_t)length - mode: (of_run_loop_mode_t)mode - block: (of_stream_async_read_block_t)block; -+ (void)of_addAsyncReadForStream: (OFStream *) - stream - buffer: (void *)buffer - exactLength: (size_t)length - mode: (of_run_loop_mode_t)mode - block: (of_stream_async_read_block_t)block; -+ (void)of_addAsyncReadLineForStream: (OFStream *) - stream - encoding: (of_string_encoding_t)encoding - mode: (of_run_loop_mode_t)mode - block: (of_stream_async_read_line_block_t)block; -+ (void)of_addAsyncWriteForStream: (OFStream *) - stream - data: (OFData *)data - mode: (of_run_loop_mode_t)mode - block: (of_stream_async_write_data_block_t)block; -+ (void)of_addAsyncWriteForStream: (OFStream *) - stream - string: (OFString *)string - encoding: (of_string_encoding_t)encoding - mode: (of_run_loop_mode_t)mode - block: (of_stream_async_write_string_block_t)block; -+ (void)of_addAsyncAcceptForTCPSocket: (OFTCPSocket *)socket - mode: (of_run_loop_mode_t)mode - block: (of_tcp_socket_async_accept_block_t) - block; -+ (void)of_addAsyncReceiveForUDPSocket: (OFUDPSocket *)socket - buffer: (void *)buffer - length: (size_t)length - mode: (of_run_loop_mode_t)mode - block: (of_udp_socket_async_receive_block_t) - block; -+ (void)of_addAsyncSendForUDPSocket: (OFUDPSocket *)socket - buffer: (const void *)buffer - length: (size_t)length - receiver: (of_socket_address_t)receiver - mode: (of_run_loop_mode_t)mode - block: (of_udp_socket_async_send_block_t)block; -# endif +# ifdef OF_HAVE_BLOCKS + block: (nullable + of_tcp_socket_async_accept_block_t) + block +# endif + delegate: (nullable id ) + delegate; ++ (void)of_addAsyncReceiveForUDPSocket: (OFUDPSocket *)socket + buffer: (void *)buffer + length: (size_t)length + mode: (of_run_loop_mode_t)mode +# ifdef OF_HAVE_BLOCKS + block: (nullable + of_udp_socket_async_receive_block_t) + block +# endif + delegate: (nullable id ) + delegate; ++ (void)of_addAsyncSendForUDPSocket: (OFUDPSocket *)socket + buffer: (const void *)buffer + length: (size_t)length + receiver: (of_socket_address_t)receiver + mode: (of_run_loop_mode_t)mode +# ifdef OF_HAVE_BLOCKS + block: (nullable of_udp_socket_async_send_block_t) + block +# endif + delegate: (nullable id ) + delegate; + (void)of_cancelAsyncRequestsForObject: (id)object mode: (of_run_loop_mode_t)mode; #endif - (void)of_removeTimer: (OFTimer *)timer forMode: (of_run_loop_mode_t)mode; @end OF_ASSUME_NONNULL_END Index: src/OFRunLoop.m ================================================================== --- src/OFRunLoop.m +++ src/OFRunLoop.m @@ -779,11 +779,11 @@ { mainRunLoop = [runLoop retain]; } #ifdef OF_HAVE_SOCKETS -# define ADD_READ(type, object, mode, code) \ +# define NEW_READ(type, object, mode) \ void *pool = objc_autoreleasePoolPush(); \ OFRunLoop *runLoop = [self currentRunLoop]; \ OFRunLoop_State *state = [runLoop of_stateForMode: mode \ create: true]; \ OFList *queue = [state->_readQueues objectForKey: object]; \ @@ -797,16 +797,12 @@ \ if ([queue count] == 0) \ [state->_kernelEventObserver \ addObjectForReading: object]; \ \ - queueItem = [[[type alloc] init] autorelease]; \ - code \ - [queue appendObject: queueItem]; \ - \ - objc_autoreleasePoolPop(pool); -# define ADD_WRITE(type, object, mode, code) \ + queueItem = [[[type alloc] init] autorelease]; +# define NEW_WRITE(type, object, mode) \ void *pool = objc_autoreleasePoolPush(); \ OFRunLoop *runLoop = [self currentRunLoop]; \ OFRunLoop_State *state = [runLoop of_stateForMode: mode \ create: true]; \ OFList *queue = [state->_writeQueues objectForKey: object]; \ @@ -820,236 +816,198 @@ \ if ([queue count] == 0) \ [state->_kernelEventObserver \ addObjectForWriting: object]; \ \ - queueItem = [[[type alloc] init] autorelease]; \ - code \ + queueItem = [[[type alloc] init] autorelease]; +#define QUEUE_ITEM \ [queue appendObject: queueItem]; \ \ objc_autoreleasePoolPop(pool); + (void)of_addAsyncReadForStream: (OFStream *) stream buffer: (void *)buffer length: (size_t)length mode: (of_run_loop_mode_t)mode +# ifdef OF_HAVE_BLOCKS + block: (of_stream_async_read_block_t)block +# endif delegate: (id )delegate { - ADD_READ(OFRunLoop_ReadQueueItem, stream, mode, { - queueItem->_delegate = [delegate retain]; - queueItem->_buffer = buffer; - queueItem->_length = length; - }) + NEW_READ(OFRunLoop_ReadQueueItem, stream, mode) + + queueItem->_delegate = [delegate retain]; +# ifdef OF_HAVE_BLOCKS + queueItem->_block = [block copy]; +# endif + queueItem->_buffer = buffer; + queueItem->_length = length; + + QUEUE_ITEM } + (void)of_addAsyncReadForStream: (OFStream *) stream buffer: (void *)buffer exactLength: (size_t)exactLength mode: (of_run_loop_mode_t)mode +# ifdef OF_HAVE_BLOCKS + block: (of_stream_async_read_block_t)block +# endif delegate: (id )delegate { - ADD_READ(OFRunLoop_ExactReadQueueItem, stream, mode, { - queueItem->_delegate = [delegate retain]; - queueItem->_buffer = buffer; - queueItem->_exactLength = exactLength; - }) + NEW_READ(OFRunLoop_ExactReadQueueItem, stream, mode) + + queueItem->_delegate = [delegate retain]; +# ifdef OF_HAVE_BLOCKS + queueItem->_block = [block copy]; +# endif + queueItem->_buffer = buffer; + queueItem->_exactLength = exactLength; + + QUEUE_ITEM } + (void)of_addAsyncReadLineForStream: (OFStream *) stream encoding: (of_string_encoding_t)encoding mode: (of_run_loop_mode_t)mode +# ifdef OF_HAVE_BLOCKS + block: (of_stream_async_read_line_block_t)block +# endif delegate: (id )delegate { - ADD_READ(OFRunLoop_ReadLineQueueItem, stream, mode, { - queueItem->_delegate = [delegate retain]; - queueItem->_encoding = encoding; - }) + NEW_READ(OFRunLoop_ReadLineQueueItem, stream, mode) + + queueItem->_delegate = [delegate retain]; +# ifdef OF_HAVE_BLOCKS + queueItem->_block = [block copy]; +# endif + queueItem->_encoding = encoding; + + QUEUE_ITEM } + (void)of_addAsyncWriteForStream: (OFStream *) stream data: (OFData *)data mode: (of_run_loop_mode_t)mode +# ifdef OF_HAVE_BLOCKS + block: (of_stream_async_write_data_block_t)block +# endif delegate: (id )delegate { - ADD_WRITE(OFRunLoop_WriteDataQueueItem, stream, mode, { - queueItem->_delegate = [delegate retain]; - queueItem->_data = [data copy]; - }) + NEW_WRITE(OFRunLoop_WriteDataQueueItem, stream, mode) + + queueItem->_delegate = [delegate retain]; +# ifdef OF_HAVE_BLOCKS + queueItem->_block = [block copy]; +# endif + queueItem->_data = [data copy]; + + QUEUE_ITEM } + (void)of_addAsyncWriteForStream: (OFStream *) stream string: (OFString *)string encoding: (of_string_encoding_t)encoding mode: (of_run_loop_mode_t)mode +# ifdef OF_HAVE_BLOCKS + block: (of_stream_async_write_string_block_t)block +# endif delegate: (id )delegate { - ADD_WRITE(OFRunLoop_WriteStringQueueItem, stream, mode, { - queueItem->_delegate = [delegate retain]; - queueItem->_string = [string copy]; - queueItem->_encoding = encoding; - }) + NEW_WRITE(OFRunLoop_WriteStringQueueItem, stream, mode) + + queueItem->_delegate = [delegate retain]; +# ifdef OF_HAVE_BLOCKS + queueItem->_block = [block copy]; +# endif + queueItem->_string = [string copy]; + queueItem->_encoding = encoding; + + QUEUE_ITEM } + (void)of_addAsyncConnectForTCPSocket: (OFTCPSocket *)stream mode: (of_run_loop_mode_t)mode delegate: (id ) delegate { - ADD_WRITE(OFRunLoop_ConnectQueueItem, stream, mode, { - queueItem->_delegate = [delegate retain]; - }) + NEW_WRITE(OFRunLoop_ConnectQueueItem, stream, mode) + + queueItem->_delegate = [delegate retain]; + + QUEUE_ITEM } + (void)of_addAsyncAcceptForTCPSocket: (OFTCPSocket *)stream mode: (of_run_loop_mode_t)mode +# ifdef OF_HAVE_BLOCKS + block: (of_tcp_socket_async_accept_block_t)block +# endif delegate: (id )delegate { - ADD_READ(OFRunLoop_AcceptQueueItem, stream, mode, { - queueItem->_delegate = [delegate retain]; - }) + NEW_READ(OFRunLoop_AcceptQueueItem, stream, mode) + + queueItem->_delegate = [delegate retain]; +# ifdef OF_HAVE_BLOCKS + queueItem->_block = [block copy]; +# endif + + QUEUE_ITEM } + (void)of_addAsyncReceiveForUDPSocket: (OFUDPSocket *)sock buffer: (void *)buffer length: (size_t)length mode: (of_run_loop_mode_t)mode +# ifdef OF_HAVE_BLOCKS + block: (of_udp_socket_async_receive_block_t) + block +# endif delegate: (id )delegate { - ADD_READ(OFRunLoop_UDPReceiveQueueItem, sock, mode, { - queueItem->_delegate = [delegate retain]; - queueItem->_buffer = buffer; - queueItem->_length = length; - }) + NEW_READ(OFRunLoop_UDPReceiveQueueItem, sock, mode) + + queueItem->_delegate = [delegate retain]; +# ifdef OF_HAVE_BLOCKS + queueItem->_block = [block copy]; +# endif + queueItem->_buffer = buffer; + queueItem->_length = length; + + QUEUE_ITEM } + (void)of_addAsyncSendForUDPSocket: (OFUDPSocket *)sock buffer: (const void *)buffer length: (size_t)length receiver: (of_socket_address_t)receiver mode: (of_run_loop_mode_t)mode +# ifdef OF_HAVE_BLOCKS + block: (of_udp_socket_async_send_block_t)block +# endif delegate: (id )delegate { - ADD_WRITE(OFRunLoop_UDPSendQueueItem, sock, mode, { - queueItem->_delegate = [delegate retain]; - queueItem->_buffer = buffer; - queueItem->_length = length; - queueItem->_receiver = receiver; - }) -} - + NEW_WRITE(OFRunLoop_UDPSendQueueItem, sock, mode) + + queueItem->_delegate = [delegate retain]; # ifdef OF_HAVE_BLOCKS -+ (void)of_addAsyncReadForStream: (OFStream *) - stream - buffer: (void *)buffer - length: (size_t)length - mode: (of_run_loop_mode_t)mode - block: (of_stream_async_read_block_t)block -{ - ADD_READ(OFRunLoop_ReadQueueItem, stream, mode, { - queueItem->_block = [block copy]; - queueItem->_buffer = buffer; - queueItem->_length = length; - }) -} - -+ (void)of_addAsyncReadForStream: (OFStream *) - stream - buffer: (void *)buffer - exactLength: (size_t)exactLength - mode: (of_run_loop_mode_t)mode - block: (of_stream_async_read_block_t)block -{ - ADD_READ(OFRunLoop_ExactReadQueueItem, stream, mode, { - queueItem->_block = [block copy]; - queueItem->_buffer = buffer; - queueItem->_exactLength = exactLength; - }) -} - -+ (void)of_addAsyncReadLineForStream: (OFStream *) - stream - encoding: (of_string_encoding_t)encoding - mode: (of_run_loop_mode_t)mode - block: (of_stream_async_read_line_block_t)block -{ - ADD_READ(OFRunLoop_ReadLineQueueItem, stream, mode, { - queueItem->_block = [block copy]; - queueItem->_encoding = encoding; - }) -} - -+ (void)of_addAsyncWriteForStream: (OFStream *) - stream - data: (OFData *)data - mode: (of_run_loop_mode_t)mode - block: (of_stream_async_write_data_block_t)block -{ - ADD_WRITE(OFRunLoop_WriteDataQueueItem, stream, mode, { - queueItem->_data = [data copy]; - queueItem->_block = [block copy]; - }) -} - -+ (void)of_addAsyncWriteForStream: (OFStream *) - stream - string: (OFString *)string - encoding: (of_string_encoding_t)encoding - mode: (of_run_loop_mode_t)mode - block: (of_stream_async_write_string_block_t)block -{ - ADD_WRITE(OFRunLoop_WriteStringQueueItem, stream, mode, { - queueItem->_string = [string copy]; - queueItem->_encoding = encoding; - queueItem->_block = [block copy]; - }) -} - -+ (void)of_addAsyncAcceptForTCPSocket: (OFTCPSocket *)stream - mode: (of_run_loop_mode_t)mode - block: (of_tcp_socket_async_accept_block_t)block -{ - ADD_READ(OFRunLoop_AcceptQueueItem, stream, mode, { - queueItem->_block = [block copy]; - }) -} - -+ (void)of_addAsyncReceiveForUDPSocket: (OFUDPSocket *)sock - buffer: (void *)buffer - length: (size_t)length - mode: (of_run_loop_mode_t)mode - block: (of_udp_socket_async_receive_block_t) - block -{ - ADD_READ(OFRunLoop_UDPReceiveQueueItem, sock, mode, { - queueItem->_block = [block copy]; - queueItem->_buffer = buffer; - queueItem->_length = length; - }) -} - -+ (void)of_addAsyncSendForUDPSocket: (OFUDPSocket *)sock - buffer: (const void *)buffer - length: (size_t)length - receiver: (of_socket_address_t)receiver - mode: (of_run_loop_mode_t)mode - block: (of_udp_socket_async_send_block_t)block -{ - ADD_WRITE(OFRunLoop_UDPSendQueueItem, sock, mode, { - queueItem->_block = [block copy]; - queueItem->_buffer = buffer; - queueItem->_length = length; - queueItem->_receiver = receiver; - }) -} + queueItem->_block = [block copy]; # endif -# undef ADD_READ -# undef ADD_WRITE + queueItem->_buffer = buffer; + queueItem->_length = length; + queueItem->_receiver = receiver; + + QUEUE_ITEM +} +# undef NEW_READ +# undef NEW_WRITE +# undef QUEUE_ITEM + (void)of_cancelAsyncRequestsForObject: (id)object mode: (of_run_loop_mode_t)mode { void *pool = objc_autoreleasePoolPush(); Index: src/OFStream.m ================================================================== --- src/OFStream.m +++ src/OFStream.m @@ -212,10 +212,13 @@ [OFRunLoop of_addAsyncReadForStream: stream buffer: buffer length: length mode: runLoopMode +# ifdef OF_HAVE_BLOCKS + block: NULL +# endif delegate: _delegate]; } - (void)asyncReadIntoBuffer: (void *)buffer exactLength: (size_t)length @@ -234,10 +237,13 @@ [OFRunLoop of_addAsyncReadForStream: stream buffer: buffer exactLength: length mode: runLoopMode +# ifdef OF_HAVE_BLOCKS + block: NULL +# endif delegate: _delegate]; } # ifdef OF_HAVE_BLOCKS - (void)asyncReadIntoBuffer: (void *)buffer @@ -260,11 +266,12 @@ [OFRunLoop of_addAsyncReadForStream: stream buffer: buffer length: length mode: runLoopMode - block: block]; + block: block + delegate: nil]; } - (void)asyncReadIntoBuffer: (void *)buffer exactLength: (size_t)length block: (of_stream_async_read_block_t)block @@ -285,11 +292,12 @@ [OFRunLoop of_addAsyncReadForStream: stream buffer: buffer exactLength: length mode: runLoopMode - block: block]; + block: block + delegate: nil]; } # endif #endif - (uint8_t)readInt8 @@ -885,10 +893,13 @@ (OFStream *)self; [OFRunLoop of_addAsyncReadLineForStream: stream encoding: encoding mode: runLoopMode +# ifdef OF_HAVE_BLOCKS + block: NULL +# endif delegate: _delegate]; } # ifdef OF_HAVE_BLOCKS - (void)asyncReadLineWithBlock: (of_stream_async_read_line_block_t)block @@ -914,11 +925,12 @@ (OFStream *)self; [OFRunLoop of_addAsyncReadLineForStream: stream encoding: encoding mode: runLoopMode - block: block]; + block: block + delegate: nil]; } # endif #endif - (OFString *)tryReadLine @@ -1179,10 +1191,13 @@ (OFStream *)self; [OFRunLoop of_addAsyncWriteForStream: stream data: data mode: runLoopMode +# ifdef OF_HAVE_BLOCKS + block: NULL +# endif delegate: _delegate]; } - (void)asyncWriteString: (OFString *)string { @@ -1208,10 +1223,13 @@ [OFRunLoop of_addAsyncWriteForStream: stream string: string encoding: encoding mode: runLoopMode +# ifdef OF_HAVE_BLOCKS + block: NULL +# endif delegate: _delegate]; } # ifdef OF_HAVE_BLOCKS - (void)asyncWriteData: (OFData *)data @@ -1230,11 +1248,12 @@ (OFStream *)self; [OFRunLoop of_addAsyncWriteForStream: stream data: data mode: runLoopMode - block: block]; + block: block + delegate: nil]; } - (void)asyncWriteString: (OFString *)string block: (of_stream_async_write_string_block_t)block { @@ -1264,11 +1283,12 @@ [OFRunLoop of_addAsyncWriteForStream: stream string: string encoding: encoding mode: runLoopMode - block: block]; + block: block + delegate: nil]; } # endif #endif - (void)writeInt8: (uint8_t)int8 Index: src/OFTCPSocket.m ================================================================== --- src/OFTCPSocket.m +++ src/OFTCPSocket.m @@ -999,10 +999,13 @@ - (void)asyncAcceptWithRunLoopMode: (of_run_loop_mode_t)runLoopMode { [OFRunLoop of_addAsyncAcceptForTCPSocket: self mode: runLoopMode +# ifdef OF_HAVE_BLOCKS + block: NULL +# endif delegate: _delegate]; } #ifdef OF_HAVE_BLOCKS - (void)asyncAcceptWithBlock: (of_tcp_socket_async_accept_block_t)block @@ -1014,11 +1017,12 @@ - (void)asyncAcceptWithRunLoopMode: (of_run_loop_mode_t)runLoopMode block: (of_tcp_socket_async_accept_block_t)block { [OFRunLoop of_addAsyncAcceptForTCPSocket: self mode: runLoopMode - block: block]; + block: block + delegate: nil]; } #endif - (const of_socket_address_t *)remoteAddress { Index: src/OFUDPSocket.m ================================================================== --- src/OFUDPSocket.m +++ src/OFUDPSocket.m @@ -341,10 +341,13 @@ { [OFRunLoop of_addAsyncReceiveForUDPSocket: self buffer: buffer length: length mode: runLoopMode +# ifdef OF_HAVE_BLOCKS + block: NULL +# endif delegate: _delegate]; } #ifdef OF_HAVE_BLOCKS - (void)asyncReceiveIntoBuffer: (void *)buffer @@ -364,11 +367,12 @@ { [OFRunLoop of_addAsyncReceiveForUDPSocket: self buffer: buffer length: length mode: runLoopMode - block: block]; + block: block + delegate: nil]; } #endif - (void)sendBuffer: (const void *)buffer length: (size_t)length @@ -430,10 +434,13 @@ [OFRunLoop of_addAsyncSendForUDPSocket: self buffer: buffer length: length receiver: receiver mode: runLoopMode +# ifdef OF_HAVE_BLOCKS + block: NULL +# endif delegate: _delegate]; } #ifdef OF_HAVE_BLOCKS - (void)asyncSendBuffer: (const void *)buffer @@ -457,11 +464,12 @@ [OFRunLoop of_addAsyncSendForUDPSocket: self buffer: buffer length: length receiver: receiver mode: runLoopMode - block: block]; + block: block + delegate: nil]; } #endif - (void)cancelAsyncRequests {