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