EXI: Use unique_ptr in CEXIEthernet

This commit is contained in:
Stenzek 2016-01-31 23:02:29 +10:00
parent e75d37ec36
commit 98e5270b3c
5 changed files with 20 additions and 24 deletions

View File

@ -75,14 +75,14 @@ static void ReadThreadHandler(CEXIETHERNET* self)
if (select(self->fd + 1, &rfds, nullptr, nullptr, &timeout) <= 0) if (select(self->fd + 1, &rfds, nullptr, nullptr, &timeout) <= 0)
continue; continue;
int readBytes = read(self->fd, self->mRecvBuffer, BBA_RECV_SIZE); int readBytes = read(self->fd, self->mRecvBuffer.get(), BBA_RECV_SIZE);
if (readBytes < 0) if (readBytes < 0)
{ {
ERROR_LOG(SP1, "Failed to read from BBA, err=%d", readBytes); ERROR_LOG(SP1, "Failed to read from BBA, err=%d", readBytes);
} }
else if (self->readEnabled.IsSet()) else if (self->readEnabled.IsSet())
{ {
INFO_LOG(SP1, "Read data: %s", ArrayToString(self->mRecvBuffer, readBytes, 0x10).c_str()); INFO_LOG(SP1, "Read data: %s", ArrayToString(self->mRecvBuffer.get(), readBytes, 0x10).c_str());
self->mRecvBufferLength = readBytes; self->mRecvBufferLength = readBytes;
self->RecvHandlePacket(); self->RecvHandlePacket();
} }

View File

@ -137,14 +137,14 @@ static void ReadThreadHandler(CEXIETHERNET* self)
if (select(self->fd + 1, &rfds, nullptr, nullptr, &timeout) <= 0) if (select(self->fd + 1, &rfds, nullptr, nullptr, &timeout) <= 0)
continue; continue;
int readBytes = read(self->fd, self->mRecvBuffer, BBA_RECV_SIZE); int readBytes = read(self->fd, self->mRecvBuffer.get(), BBA_RECV_SIZE);
if (readBytes < 0) if (readBytes < 0)
{ {
ERROR_LOG(SP1, "Failed to read from BBA, err=%d", readBytes); ERROR_LOG(SP1, "Failed to read from BBA, err=%d", readBytes);
} }
else if (self->readEnabled.IsSet()) else if (self->readEnabled.IsSet())
{ {
INFO_LOG(SP1, "Read data: %s", ArrayToString(self->mRecvBuffer, readBytes, 0x10).c_str()); INFO_LOG(SP1, "Read data: %s", ArrayToString(self->mRecvBuffer.get(), readBytes, 0x10).c_str());
self->mRecvBufferLength = readBytes; self->mRecvBufferLength = readBytes;
self->RecvHandlePacket(); self->RecvHandlePacket();
} }

View File

