annotate src/modules/thread/Channel.cpp @ 1448:108ee2e81f65 default tip

Fix a case typo, imageData.h -> ImageData.h
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sat, 18 Jan 2014 13:57:44 +0100
parents ee1448bb9680
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1098
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
1 /**
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
2 * Copyright (c) 2006-2012 LOVE Development Team
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
3 *
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
4 * This software is provided 'as-is', without any express or implied
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
5 * warranty. In no event will the authors be held liable for any damages
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
6 * arising from the use of this software.
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
7 *
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
8 * Permission is granted to anyone to use this software for any purpose,
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
9 * including commercial applications, and to alter it and redistribute it
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
10 * freely, subject to the following restrictions:
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
11 *
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
12 * 1. The origin of this software must not be misrepresented; you must not
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
13 * claim that you wrote the original software. If you use this software
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
14 * in a product, an acknowledgment in the product documentation would be
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
15 * appreciated but is not required.
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
16 * 2. Altered source versions must be plainly marked as such, and must not be
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
17 * misrepresented as being the original software.
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
18 * 3. This notice may not be removed or altered from any source distribution.
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
19 **/
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
20
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
21 #include "Channel.h"
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
22 #include <map>
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
23 #include <string>
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
24
1197
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
25 namespace
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
26 {
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
27 union uslong
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
28 {
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
29 unsigned long u;
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
30 long i;
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
31 };
1197
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
32
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
33 // target <= current, but semi-wrapsafe, one wrap, anyway
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
34 inline bool past(unsigned int target, unsigned int current)
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
35 {
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
36 if (target > current)
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
37 return false;
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
38 if (target == current)
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
39 return true;
1197
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
40
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
41 uslong t, c;
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
42 t.u = target;
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
43 c.u = current;
1197
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
44
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
45 return !(t.i < 0 && c.i > 0);
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
46 }
1197
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
47 }
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
48
1098
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
49 namespace love
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
50 {
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
51 namespace thread
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
52 {
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
53 static std::map<std::string, Channel *> namedChannels;
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
54 static Mutex *namedChannelMutex;
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
55
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
56 Channel *Channel::getChannel(const std::string &name)
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
57 {
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
58 if (!namedChannelMutex)
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
59 namedChannelMutex = newMutex();
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
60
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
61 Lock l(namedChannelMutex);
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
62 if (!namedChannels.count(name))
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
63 namedChannels[name] = new Channel(name);
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
64 else
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
65 namedChannels[name]->retain();
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
66
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
67 return namedChannels[name];
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
68 }
1098
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
69
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
70 Channel::Channel()
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
71 : named(false)
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
72 , sent(0)
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
73 , received(0)
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
74 {
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
75 mutex = newMutex();
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
76 cond = newConditional();
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
77 }
1098
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
78
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
79 Channel::Channel(const std::string &name)
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
80 : named(true)
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
81 , name(name)
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
82 , sent(0)
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
83 , received(0)
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
84 {
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
85 mutex = newMutex();
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
86 cond = newConditional();
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
87 }
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
88
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
89 Channel::~Channel()
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
90 {
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
91 while (!queue.empty())
1098
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
92 {
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
93 queue.front()->release();
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
94 queue.pop();
1098
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
95 }
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
96
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
97 delete mutex;
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
98 delete cond;
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
99
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
100 if (named)
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
101 namedChannels.erase(name);
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
102 }
1098
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
103
1197
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
104 unsigned long Channel::push(Variant *var)
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
105 {
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
106 if (!var)
1197
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
107 return 0;
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
108
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
109 Lock l(mutex);
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
110 var->retain();
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
111
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
112 // Keep a reference to ourselves
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
113 // if we're non-empty and named.
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
114 if (named && queue.empty())
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
115 retain();
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
116
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
117 queue.push(var);
1197
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
118 cond->broadcast();
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
119
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
120 return ++sent;
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
121 }
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
122
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
123 void Channel::supply(Variant *var)
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
124 {
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
125 if (!var)
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
126 return;
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
127
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
128 mutex->lock();
1197
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
129 unsigned long id = push(var);
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
130
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
131 while (!past(id, received))
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
132 cond->wait(mutex);
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
133
1197
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
134 mutex->unlock();
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
135 }
1098
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
136
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
137 Variant *Channel::pop()
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
138 {
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
139 Lock l(mutex);
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
140 if (queue.empty())
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
141 return 0;
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
142
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
143 Variant *var = queue.front();
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
144 queue.pop();
1098
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
145
1197
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
146 received++;
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
147 cond->broadcast();
1a59c21cd2f3 Add Channel:supply(), a blocking version of Channel:push()
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1104
diff changeset
148
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
149 // Release our reference to ourselves
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
150 // if we're empty and named.
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
151 if (named && queue.empty())
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
152 release();
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
153
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
154 return var;
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
155 } // NOTE: Returns a retained Variant
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
156
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
157 Variant *Channel::demand()
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
158 {
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
159 Variant *var;
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
160 mutex->lock();
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
161 while (!(var = pop()))
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
162 cond->wait(mutex);
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
163
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
164 mutex->unlock();
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
165 return var;
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
166 }
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
167
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
168 Variant *Channel::peek()
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
169 {
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
170 Lock l(mutex);
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
171 if (queue.empty())
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
172 return 0;
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
173
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
174 Variant *var = queue.front();
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
175 var->retain();
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
176 return var;
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
177 }
1098
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
178
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
179 int Channel::count()
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
180 {
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
181 Lock l(mutex);
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
182 return queue.size();
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
183 }
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
184
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
185 void Channel::clear()
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
186 {
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
187 Lock l(mutex);
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
188
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
189 // We're already empty.
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
190 if (queue.empty())
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
191 return;
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
192
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
193 while (!queue.empty())
1098
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
194 {
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
195 queue.front()->release();
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
196 queue.pop();
1098
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
197 }
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
198
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
199 // Finish all the supply waits
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
200 received = sent;
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
201 cond->broadcast();
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
202
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
203 // Once again, release our own
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
204 // reference if we're named.
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
205 if (named)
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
206 release();
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
207 }
1098
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
208
1304
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
209 void Channel::lockMutex()
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
210 {
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
211 mutex->lock();
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
212 }
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
213
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
214 void Channel::unlockMutex()
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
215 {
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
216 mutex->unlock();
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
217 }
ee1448bb9680 Fix race conditions and deadlocks in Channels (hopefully) (issue #554)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1197
diff changeset
218
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
219 void Channel::retain()
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
220 {
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
221 if (named)
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
222 namedChannelMutex->lock();
1101
025c67973ad4 Make Channels more thread-safe (I know, I know..)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1098
diff changeset
223
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
224 Object::retain();
1101
025c67973ad4 Make Channels more thread-safe (I know, I know..)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1098
diff changeset
225
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
226 if (named)
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
227 namedChannelMutex->unlock();
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
228 }
1098
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
229
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
230 void Channel::release()
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
231 {
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
232 if (named)
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
233 namedChannelMutex->lock();
1101
025c67973ad4 Make Channels more thread-safe (I know, I know..)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1098
diff changeset
234
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
235 Object::release();
1101
025c67973ad4 Make Channels more thread-safe (I know, I know..)
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1098
diff changeset
236
1104
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
237 if (named)
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
238 namedChannelMutex->unlock();
fc7143cc0818 Also mutex lock in Channel::retain
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1101
diff changeset
239 }
1098
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
240 } // thread
a74672ba1320 Merge in channels from love-experiments
Bart van Strien <bart.bes+projects@gmail.com>
parents:
diff changeset
241 } // love