51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
#import "OFInitializationFailedException.h"
#import "OFInvalidArgumentException.h"
#import "OFOutOfRangeException.h"
#import "socket.h"
#import "socket_helpers.h"
enum {
QUEUE_ADD = 0,
QUEUE_REMOVE = 1,
QUEUE_READ = 0,
QUEUE_WRITE = 2
};
#define QUEUE_ACTION (QUEUE_ADD | QUEUE_REMOVE)
|
>
>
>
>
|
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
#import "OFInitializationFailedException.h"
#import "OFInvalidArgumentException.h"
#import "OFOutOfRangeException.h"
#import "socket.h"
#import "socket_helpers.h"
#ifdef OF_AMIGAOS
# include <proto/exec.h>
#endif
enum {
QUEUE_ADD = 0,
QUEUE_REMOVE = 1,
QUEUE_READ = 0,
QUEUE_WRITE = 2
};
#define QUEUE_ACTION (QUEUE_ADD | QUEUE_REMOVE)
|
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
}
- (instancetype)init
{
self = [super init];
@try {
#if !defined(OF_HAVE_PIPE) && !defined(OF_WII) && !defined(OF_NINTENDO_3DS)
socklen_t cancelAddrLen;
#endif
_readObjects = [[OFMutableArray alloc] init];
_writeObjects = [[OFMutableArray alloc] init];
#ifdef OF_HAVE_PIPE
if (pipe(_cancelFD))
@throw [OFInitializationFailedException
exceptionWithClass: self.class];
#else
_cancelFD[0] = _cancelFD[1] = socket(AF_INET, SOCK_DGRAM, 0);
if (_cancelFD[0] == INVALID_SOCKET)
@throw [OFInitializationFailedException
exceptionWithClass: self.class];
_cancelAddr.sin_family = AF_INET;
|
|
>
|
|
|
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
}
- (instancetype)init
{
self = [super init];
@try {
#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];
#if defined(OF_HAVE_PIPE)
if (pipe(_cancelFD))
@throw [OFInitializationFailedException
exceptionWithClass: self.class];
#elif !defined(OF_AMIGAOS)
_cancelFD[0] = _cancelFD[1] = socket(AF_INET, SOCK_DGRAM, 0);
if (_cancelFD[0] == INVALID_SOCKET)
@throw [OFInitializationFailedException
exceptionWithClass: self.class];
_cancelAddr.sin_family = AF_INET;
|
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
|
}
return self;
}
- (void)dealloc
{
#ifdef OF_HAVE_PIPE
close(_cancelFD[0]);
if (_cancelFD[1] != _cancelFD[0])
close(_cancelFD[1]);
#else
closesocket(_cancelFD[0]);
if (_cancelFD[1] != _cancelFD[0])
closesocket(_cancelFD[1]);
#endif
[_readObjects release];
[_writeObjects release];
|
|
|
|
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
|
}
return self;
}
- (void)dealloc
{
#if defined(OF_HAVE_PIPE)
close(_cancelFD[0]);
if (_cancelFD[1] != _cancelFD[0])
close(_cancelFD[1]);
#elif !defined(OF_AMIGAOS)
closesocket(_cancelFD[0]);
if (_cancelFD[1] != _cancelFD[0])
closesocket(_cancelFD[1]);
#endif
[_readObjects release];
[_writeObjects release];
|
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
|
- (void)observeUntilDate: (OFDate *)date
{
[self observeForTimeInterval: date.timeIntervalSinceNow];
}
- (void)cancel
{
#ifdef OF_HAVE_PIPE
OF_ENSURE(write(_cancelFD[1], "", 1) > 0);
#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
|
|
>
>
>
>
>
>
>
>
>
|
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
|
- (void)observeUntilDate: (OFDate *)date
{
[self observeForTimeInterval: date.timeIntervalSinceNow];
}
- (void)cancel
{
#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
|