Revision 6e36d028 xseg/xtypes/xq.c
b/xseg/xtypes/xq.c | ||
---|---|---|
398 | 398 |
return r; |
399 | 399 |
} |
400 | 400 |
|
401 |
xqindex __xq_resize(struct xq *xq, struct xq *newxq) |
|
402 |
{ |
|
403 |
xqindex i, mask, mask_new, head, tail, val; |
|
404 |
xqindex nr = xq_count(xq); |
|
405 |
|
|
406 |
if (nr > newxq->size) { |
|
407 |
return Noneidx; |
|
408 |
} |
|
409 |
|
|
410 |
mask = xq->size -1; |
|
411 |
mask_new = newxq->size -1; |
|
412 |
head = __xq_peek_head_idx(xq, nr); |
|
413 |
tail = __xq_append_tail_idx(newxq, nr) + nr -1; |
|
414 |
for (i = 0; i < nr; i++) { |
|
415 |
val = XPTR(&xq->queue)[(head + i) & mask]; |
|
416 |
XPTR(&newxq->queue)[(tail - i) & mask_new] = val; |
|
417 |
} |
|
418 |
|
|
419 |
return nr; |
|
420 |
} |
|
421 |
|
|
422 |
xqindex xq_resize(struct xq *xq, struct xq *newxq, unsigned long who) |
|
423 |
{ |
|
424 |
xqindex r = Noneidx; |
|
425 |
xlock_acquire(&xq->lock, who); |
|
426 |
xlock_acquire(&newxq->lock, who); |
|
427 |
r = __xq_resize(xq, newxq); |
|
428 |
xlock_release(&newxq->lock); |
|
429 |
xlock_release(&xq->lock); |
|
430 |
return r; |
|
431 |
} |
|
432 |
|
|
401 | 433 |
#ifdef __KERNEL__ |
402 | 434 |
#include <linux/module.h> |
403 | 435 |
#include <xtypes/xq_exports.h> |
Also available in: Unified diff