| 314 | } |
| 315 | |
| 316 | void CallQueue::clear() { |
| 317 | LOCK_MUTEX; |
| 318 | |
| 319 | if (pages.is_empty()) { |
| 320 | UNLOCK_MUTEX; |
| 321 | return; // Nothing to clear. |
| 322 | } |
| 323 | |
| 324 | for (uint32_t i = 0; i < pages_used; i++) { |
| 325 | uint32_t offset = 0; |
| 326 | while (offset < page_bytes[i]) { |
| 327 | Page *page = pages[i]; |
| 328 | |
| 329 | //lock on each iteration, so a call can re-add itself to the message queue |
| 330 | |
| 331 | Message *message = (Message *)&page->data[offset]; |
| 332 | |
| 333 | uint32_t advance = sizeof(Message); |
| 334 | if ((message->type & FLAG_MASK) != TYPE_NOTIFICATION) { |
| 335 | advance += sizeof(Variant) * message->args; |
| 336 | } |
| 337 | |
| 338 | offset += advance; |
| 339 | |
| 340 | if ((message->type & FLAG_MASK) != TYPE_NOTIFICATION) { |
| 341 | Variant *args = (Variant *)(message + 1); |
| 342 | for (int k = 0; k < message->args; k++) { |
| 343 | args[k].~Variant(); |
| 344 | } |
| 345 | } |
| 346 | |
| 347 | message->~Message(); |
| 348 | } |
| 349 | } |
| 350 | |
| 351 | pages_used = 1; |
| 352 | page_bytes[0] = 0; |
| 353 | |
| 354 | UNLOCK_MUTEX; |
| 355 | } |
| 356 | |
| 357 | void CallQueue::statistics() { |
| 358 | LOCK_MUTEX; |
no test coverage detected