Lines Matching refs:hdr
54 CheckCvscanState(RF_CvscanHeader_t *hdr)
59 if (hdr->left != NULL)
60 RF_ASSERT(hdr->left->sectorOffset < hdr->cur_block);
61 for (key = hdr->cur_block, i = 0, tmp = hdr->left;
65 && tmp->priority == hdr->nxt_priority && pri_ok(tmp->priority));
66 RF_ASSERT(i == hdr->left_cnt);
68 for (key = hdr->cur_block, i = 0, tmp = hdr->right;
72 RF_ASSERT(tmp->priority == hdr->nxt_priority);
75 RF_ASSERT(i == hdr->right_cnt);
77 for (key = hdr->nxt_priority - 1, tmp = hdr->burner;
81 RF_ASSERT(hdr);
84 RF_ASSERT(tmp->priority < hdr->nxt_priority);
137 ReBalance(RF_CvscanHeader_t *hdr)
139 /* DO_CHECK_STATE(hdr); */
140 while (hdr->right != NULL
141 && hdr->right->sectorOffset < hdr->cur_block) {
142 hdr->right_cnt--;
143 hdr->left_cnt++;
144 ReqInsert(&hdr->left, ReqDequeue(&hdr->right), rf_cvscan_LEFT);
146 /* DO_CHECK_STATE(hdr); */
166 RealEnqueue(RF_CvscanHeader_t *hdr, RF_DiskQueueData_t *req)
170 DO_CHECK_STATE(hdr);
171 if (hdr->left_cnt == 0 && hdr->right_cnt == 0) {
172 hdr->nxt_priority = req->priority;
174 if (req->priority > hdr->nxt_priority) {
178 Transfer(&hdr->burner, &hdr->left);
179 Transfer(&hdr->burner, &hdr->right);
180 hdr->left_cnt = 0;
181 hdr->right_cnt = 0;
182 hdr->nxt_priority = req->priority;
184 if (req->priority < hdr->nxt_priority) {
188 PriorityInsert(&hdr->burner, req);
190 if (req->sectorOffset < hdr->cur_block) {
192 ReqInsert(&hdr->left, req, rf_cvscan_LEFT);
193 hdr->left_cnt++;
196 ReqInsert(&hdr->right, req, rf_cvscan_RIGHT);
197 hdr->right_cnt++;
200 DO_CHECK_STATE(hdr);
208 RF_CvscanHeader_t *hdr = (RF_CvscanHeader_t *) q_in;
209 RealEnqueue(hdr, elem /* req */ );
217 RF_CvscanHeader_t *hdr = (RF_CvscanHeader_t *) q_in;
222 DO_CHECK_STATE(hdr);
224 if (hdr->left_cnt == 0 && hdr->right_cnt == 0)
227 range = RF_MIN(hdr->range_for_avg, RF_MIN(hdr->left_cnt, hdr->right_cnt));
228 for (i = 0, tmp = hdr->left, sum_dist_left =
229 ((hdr->direction == rf_cvscan_RIGHT) ? range * hdr->change_penalty : 0);
232 sum_dist_left += hdr->cur_block - tmp->sectorOffset;
234 for (i = 0, tmp = hdr->right, sum_dist_right =
235 ((hdr->direction == rf_cvscan_LEFT) ? range * hdr->change_penalty : 0);
238 sum_dist_right += tmp->sectorOffset - hdr->cur_block;
241 if (hdr->right_cnt == 0 || sum_dist_left < sum_dist_right) {
242 hdr->direction = rf_cvscan_LEFT;
243 hdr->cur_block = hdr->left->sectorOffset + hdr->left->numSector;
244 hdr->left_cnt = RF_MAX(hdr->left_cnt - 1, 0);
245 tmp = hdr->left;
246 ret = (ReqDequeue(&hdr->left)) /*->parent*/ ;
248 hdr->direction = rf_cvscan_RIGHT;
249 hdr->cur_block = hdr->right->sectorOffset + hdr->right->numSector;
250 hdr->right_cnt = RF_MAX(hdr->right_cnt - 1, 0);
251 tmp = hdr->right;
252 ret = (ReqDequeue(&hdr->right)) /*->parent*/ ;
254 ReBalance(hdr);
256 if (hdr->left_cnt == 0 && hdr->right_cnt == 0
257 && hdr->burner != NULL) {
261 RF_DiskQueueData_t *burner = hdr->burner;
262 hdr->nxt_priority = burner->priority;
264 && burner->priority == hdr->nxt_priority) {
266 RealEnqueue(hdr, burner);
269 hdr->burner = burner;
271 DO_CHECK_STATE(hdr);
287 RF_CvscanHeader_t *hdr;
291 hdr = RF_MallocAndAdd(sizeof(*hdr), clList);
292 hdr->range_for_avg = RF_MAX(range, 1);
293 hdr->change_penalty = RF_MAX(penalty, 0);
294 hdr->direction = rf_cvscan_RIGHT;
295 hdr->cur_block = 0;
296 hdr->left_cnt = hdr->right_cnt = 0;
297 hdr->left = hdr->right = NULL;
298 hdr->burner = NULL;
299 DO_CHECK_STATE(hdr);
301 return ((void *) hdr);
309 PrintCvscanQueue(RF_CvscanHeader_t *hdr)
314 (int) hdr->range_for_avg,
315 (int) hdr->change_penalty,
316 (int) hdr->cur_block,
317 (hdr->direction == rf_cvscan_LEFT) ? "LEFT" : "RIGHT");
318 printf("\tLeft(%d): ", hdr->left_cnt);
319 for (tmp = hdr->left; tmp != NULL; tmp = tmp->next)
325 printf("\tRight(%d): ", hdr->right_cnt);
326 for (tmp = hdr->right; tmp != NULL; tmp = tmp->next)
333 for (tmp = hdr->burner; tmp != NULL; tmp = tmp->next)
352 RF_CvscanHeader_t *hdr = (RF_CvscanHeader_t *) q_in;
353 RF_DiskQueueData_t *trailer = NULL, *tmp = hdr->burner, *tlist = NULL;
356 DO_CHECK_STATE(hdr);
359 hdr->burner = tmp->next;
363 tmp = hdr->burner;
386 RealEnqueue(hdr, tlist);