| 45 | MODULE_CMD_FUNC(&Queue::CommandGetStatus), Command::THREAD_SAFE}}; |
| 46 | |
| 47 | int Queue::Resize(int slots) { |
| 48 | struct llring *old_queue = queue_; |
| 49 | struct llring *new_queue; |
| 50 | |
| 51 | int bytes = llring_bytes_with_slots(slots); |
| 52 | |
| 53 | new_queue = |
| 54 | reinterpret_cast<llring *>(std::aligned_alloc(alignof(llring), bytes)); |
| 55 | if (!new_queue) { |
| 56 | return -ENOMEM; |
| 57 | } |
| 58 | |
| 59 | int ret = llring_init(new_queue, slots, 0, 1); |
| 60 | if (ret) { |
| 61 | std::free(new_queue); |
| 62 | return -EINVAL; |
| 63 | } |
| 64 | |
| 65 | /* migrate packets from the old queue */ |
| 66 | if (old_queue) { |
| 67 | bess::Packet *pkt; |
| 68 | |
| 69 | while (llring_sc_dequeue(old_queue, (void **)&pkt) == 0) { |
| 70 | ret = llring_sp_enqueue(new_queue, pkt); |
| 71 | if (ret == -LLRING_ERR_NOBUF) { |
| 72 | bess::Packet::Free(pkt); |
| 73 | } |
| 74 | } |
| 75 | |
| 76 | std::free(old_queue); |
| 77 | } |
| 78 | |
| 79 | queue_ = new_queue; |
| 80 | |
| 81 | if (backpressure_) { |
| 82 | AdjustWaterLevels(); |
| 83 | } |
| 84 | |
| 85 | return 0; |
| 86 | } |
| 87 | |
| 88 | CommandResponse Queue::Init(const bess::pb::QueueArg &arg) { |
| 89 | task_id_t tid; |
no test coverage detected