@ -270,7 +270,7 @@ static void ReadThreadHandler(CEXIETHERNET* self)
DWORD transferred; DWORD transferred;
// Read from TAP into internal buffer. // Read from TAP into internal buffer.
if (ReadFile(self->mHAdapter, self->mRecvBuffer, BBA_RECV_SIZE, &transferred, &self->mReadOverlapped)) if (ReadFile(self->mHAdapter, self->mRecvBuffer.get(), BBA_RECV_SIZE, &transferred, &self->mReadOverlapped))
{ {
// Returning immediately is not likely to happen, but if so, reset the event state manually. // Returning immediately is not likely to happen, but if so, reset the event state manually.
ResetEvent(self->mReadOverlapped.hEvent); ResetEvent(self->mReadOverlapped.hEvent);
@ -298,7 +298,7 @@ static void ReadThreadHandler(CEXIETHERNET* self)
} }
// Copy to BBA buffer, and fire interrupt if enabled. // Copy to BBA buffer, and fire interrupt if enabled.
DEBUG_LOG(SP1, "Received %u bytes\n: %s", transferred, ArrayToString(self->mRecvBuffer, transferred, 0x10).c_str()); DEBUG_LOG(SP1, "Received %u bytes\n: %s", transferred, ArrayToString(self->mRecvBuffer.get(), transferred, 0x10).c_str());
if (self->readEnabled.IsSet()) if (self->readEnabled.IsSet())
{ {
self->mRecvBufferLength = transferred; self->mRecvBufferLength = transferred;

View File

@ -20,10 +20,10 @@
CEXIETHERNET::CEXIETHERNET() CEXIETHERNET::CEXIETHERNET()
{ {
tx_fifo = new u8[BBA_TXFIFO_SIZE]; tx_fifo = std::make_unique<u8[]>(BBA_TXFIFO_SIZE);
mBbaMem = new u8[BBA_MEM_SIZE]; mBbaMem = std::make_unique<u8[]>(BBA_MEM_SIZE);
mRecvBuffer = new u8[BBA_RECV_SIZE]; mRecvBuffer = std::make_unique<u8[]>(BBA_RECV_SIZE);
mRecvBufferLength = 0; mRecvBufferLength = 0;
MXHardReset(); MXHardReset();
@ -58,10 +58,6 @@ CEXIETHERNET::CEXIETHERNET()
CEXIETHERNET::~CEXIETHERNET() CEXIETHERNET::~CEXIETHERNET()
{ {
Deactivate(); Deactivate();
delete[] tx_fifo;
delete[] mBbaMem;
delete[] mRecvBuffer;
} }
void CEXIETHERNET::SetCS(int cs) void CEXIETHERNET::SetCS(int cs)
@ -206,8 +202,8 @@ void CEXIETHERNET::DMARead(u32 addr, u32 size)
void CEXIETHERNET::DoState(PointerWrap &p) void CEXIETHERNET::DoState(PointerWrap &p)
{ {
p.DoArray(tx_fifo, BBA_TXFIFO_SIZE); p.DoArray(tx_fifo.get(), BBA_TXFIFO_SIZE);
p.DoArray(mBbaMem, BBA_MEM_SIZE); p.DoArray(mBbaMem.get(), BBA_MEM_SIZE);
} }
bool CEXIETHERNET::IsMXCommand(u32 const data) bool CEXIETHERNET::IsMXCommand(u32 const data)
@ -298,7 +294,7 @@ const char* CEXIETHERNET::GetRegisterName() const
void CEXIETHERNET::MXHardReset() void CEXIETHERNET::MXHardReset()
{ {
memset(mBbaMem, 0, BBA_MEM_SIZE); memset(mBbaMem.get(), 0, BBA_MEM_SIZE);
mBbaMem[BBA_NCRB] = NCRB_PR; mBbaMem[BBA_NCRB] = NCRB_PR;
mBbaMem[BBA_NWAYC] = NWAYC_LTE | NWAYC_ANE; mBbaMem[BBA_NWAYC] = NWAYC_LTE | NWAYC_ANE;
@ -384,7 +380,7 @@ void CEXIETHERNET::DirectFIFOWrite(u8 *data, u32 size)
u16 *tx_fifo_count = (u16 *)&mBbaMem[BBA_TXFIFOCNT]; u16 *tx_fifo_count = (u16 *)&mBbaMem[BBA_TXFIFOCNT];
memcpy(tx_fifo + *tx_fifo_count, data, size); memcpy(tx_fifo.get() + *tx_fifo_count, data, size);
*tx_fifo_count += size; *tx_fifo_count += size;
// TODO: not sure this mask is correct. // TODO: not sure this mask is correct.
@ -395,7 +391,7 @@ void CEXIETHERNET::DirectFIFOWrite(u8 *data, u32 size)
void CEXIETHERNET::SendFromDirectFIFO() void CEXIETHERNET::SendFromDirectFIFO()
{ {
SendFrame(tx_fifo, *(u16 *)&mBbaMem[BBA_TXFIFOCNT]); SendFrame(tx_fifo.get(), *(u16 *)&mBbaMem[BBA_TXFIFOCNT]);
} }
void CEXIETHERNET::SendFromPacketBuffer() void CEXIETHERNET::SendFromPacketBuffer()
@ -452,9 +448,9 @@ inline bool CEXIETHERNET::RecvMACFilter()
// Unicast? // Unicast?
if ((mRecvBuffer[0] & 0x01) == 0) if ((mRecvBuffer[0] & 0x01) == 0)
{ {
return memcmp(mRecvBuffer, &mBbaMem[BBA_NAFR_PAR0], 6) == 0; return memcmp(mRecvBuffer.get(), &mBbaMem[BBA_NAFR_PAR0], 6) == 0;
} }
else if (memcmp(mRecvBuffer, broadcast, 6) == 0) else if (memcmp(mRecvBuffer.get(), broadcast, 6) == 0)
{ {
// Accept broadcast? // Accept broadcast?
return !!(mBbaMem[BBA_NCRB] & NCRB_AB); return !!(mBbaMem[BBA_NCRB] & NCRB_AB);
@ -467,7 +463,7 @@ inline bool CEXIETHERNET::RecvMACFilter()
else else
{ {
// Lookup the dest eth address in the hashmap // Lookup the dest eth address in the hashmap
u16 index = HashIndex(mRecvBuffer); u16 index = HashIndex(mRecvBuffer.get());
return !!(mBbaMem[BBA_NAFR_MAR0 + index / 8] & (1 << (index % 8))); return !!(mBbaMem[BBA_NAFR_MAR0 + index / 8] & (1 << (index % 8)));
} }
} }

View File

@ -310,8 +310,8 @@ public:
void inc_rwp(); void inc_rwp();
bool RecvHandlePacket(); bool RecvHandlePacket();
u8 *tx_fifo; std::unique_ptr<u8[]> mBbaMem;
u8 *mBbaMem; std::unique_ptr<u8[]> tx_fifo;
// TAP interface // TAP interface
bool Activate(); bool Activate();
@ -322,7 +322,7 @@ public:
void RecvStart(); void RecvStart();
void RecvStop(); void RecvStop();
u8 *mRecvBuffer; std::unique_ptr<u8[]> mRecvBuffer;
u32 mRecvBufferLength; u32 mRecvBufferLength;
#if defined(_WIN32) #if defined(_WIN32)