| 1586 | |
| 1587 | |
| 1588 | static bool link_request(rem_port* port, server_req_t* request) |
| 1589 | { |
| 1590 | /************************************** |
| 1591 | * |
| 1592 | * l i n k _ r e q u e s t |
| 1593 | * |
| 1594 | ************************************** |
| 1595 | * |
| 1596 | * Functional description |
| 1597 | * Search for a port in a queue, |
| 1598 | * if found - append new request to it. |
| 1599 | * |
| 1600 | **************************************/ |
| 1601 | const P_OP operation = request->req_receive.p_operation; |
| 1602 | server_req_t* queue; |
| 1603 | |
| 1604 | MutexLockGuard queGuard(request_que_mutex, FB_FUNCTION); |
| 1605 | |
| 1606 | bool active = true; |
| 1607 | queue = active_requests; |
| 1608 | |
| 1609 | while (true) |
| 1610 | { |
| 1611 | for (; queue; queue = queue->req_next) |
| 1612 | { |
| 1613 | if (queue->req_port == port) |
| 1614 | { |
| 1615 | // Don't queue a dummy keepalive packet if there is a request on this port |
| 1616 | if (operation == op_dummy) |
| 1617 | { |
| 1618 | free_request(request); |
| 1619 | return true; |
| 1620 | } |
| 1621 | |
| 1622 | append_request_chain(request, &queue->req_chain); |
| 1623 | #ifdef DEBUG_REMOTE_MEMORY |
| 1624 | printf("link_request %s request_queued %d\n", |
| 1625 | active ? "ACTIVE" : "PENDING", port->port_requests_queued.value()); |
| 1626 | fflush(stdout); |
| 1627 | #endif |
| 1628 | break; |
| 1629 | } |
| 1630 | } |
| 1631 | |
| 1632 | if (queue || !active) |
| 1633 | break; |
| 1634 | |
| 1635 | queue = request_que; |
| 1636 | active = false; |
| 1637 | } |
| 1638 | |
| 1639 | if (!queue) |
| 1640 | append_request_next(request, &request_que); |
| 1641 | |
| 1642 | ++port->port_requests_queued; |
| 1643 | |
| 1644 | if (queue) |
| 1645 | { |
no test coverage detected