A method of managing access to a shared memory, the method comprising: receiving, at a memory controller, a first request to access the shared memory from a first client of one or more clients configured to access the shared memory; placing the first request in at least a first queue (112, 116) on the memory controller; assigning a series of at least two timeout values to the first request, based on a priority associated with the first client, wherein the priority associated with the first client is a dynamically modifiable priority based, at least in part on a Quality-of-Service, QoS, class associated with the first client, wherein one or more other clients belong to the same QoS class as the first client and wherein the series of timeout values is determined as a function of the QoS class associated with the client and are further based on an occupancy of the first queue, wherein the occupancy of the first queue comprises a number of requests from the same Quality-of-Service, QoS, class as the first request and wherein each of the timeout values associated with the request is represented as t = M ∗ α c ∗ occupancy_c where M is a programmable scaling factor that is a function of the expected wait time of the first request in the memory controller, α c is a constant associated with the QoS class and occupancy_c is the occupancy of the first queue and wherein a later timeout value in the series is one of smaller than an earlier timeout value such that a criticality level of the first request increases at a faster rate as the timer traverses more timeout values; or larger than the earlier timeout value, such that the criticality level of the first request increases at a slower rate as the timer traverses more timeout values; incrementing a timer while the first request remains in the first queue; and as the timer traverses each one of the timeout values in the series, incrementing the criticality level of the first request; prioritizing, for granting access to the shared memory, the first request over a second request in the first queue, if the first request has a higher criticality level than the second request. receiving, at a memory controller, a first request to access the shared memory from a first client of one or more clients configured to access the shared memory; placing the first request in at least a first queue (112, 116) on the memory controller; assigning a series of at least two timeout values to the first request, based on a priority associated with the first client, wherein the priority associated with the first client is a dynamically modifiable priority based, at least in part on a Quality-of-Service, QoS, class associated with the first client, wherein one or more other clients belong to the same QoS class as the first client and wherein the series of timeout values is determined as a function of the QoS class associated with the client and are further based on an occupancy of the first queue, wherein the occupancy of the first queue comprises a number of requests from the same Quality-of-Service, QoS, class as the first request and wherein each of the timeout values associated with the request is represented as t = M ∗ α c ∗ occupancy_c where M is a programmable scaling factor that is a function of the expected wait time of the first request in the memory controller, α c is a constant associated with the QoS class and occupancy_c is the occupancy of the first queue and wherein a later timeout value in the series is one of smaller than an earlier timeout value such that a criticality level of the first request increases at a faster rate as the timer traverses more timeout values; or larger than the earlier timeout value, such that the criticality level of the first request increases at a slower rate as the timer traverses more timeout values; incrementing a timer while the first request remains in the first queue; and as the timer traverses each one of the timeout values in the series, incrementing the criticality level of the first request; prioritizing, for granting access to the shared memory, the first request over a second request in the first queue, if the first request has a higher criticality level than the second request.