zeek/auxil/libunistd/portable/ipc/BsdSocketPool.cpp
Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

101 lines
2.1 KiB
C++

// BsdSocketPool.cpp
// Created by Robin Rowe on 11/27/2015
// Copyright (c) 2015 Robin.Rowe@CinePaint.org
// License open source MIT
#include "BsdSocketPool.h"
#include "../SoftLock.h"
#include "../VerboseCounter.h"
namespace portable
{
bool BsdSocketPool::SetSlot(SOCKET sid)
{ for(unsigned i =0;i<socketfd.size();i++)
{ if(!IsGood(socketfd[i]))
{ socketfd[i] = sid;
counter++;
return true;
} }
return SetZombieSlot(sid);
}
bool BsdSocketPool::SetZombieSlot(SOCKET sid)
{ for(unsigned i =0;i<socketfd.size();i++)
{ if(IsGood(socketfd[i]))
{ PacketSocket bsdSocket(socketfd[i]);
if(!bsdSocket.SendEmptyPacket())
{ socketfd[i] = sid;
return true;
} } }
return false;
}
bool BsdSocketPool::ReleaseSlot(SOCKET* sock)
{ for(unsigned i =0;i<socketfd.size();i++)
{ if(sock == &socketfd[i])
{ ReleaseSlot(i);
puts("released socket");
return true;
} }
return false;
}
void BsdSocketPool::ReleaseSlots()
{ for (unsigned i = 0; i<socketfd.size(); i++)
{ ReleaseSlot(i);
} }
int BsdSocketPool::DirectMulticast(Packet* framePacket)
{ if(!framePacket || !framePacket->IsGood())
{ return -1;
}
if(!counter)
{ return 0;
}
SoftLock softlock(framePacket->ownership);
if(!softlock)
{ puts("Can't lock frame packet");
return -1;
}
int count = 0;
for(unsigned i=0;i<socketfd.size();i++)
{ if(!socketfd[i])
{ continue;
}
if(!isStreaming)
{ continue;
}
if(!SendPacket(framePacket,i))
{ continue;
}
count++;
}
const unsigned packetSize = framePacket->GetPacketSize();
const unsigned packetId = framePacket->GetPacketId();
const PacketHeader::hash_t hash = framePacket->GetHash();
// printf("%u:%u #%u size=%u hash=%llx\n",count,(unsigned) counter,packetId,packetSize,hash);
return count;
}
void BsdSocketPool::ReleaseSlot(SOCKET slot)
{ if (slot >= socketfd.size())
{ return;
}
if (0 >= socketfd[slot])
{ return;
}
PacketSocket bsdSocket(socketfd[slot]);
bsdSocket.Close();
socketfd[slot] = 0;
if(!counter)
{ puts("Socket counter underflow");
}
else
{ counter--;
}
printf("Released slot %u, connections = %u\n", (unsigned)slot, (unsigned)counter);
}
}