Rev 1141 | Rev 1573 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1141 | Rev 1568 | ||
|---|---|---|---|
| Line 156... | Line 156... | ||
| 156 | int i; |
156 | int i; |
| 157 | 157 | ||
| 158 | spinlock_lock(&TASK->lock); |
158 | spinlock_lock(&TASK->lock); |
| 159 | 159 | ||
| 160 | for (i=0; i < IPC_MAX_PHONES; i++) { |
160 | for (i=0; i < IPC_MAX_PHONES; i++) { |
| - | 161 | if (TASK->phones[i].state == IPC_PHONE_HUNGUP && \ |
|
| 161 | if (TASK->phones[i].busy==IPC_BUSY_FREE && !atomic_get(&TASK->phones[i].active_calls)) { |
162 | atomic_get(&TASK->phones[i].active_calls) == 0) |
| - | 163 | TASK->phones[i].state = IPC_PHONE_FREE; |
|
| - | 164 | ||
| - | 165 | if (TASK->phones[i].state == IPC_PHONE_FREE) { |
|
| 162 | TASK->phones[i].busy = IPC_BUSY_CONNECTING; |
166 | TASK->phones[i].state = IPC_PHONE_CONNECTING; |
| 163 | break; |
167 | break; |
| 164 | } |
168 | } |
| 165 | } |
169 | } |
| 166 | spinlock_unlock(&TASK->lock); |
170 | spinlock_unlock(&TASK->lock); |
| 167 | 171 | ||
| Line 170... | Line 174... | ||
| 170 | return i; |
174 | return i; |
| 171 | } |
175 | } |
| 172 | 176 | ||
| 173 | static void phone_deallocp(phone_t *phone) |
177 | static void phone_deallocp(phone_t *phone) |
| 174 | { |
178 | { |
| 175 | ASSERT(phone->busy == IPC_BUSY_CONNECTING); |
179 | ASSERT(phone->state == IPC_PHONE_CONNECTING); |
| 176 | ASSERT(! phone->callee); |
180 | ASSERT(! phone->callee); |
| 177 | 181 | ||
| 178 | /* atomic operation */ |
182 | /* atomic operation */ |
| 179 | phone->busy = IPC_BUSY_FREE; |
183 | phone->state = IPC_PHONE_FREE; |
| 180 | } |
184 | } |
| 181 | 185 | ||
| 182 | /** Free slot from a disconnected phone |
186 | /** Free slot from a disconnected phone |
| 183 | * |
187 | * |
| 184 | * All already sent messages will be correctly processed |
188 | * All already sent messages will be correctly processed |
| Line 198... | Line 202... | ||
| 198 | */ |
202 | */ |
| 199 | void phone_connect(int phoneid, answerbox_t *box) |
203 | void phone_connect(int phoneid, answerbox_t *box) |
| 200 | { |
204 | { |
| 201 | phone_t *phone = &TASK->phones[phoneid]; |
205 | phone_t *phone = &TASK->phones[phoneid]; |
| 202 | 206 | ||
| 203 | ASSERT(phone->busy == IPC_BUSY_CONNECTING); |
207 | ASSERT(phone->state == IPC_PHONE_CONNECTING); |
| 204 | ipc_phone_connect(phone, box); |
208 | ipc_phone_connect(phone, box); |
| 205 | } |
209 | } |