Mercurial > love-experiments
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 |
| 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 |
