Add get_packet_no_wait for tasks that should not wait indefinitely

pull/4202/head
Isaac Connor 2024-08-01 18:00:42 -04:00
parent cfdfe8344a
commit d194a97df8
2 changed files with 27 additions and 0 deletions

View File

@ -434,6 +434,32 @@ int PacketQueue::packet_count(int stream_id) {
return packet_counts[stream_id];
} // end int PacketQueue::packet_count(int stream_id)
ZMLockedPacket *PacketQueue::get_packet_no_wait(packetqueue_iterator *it) {
if (deleting or zm_terminate)
return nullptr;
Debug(4, "Locking in get_packet using it %p queue end? %d",
std::addressof(*it), (*it == pktQueue.end()));
// scope for lock
std::unique_lock<std::mutex> lck(mutex);
Debug(4, "Have Lock in get_packet");
if ((*it == pktQueue.end()) and !(deleting or zm_terminate)) {
Debug(2, "waiting. Queue size %zu it == end? %d", pktQueue.size(), (*it == pktQueue.end()));
condition.wait(lck);
}
if ((*it == pktQueue.end()) or deleting or zm_terminate) return nullptr;
std::shared_ptr<ZMPacket> p = *(*it);
ZMLockedPacket *lp = new ZMLockedPacket(p);
if (lp->trylock()) {
Debug(2, "Locked packet %d, unlocking packetqueue mutex", p->image_index);
return lp;
}
delete lp;
return nullptr;
}
// Returns a packet. Packet will be locked
ZMLockedPacket *PacketQueue::get_packet(packetqueue_iterator *it) {
if (deleting or zm_terminate)

View File

@ -77,6 +77,7 @@ class PacketQueue {
bool increment_it(packetqueue_iterator *it);
bool increment_it(packetqueue_iterator *it, int stream_id);
ZMLockedPacket *get_packet(packetqueue_iterator *);
ZMLockedPacket *get_packet_no_wait(packetqueue_iterator *);
ZMLockedPacket *get_packet_and_increment_it(packetqueue_iterator *);
packetqueue_iterator *get_video_it(bool wait);
packetqueue_iterator *get_stream_it(int stream_id);