Index: src/OFKernelEventObserver.h ================================================================== --- src/OFKernelEventObserver.h +++ src/OFKernelEventObserver.h @@ -59,10 +59,19 @@ * @brief This callback is called when an object did get ready for writing. * * @param object The object which did become ready for writing */ - (void)objectIsReadyForWriting: (id)object; + +#ifdef OF_AMIGAOS +/*! + * @brief This callback is called when an Exec Signal was received. + * + * @note This is only available on AmigaOS! + */ +- (void)execSignalWasReceived: (ULONG)signalMask; +#endif @end /*! * @protocol OFReadyForReadingObserving * OFKernelEventObserver.h ObjFW/OFKernelEventObserver.h @@ -119,17 +128,29 @@ #ifdef OF_HAVE_THREADS OFMutex *_mutex; #endif OFMutableData *_queueActions; OFMutableArray *_queueObjects; +#ifdef OF_AMIGAOS + ULONG _execSignalMask; +#endif } /*! * @brief The delegate for the OFKernelEventObserver. */ @property OF_NULLABLE_PROPERTY (assign, nonatomic) id delegate; + +#ifdef OF_AMIGAOS +/*! + * @brief A mask of Exec Signals to wait for. + * + * @note This is only available on AmigaOS! + */ +@property (nonatomic) ULONG execSignalMask; +#endif /*! * @brief Creates a new OFKernelEventObserver. * * @return A new, autoreleased OFKernelEventObserver Index: src/OFKernelEventObserver.m ================================================================== --- src/OFKernelEventObserver.m +++ src/OFKernelEventObserver.m @@ -63,10 +63,13 @@ }; #define QUEUE_ACTION (QUEUE_ADD | QUEUE_REMOVE) @implementation OFKernelEventObserver @synthesize delegate = _delegate; +#ifdef OF_AMIGAOS +@synthesize execSignalMask = _execSignalMask; +#endif + (void)initialize { if (self != [OFKernelEventObserver class]) return; Index: src/OFSelectKernelEventObserver.m ================================================================== --- src/OFSelectKernelEventObserver.m +++ src/OFSelectKernelEventObserver.m @@ -141,10 +141,13 @@ id const *objects; fd_set readFDs; fd_set writeFDs; struct timeval timeout; int events; +#ifdef OF_AMIGAOS + ULONG execSignalMask; +#endif size_t count; [self of_processQueue]; if ([self of_processReadBuffers]) @@ -169,16 +172,28 @@ #else timeout.tv_sec = (long)timeInterval; #endif timeout.tv_usec = (int)lrint((timeInterval - timeout.tv_sec) * 1000); +#ifdef OF_AMIGAOS + execSignalMask = _execSignalMask; + events = WaitSelect(_maxFD + 1, &readFDs, &writeFDs, NULL, + (void *)(timeInterval != -1 ? &timeout : NULL), &execSignalMask); +#else events = select(_maxFD + 1, &readFDs, &writeFDs, NULL, (timeInterval != -1 ? &timeout : NULL)); +#endif if (events < 0) @throw [OFObserveFailedException exceptionWithObserver: self errNo: errno]; + +#ifdef OF_AMIGAOS + if (execSignalMask != 0 && + [_delegate respondsToSelector: @selector(execSignalWasReceived:)]) + [_delegate execSignalWasReceived: execSignalMask]; +#endif if (FD_ISSET(_cancelFD[0], &readFDs)) { char buffer; #ifdef OF_HAVE_PIPE Index: src/socket_helpers.h ================================================================== --- src/socket_helpers.h +++ src/socket_helpers.h @@ -71,23 +71,10 @@ #ifdef OF_MORPHOS_IXEMUL typedef uint32_t in_addr_t; #endif -#if defined(OF_AMIGAOS_M68K) -# define select(nfds, readfds, writefds, errorfds, timeout) \ - WaitSelect(nfds, readfds, writefds, errorfds, (struct __timeval *)timeout, \ - NULL) -#elif defined(OF_AMIGAOS4) -# define select(nfds, readfds, writefds, errorfds, timeout) \ - WaitSelect(nfds, readfds, writefds, errorfds, (struct TimeVal *)timeout, \ - NULL) -#elif defined(OF_MORPHOS) -# define select(nfds, readfds, writefds, errorfds, timeout) \ - WaitSelect(nfds, readfds, writefds, errorfds, timeout, NULL) -#endif - #ifdef OF_WII # define accept(sock, addr, addrlen) net_accept(sock, addr, addrlen) # define bind(sock, addr, addrlen) net_bind(sock, addr, addrlen) # define closesocket(sock) net_close(sock) # define connect(sock, addr, addrlen) \