pEpObjCAdapter/PEPQueue.m
author Dirk Zimmermann <dirk@pep-project.org>
Wed, 17 May 2017 09:27:57 +0200
changeset 187 1f630a05e444
child 193 0d26e0a12324
permissions -rw-r--r--
IOSAD-15 more renames
dirk@187
     1
//
dirk@187
     2
//  PEPQueue.m
dirk@187
     3
//  pEpiOSAdapter
dirk@187
     4
//
dirk@187
     5
//  Created by Volker Birk on 15.07.15.
dirk@187
     6
//  Copyright (c) 2015 p≡p. All rights reserved.
dirk@187
     7
//
dirk@187
     8
dirk@187
     9
#import "PEPQueue.h"
dirk@187
    10
dirk@187
    11
dirk@187
    12
@interface PEPQueue ()
dirk@187
    13
dirk@187
    14
@property (nonatomic, strong) NSMutableArray *queue;
dirk@187
    15
@property (nonatomic, strong) NSCondition *cond;
dirk@187
    16
dirk@187
    17
@end
dirk@187
    18
dirk@187
    19
@implementation PEPQueue
dirk@187
    20
dirk@187
    21
- (id)init
dirk@187
    22
{
dirk@187
    23
    self = [super init];
dirk@187
    24
    
dirk@187
    25
    if (self)
dirk@187
    26
    {
dirk@187
    27
        self.queue = [[NSMutableArray alloc] init];
dirk@187
    28
        self.cond = [[NSCondition alloc] init];
dirk@187
    29
    }
dirk@187
    30
    
dirk@187
    31
    return self;
dirk@187
    32
}
dirk@187
    33
dirk@187
    34
- (void)enqueue:(id)object
dirk@187
    35
{
dirk@187
    36
dirk@187
    37
    @synchronized(self) {
dirk@187
    38
        if (_queue)
dirk@187
    39
            [_queue insertObject:object atIndex:0];
dirk@187
    40
    }
dirk@187
    41
    
dirk@187
    42
    [_cond signal];
dirk@187
    43
    
dirk@187
    44
}
dirk@187
    45
dirk@187
    46
- (BOOL)condwait
dirk@187
    47
{
dirk@187
    48
    BOOL res;
dirk@187
    49
    @synchronized(self) {
dirk@187
    50
        res = _queue && _queue.count == 0;
dirk@187
    51
    }
dirk@187
    52
    return res;
dirk@187
    53
}
dirk@187
    54
dirk@187
    55
- (id)dequeue
dirk@187
    56
{
dirk@187
    57
    id tmp = nil;
dirk@187
    58
    
dirk@187
    59
    [_cond lock];
dirk@187
    60
    
dirk@187
    61
    while ([self condwait])
dirk@187
    62
    {
dirk@187
    63
        [_cond wait];
dirk@187
    64
    }
dirk@187
    65
    
dirk@187
    66
    @synchronized(self) {
dirk@187
    67
        if (_queue)
dirk@187
    68
        {
dirk@187
    69
            tmp = [_queue lastObject];
dirk@187
    70
            
dirk@187
    71
            [_queue removeLastObject];
dirk@187
    72
        }
dirk@187
    73
    }
dirk@187
    74
    [_cond unlock];
dirk@187
    75
    
dirk@187
    76
    return tmp;
dirk@187
    77
}
dirk@187
    78
dirk@187
    79
- (void)kill
dirk@187
    80
{
dirk@187
    81
    _queue = nil;
dirk@187
    82
    
dirk@187
    83
    [_cond signal];
dirk@187
    84
}
dirk@187
    85
dirk@187
    86
- (NSUInteger)count
dirk@187
    87
{
dirk@187
    88
    return [_queue count];
dirk@187
    89
}
dirk@187
    90
dirk@187
    91
- (void)dealloc
dirk@187
    92
{
dirk@187
    93
    self.queue = nil;
dirk@187
    94
    self.cond = nil;
dirk@187
    95
}
dirk@187
    96
dirk@187
    97
@end