Differences From Artifact [e29f8ae799]:
- File
src/OFRunLoop.m
— part of check-in
[dc31ce3d34]
at
2014-01-16 23:09:11
on branch trunk
— Add of_time_interval_t.
This is used instead for time intervals now instead of doubles. (user: js, size: 15822) [annotate] [blame] [check-ins using]
To Artifact [50e05df3a1]:
- File src/OFRunLoop.m — part of check-in [96e20b8093] at 2014-01-28 22:50:37 on branch trunk — Rename OFStreamObserver -> OFKernelEventObserver (user: js, size: 15930) [annotate] [blame] [check-ins using]
︙ | ︙ | |||
18 19 20 21 22 23 24 | #include <assert.h> #import "OFRunLoop.h" #import "OFRunLoop+Private.h" #import "OFDictionary.h" #ifdef OF_HAVE_SOCKETS | | | 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include <assert.h> #import "OFRunLoop.h" #import "OFRunLoop+Private.h" #import "OFDictionary.h" #ifdef OF_HAVE_SOCKETS # import "OFKernelEventObserver.h" #endif #import "OFThread.h" #ifdef OF_HAVE_THREADS # import "OFMutex.h" # import "OFCondition.h" #endif #import "OFSortedList.h" |
︙ | ︙ | |||
173 174 175 176 177 178 179 | if (queue == nil) { \ queue = [OFList list]; \ [runLoop->_readQueues setObject: queue \ forKey: stream]; \ } \ \ if ([queue count] == 0) \ | > | | 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 | if (queue == nil) { \ queue = [OFList list]; \ [runLoop->_readQueues setObject: queue \ forKey: stream]; \ } \ \ if ([queue count] == 0) \ [runLoop->_kernelEventObserver \ addStreamForReading: stream]; \ \ queueItem = [[[type alloc] init] autorelease]; \ code \ [queue appendObject: queueItem]; \ \ objc_autoreleasePoolPop(pool); |
︙ | ︙ | |||
285 286 287 288 289 290 291 | void *pool = objc_autoreleasePoolPush(); OFRunLoop *runLoop = [self currentRunLoop]; OFList *queue; if ((queue = [runLoop->_readQueues objectForKey: stream]) != nil) { assert([queue count] > 0); | | | | | | 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 332 333 334 335 336 337 338 339 340 341 | void *pool = objc_autoreleasePoolPush(); OFRunLoop *runLoop = [self currentRunLoop]; OFList *queue; if ((queue = [runLoop->_readQueues objectForKey: stream]) != nil) { assert([queue count] > 0); [runLoop->_kernelEventObserver removeStreamForReading: stream]; [runLoop->_readQueues removeObjectForKey: stream]; } objc_autoreleasePoolPop(pool); } #endif - init { self = [super init]; @try { _timersQueue = [[OFSortedList alloc] init]; #ifdef OF_HAVE_THREADS _timersQueueLock = [[OFMutex alloc] init]; #endif #if defined(OF_HAVE_SOCKETS) _kernelEventObserver = [[OFKernelEventObserver alloc] init]; [_kernelEventObserver setDelegate: self]; _readQueues = [[OFMutableDictionary alloc] init]; #elif defined(OF_HAVE_THREADS) _condition = [[OFCondition alloc] init]; #endif } @catch (id e) { [self release]; @throw e; } return self; } - (void)dealloc { [_timersQueue release]; #ifdef OF_HAVE_THREADS [_timersQueueLock release]; #endif #if defined(OF_HAVE_SOCKETS) [_kernelEventObserver release]; [_readQueues release]; #elif defined(OF_HAVE_THREADS) [_condition release]; #endif [super dealloc]; } |
︙ | ︙ | |||
351 352 353 354 355 356 357 | [_timersQueueLock unlock]; } #endif [timer OF_setInRunLoop: self]; #if defined(OF_HAVE_SOCKETS) | | | 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 | [_timersQueueLock unlock]; } #endif [timer OF_setInRunLoop: self]; #if defined(OF_HAVE_SOCKETS) [_kernelEventObserver cancel]; #elif defined(OF_HAVE_THREADS) [_condition lock]; [_condition signal]; [_condition unlock]; #endif } |
︙ | ︙ | |||
412 413 414 415 416 417 418 | # ifdef OF_HAVE_BLOCKS if (queueItem->_block != NULL) { if (!queueItem->_block(stream, queueItem->_buffer, length, exception)) { [queue removeListObject: listObject]; if ([queue count] == 0) { | | | | 413 414 415 416 417 418 419 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 | # ifdef OF_HAVE_BLOCKS if (queueItem->_block != NULL) { if (!queueItem->_block(stream, queueItem->_buffer, length, exception)) { [queue removeListObject: listObject]; if ([queue count] == 0) { [_kernelEventObserver removeStreamForReading: stream]; [_readQueues removeObjectForKey: stream]; } } } else { # endif bool (*func)(id, SEL, OFStream*, void*, size_t, OFException*) = (bool(*)(id, SEL, OFStream*, void*, size_t, OFException*)) [queueItem->_target methodForSelector: queueItem->_selector]; if (!func(queueItem->_target, queueItem->_selector, stream, queueItem->_buffer, length, exception)) { [queue removeListObject: listObject]; if ([queue count] == 0) { [_kernelEventObserver removeStreamForReading: stream]; [_readQueues removeObjectForKey: stream]; } } # ifdef OF_HAVE_BLOCKS } |
︙ | ︙ | |||
470 471 472 473 474 475 476 | queueItem->_buffer, queueItem->_readLength, exception)) queueItem->_readLength = 0; else { [queue removeListObject: listObject]; if ([queue count] == 0) { | | | 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 | queueItem->_buffer, queueItem->_readLength, exception)) queueItem->_readLength = 0; else { [queue removeListObject: listObject]; if ([queue count] == 0) { [_kernelEventObserver removeStreamForReading: stream]; [_readQueues removeObjectForKey: stream]; } } } else { |
︙ | ︙ | |||
494 495 496 497 498 499 500 | queueItem->_buffer, queueItem->_readLength, exception)) queueItem->_readLength = 0; else { [queue removeListObject: listObject]; if ([queue count] == 0) { | | | 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 | queueItem->_buffer, queueItem->_readLength, exception)) queueItem->_readLength = 0; else { [queue removeListObject: listObject]; if ([queue count] == 0) { [_kernelEventObserver removeStreamForReading: stream]; [_readQueues removeObjectForKey: stream]; } } # ifdef OF_HAVE_BLOCKS |
︙ | ︙ | |||
528 529 530 531 532 533 534 | # ifdef OF_HAVE_BLOCKS if (queueItem->_block != NULL) { if (!queueItem->_block(stream, line, exception)) { [queue removeListObject: listObject]; if ([queue count] == 0) { | | | | 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 | # ifdef OF_HAVE_BLOCKS if (queueItem->_block != NULL) { if (!queueItem->_block(stream, line, exception)) { [queue removeListObject: listObject]; if ([queue count] == 0) { [_kernelEventObserver removeStreamForReading: stream]; [_readQueues removeObjectForKey: stream]; } } } else { # endif bool (*func)(id, SEL, OFStream*, OFString*, OFException*) = (bool(*)(id, SEL, OFStream*, OFString*, OFException*)) [queueItem->_target methodForSelector: queueItem->_selector]; if (!func(queueItem->_target, queueItem->_selector, stream, line, exception)) { [queue removeListObject: listObject]; if ([queue count] == 0) { [_kernelEventObserver removeStreamForReading: stream]; [_readQueues removeObjectForKey: stream]; } } # ifdef OF_HAVE_BLOCKS |
︙ | ︙ | |||
580 581 582 583 584 585 586 | # ifdef OF_HAVE_BLOCKS if (queueItem->_block != NULL) { if (!queueItem->_block((OFTCPSocket*)stream, newSocket, exception)) { [queue removeListObject: listObject]; if ([queue count] == 0) { | | | | 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 | # ifdef OF_HAVE_BLOCKS if (queueItem->_block != NULL) { if (!queueItem->_block((OFTCPSocket*)stream, newSocket, exception)) { [queue removeListObject: listObject]; if ([queue count] == 0) { [_kernelEventObserver removeStreamForReading: stream]; [_readQueues removeObjectForKey: stream]; } } } else { # endif bool (*func)(id, SEL, OFTCPSocket*, OFTCPSocket*, OFException*) = (bool(*)(id, SEL, OFTCPSocket*, OFTCPSocket*, OFException*)) [queueItem->_target methodForSelector: queueItem->_selector]; if (!func(queueItem->_target, queueItem->_selector, (OFTCPSocket*)stream, newSocket, exception)) { [queue removeListObject: listObject]; if ([queue count] == 0) { [_kernelEventObserver removeStreamForReading: stream]; [_readQueues removeObjectForKey: stream]; } } # ifdef OF_HAVE_BLOCKS } |
︙ | ︙ | |||
675 676 677 678 679 680 681 | /* Watch for stream events until the next timer is due */ if (nextTimer != nil) { of_time_interval_t timeout = [nextTimer timeIntervalSinceNow]; if (timeout > 0) { #if defined(OF_HAVE_SOCKETS) | | | | | 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 | /* Watch for stream events until the next timer is due */ if (nextTimer != nil) { of_time_interval_t timeout = [nextTimer timeIntervalSinceNow]; if (timeout > 0) { #if defined(OF_HAVE_SOCKETS) [_kernelEventObserver observeForTimeInterval: timeout]; #elif defined(OF_HAVE_THREADS) [_condition lock]; [_condition waitForTimeInterval: timeout]; [_condition unlock]; #else [OFThread sleepForTimeInterval: timeout]; #endif } } else { /* * No more timers: Just watch for streams until we get * an event. If a timer is added by another thread, it * cancels the observe. */ #if defined(OF_HAVE_SOCKETS) [_kernelEventObserver observe]; #elif defined(OF_HAVE_THREADS) [_condition lock]; [_condition wait]; [_condition unlock]; #else [OFThread sleepForTimeInterval: 86400]; #endif } objc_autoreleasePoolPop(pool); } } - (void)stop { _running = false; #if defined(OF_HAVE_SOCKETS) [_kernelEventObserver cancel]; #elif defined(OF_HAVE_THREADS) [_condition lock]; [_condition signal]; [_condition unlock]; #endif } @end |