Skip to content

Commit 4ce628b

Browse files
committed
target: fix invalid fd error in transport layer
Return FdHandle by value instead of returning pointer to a local object, which was going out of scope and causing invalid file descriptor errors during CFAM read/write operations. Also added temporary debug logs for demo; these will be removed in a later cleanup commit. Change-Id: I1476472b351dbdbdc98d59e9dc84bf740b90df9e
1 parent 7ec194b commit 4ce628b

File tree

1 file changed

+15
-12
lines changed

1 file changed

+15
-12
lines changed

target/transport/transport.C

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,8 @@ std::optional<FdHandle> fsiProbe(TARGETING::ConstTargetPtr target)
143143
return std::nullopt;
144144
}
145145

146-
std::optional<FdHandle*> prepareCfamAccess(TARGETING::ConstTargetPtr target,
147-
std::uint32_t addr)
146+
std::optional<FdHandle> prepareCfamAccess(TARGETING::ConstTargetPtr target,
147+
std::uint32_t addr)
148148
{
149149
std::cout << "DEMO: transport prepareCfamAccess addr 0x" << std::hex << addr
150150
<< " path " << getPhyPath(target) << "\n";
@@ -159,14 +159,16 @@ std::optional<FdHandle*> prepareCfamAccess(TARGETING::ConstTargetPtr target,
159159
}
160160

161161
FdHandle& fd = *fdOpt;
162+
std::cout << "DEMO:transport prepareCfamAcccess fd " << fd.get() << " off "
163+
<< off << std::endl;
162164
if (::lseek(fd.get(), off, SEEK_SET) < 0)
163165
{
164166
std::cerr << "CFAM lseek failed addr=0x" << std::hex << addr
165167
<< " errno=" << errno << " (" << strerror(errno) << ")\n";
166168
return std::nullopt;
167169
}
168170

169-
return &fd;
171+
return std::move(fd);
170172
}
171173

172174
std::optional<FdHandle> prepareScomAccess(TARGETING::ConstTargetPtr target,
@@ -230,14 +232,15 @@ int send_all(int fd, std::span<const std::byte> cmd)
230232
int getCfam(TARGETING::ConstTargetPtr target, std::uint32_t addr,
231233
std::uint32_t& value)
232234
{
233-
auto fdPtrOpt = prepareCfamAccess(target, addr);
234-
if (!fdPtrOpt)
235+
auto fdOpt = prepareCfamAccess(target, addr);
236+
if (!fdOpt)
235237
{
236238
return -1;
237239
}
238-
239-
FdHandle* fd = *fdPtrOpt;
240-
if (::read(fd->get(), &value, sizeof(value)) < 0)
240+
FdHandle& fd = *fdOpt;
241+
std::cout << "DEMO transport: getCfam addr 0x" << std::hex << addr << " fd "
242+
<< fd.get() << std::endl;
243+
if (::read(fd.get(), &value, sizeof(value)) < 0)
241244
{
242245
std::cerr << "getCfam read failed addr=0x" << std::hex << addr
243246
<< " errno=" << errno << " (" << strerror(errno) << ")\n";
@@ -253,15 +256,15 @@ int getCfam(TARGETING::ConstTargetPtr target, std::uint32_t addr,
253256
int putCfam(TARGETING::ConstTargetPtr target, std::uint32_t addr,
254257
std::uint32_t value)
255258
{
256-
auto fdPtrOpt = prepareCfamAccess(target, addr);
257-
if (!fdPtrOpt)
259+
auto fdOpt = prepareCfamAccess(target, addr);
260+
if (!fdOpt)
258261
{
259262
return -1;
260263
}
261264

262-
FdHandle* fd = *fdPtrOpt;
265+
FdHandle& fd = *fdOpt;
263266
value = htobe32(value);
264-
if (::write(fd->get(), &value, sizeof(value)) < 0)
267+
if (::write(fd.get(), &value, sizeof(value)) < 0)
265268
{
266269
std::cerr << "putCfam write failed addr=0x" << std::hex << addr << "\n";
267270
return -1;

0 commit comments

Comments
 (0)