@@ -53,10 +53,14 @@ #import "OFOutOfRangeException.h" #import "socket.h" #import "socket_helpers.h" +#ifdef OF_AMIGAOS +# include +#endif + enum { QUEUE_ADD = 0, QUEUE_REMOVE = 1, QUEUE_READ = 0, QUEUE_WRITE = 2 @@ -105,22 +109,23 @@ - (instancetype)init { self = [super init]; @try { -#if !defined(OF_HAVE_PIPE) && !defined(OF_WII) && !defined(OF_NINTENDO_3DS) +#if !defined(OF_HAVE_PIPE) && !defined(OF_WII) && !defined(OF_AMIGAOS) && \ + !defined(OF_NINTENDO_3DS) socklen_t cancelAddrLen; #endif _readObjects = [[OFMutableArray alloc] init]; _writeObjects = [[OFMutableArray alloc] init]; -#ifdef OF_HAVE_PIPE +#if defined(OF_HAVE_PIPE) if (pipe(_cancelFD)) @throw [OFInitializationFailedException exceptionWithClass: self.class]; -#else +#elif !defined(OF_AMIGAOS) _cancelFD[0] = _cancelFD[1] = socket(AF_INET, SOCK_DGRAM, 0); if (_cancelFD[0] == INVALID_SOCKET) @throw [OFInitializationFailedException exceptionWithClass: self.class]; @@ -181,15 +186,15 @@ return self; } - (void)dealloc { -#ifdef OF_HAVE_PIPE +#if defined(OF_HAVE_PIPE) close(_cancelFD[0]); if (_cancelFD[1] != _cancelFD[0]) close(_cancelFD[1]); -#else +#elif !defined(OF_AMIGAOS) closesocket(_cancelFD[0]); if (_cancelFD[1] != _cancelFD[0]) closesocket(_cancelFD[1]); #endif @@ -417,16 +422,25 @@ [self observeForTimeInterval: date.timeIntervalSinceNow]; } - (void)cancel { -#ifdef OF_HAVE_PIPE +#if defined(OF_HAVE_PIPE) OF_ENSURE(write(_cancelFD[1], "", 1) > 0); +#elif defined(OF_AMIGAOS) + Forbid(); + + if (_waitingTask != NULL) { + Signal(_waitingTask, (1 << _cancelSignal)); + _waitingTask = NULL; + } + + Permit(); #elif defined(OF_WII) OF_ENSURE(sendto(_cancelFD[1], "", 1, 0, (struct sockaddr *)&_cancelAddr, 8) > 0); #else OF_ENSURE(sendto(_cancelFD[1], (void *)"", 1, 0, (struct sockaddr *)&_cancelAddr, sizeof(_cancelAddr)) > 0); #endif } @end