Differences From Artifact [b5be6cde87]:
- File
src/OFStreamObserver.m
— part of check-in
[57f51f7341]
at
2011-04-06 19:53:11
on branch trunk
— Don't compare to FD_SETSIZE.
FD_SETSIZE is _NOT_ the number of the last fd, but the maximum number of
fds to observe! (user: js, size: 10176) [annotate] [blame] [check-ins using]
To Artifact [90468a0a65]:
- File src/OFStreamObserver.m — part of check-in [a10390bfd6] at 2011-04-06 20:07:16 on branch trunk — Port recent OFStreamObserver changes to Win32. (user: js, size: 11898) [annotate] [blame] [check-ins using]
︙ | |||
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 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 | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + | #import "OFStreamObserver.h" #import "OFDataArray.h" #import "OFArray.h" #import "OFDictionary.h" #import "OFStream.h" #import "OFNumber.h" #ifdef _WIN32 # import "OFTCPSocket.h" #endif #import "OFAutoreleasePool.h" #import "OFInitializationFailedException.h" #import "OFOutOfRangeException.h" #ifdef _WIN32 # define close(sock) closesocket(sock) #endif enum { QUEUE_ADD = 0, QUEUE_REMOVE = 1, QUEUE_READ = 0, QUEUE_WRITE = 2 }; @implementation OFStreamObserver + observer { return [[[self alloc] init] autorelease]; } - init { self = [super init]; @try { #ifdef _WIN32 struct sockaddr_in cancelAddr2; socklen_t cancelAddrLen; #endif #ifdef OF_HAVE_POLL struct pollfd p = { 0, POLLIN, 0 }; #endif readStreams = [[OFMutableArray alloc] init]; writeStreams = [[OFMutableArray alloc] init]; queue = [[OFMutableArray alloc] init]; queueInfo = [[OFMutableArray alloc] init]; #ifdef OF_HAVE_POLL fds = [[OFDataArray alloc] initWithItemSize: sizeof(struct pollfd)]; fdToStream = [[OFMutableDictionary alloc] init]; #else FD_ZERO(&readfds); FD_ZERO(&writefds); #endif #ifndef _WIN32 if (pipe(cancelFd)) @throw [OFInitializationFailedException newWithClass: isa]; #else /* Make sure WSAStartup has been called */ [OFTCPSocket class]; cancelFd[0] = socket(AF_INET, SOCK_DGRAM, 0); cancelFd[1] = socket(AF_INET, SOCK_DGRAM, 0); if (cancelFd[0] == INVALID_SOCKET || cancelFd[1] == INVALID_SOCKET) @throw [OFInitializationFailedException newWithClass: isa]; cancelAddr.sin_family = AF_INET; cancelAddr.sin_port = 0; cancelAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); cancelAddr2 = cancelAddr; if (bind(cancelFd[0], (struct sockaddr*)&cancelAddr, sizeof(cancelAddr)) || bind(cancelFd[1], (struct sockaddr*)&cancelAddr2, sizeof(cancelAddr2))) @throw [OFInitializationFailedException newWithClass: isa]; cancelAddrLen = sizeof(cancelAddr); if (getsockname(cancelFd[0], (struct sockaddr*)&cancelAddr, &cancelAddrLen)) @throw [OFInitializationFailedException newWithClass: isa]; #endif #ifdef OF_HAVE_POLL p.fd = cancelFd[0]; [fds addItem: &p]; #else FD_SET(cancelFd[0], &readfds); nfds = cancelFd[0] + 1; |
︙ | |||
210 211 212 213 214 215 216 | 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 | + - + + + + + + - + + + + + + - + + + + + + - + + + + + | OFNumber *qi = [OFNumber numberWithInt: QUEUE_ADD | QUEUE_READ]; @synchronized (queue) { [queue addObject: stream]; [queueInfo addObject: qi]; } #ifndef _WIN32 |
︙ | |||
384 385 386 387 388 389 390 | 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 | - + | OFNumber *num; OFStream *stream; if (fds_c[i].revents & POLLIN) { if (fds_c[i].fd == cancelFd[0]) { char buf; |
︙ | |||
429 430 431 432 433 434 435 | 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 | + - + + + + | if (select(nfds, &readfds_, &writefds_, &exceptfds_, (timeout != -1 ? &tv : NULL)) < 1) return NO; if (FD_ISSET(cancelFd[0], &readfds_)) { char buf; #ifndef _WIN32 |
︙ |