| // |
| // RACTargetQueueSchedulerSpec.m |
| // ReactiveCocoa |
| // |
| // Created by Josh Abernathy on 6/7/13. |
| // Copyright (c) 2013 GitHub, Inc. All rights reserved. |
| // |
| |
| #import "RACTargetQueueScheduler.h" |
| #import <libkern/OSAtomic.h> |
| |
| SpecBegin(RACTargetQueueScheduler) |
| |
| it(@"should have a valid current scheduler", ^{ |
| dispatch_queue_t queue = dispatch_queue_create("test-queue", DISPATCH_QUEUE_SERIAL); |
| RACScheduler *scheduler = [[RACTargetQueueScheduler alloc] initWithName:@"test-scheduler" targetQueue:queue]; |
| __block RACScheduler *currentScheduler; |
| [scheduler schedule:^{ |
| currentScheduler = RACScheduler.currentScheduler; |
| }]; |
| |
| expect(currentScheduler).will.equal(scheduler); |
| |
| dispatch_release(queue); |
| }); |
| |
| it(@"should schedule blocks FIFO even when given a concurrent queue", ^{ |
| dispatch_queue_t queue = dispatch_queue_create("test-queue", DISPATCH_QUEUE_CONCURRENT); |
| RACScheduler *scheduler = [[RACTargetQueueScheduler alloc] initWithName:@"test-scheduler" targetQueue:queue]; |
| __block volatile int32_t startedCount = 0; |
| __block volatile uint32_t waitInFirst = 1; |
| [scheduler schedule:^{ |
| OSAtomicIncrement32Barrier(&startedCount); |
| while (waitInFirst == 1) ; |
| }]; |
| |
| [scheduler schedule:^{ |
| OSAtomicIncrement32Barrier(&startedCount); |
| }]; |
| |
| expect(startedCount).will.equal(1); |
| |
| OSAtomicAnd32Barrier(0, &waitInFirst); |
| |
| expect(startedCount).will.equal(2); |
| |
| dispatch_release(queue); |
| }); |
| |
| SpecEnd |