Skip to content

Commit 469d491

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 06e8251 commit 469d491

File tree

1 file changed

+16
-12
lines changed

1 file changed

+16
-12
lines changed

target/transport/transport.C

Lines changed: 16 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
const auto off = encodeFsiAddr(addr);
150150
auto fdOpt = fsiProbe(target);
@@ -156,14 +156,16 @@ std::optional<FdHandle*> prepareCfamAccess(TARGETING::ConstTargetPtr target,
156156
}
157157

158158
FdHandle& fd = *fdOpt;
159+
std::cout << "DEMO:transport prepareCfamAcccess fd " << fd.get() << " off "
160+
<< off << std::endl;
159161
if (::lseek(fd.get(), off, SEEK_SET) < 0)
160162
{
161163
std::cerr << "CFAM lseek failed addr=0x" << std::hex << addr
162164
<< " errno=" << errno << " (" << strerror(errno) << ")\n";
163165
return std::nullopt;
164166
}
165167

166-
return &fd;
168+
return std::move(fd);
167169
}
168170

169171
std::optional<FdHandle> prepareScomAccess(TARGETING::ConstTargetPtr target,
@@ -228,15 +230,17 @@ int send_all(int fd, std::span<const std::byte> cmd)
228230
int getCfam(TARGETING::ConstTargetPtr target, std::uint32_t addr,
229231
std::uint32_t& value)
230232
{
233+
<<<<<<< HEAD
231234

232-
auto fdPtrOpt = prepareCfamAccess(target, addr);
233-
if (!fdPtrOpt)
235+
auto fdOpt = prepareCfamAccess(target, addr);
236+
if (!fdOpt)
234237
{
235238
return -1;
236239
}
237-
238-
FdHandle* fd = *fdPtrOpt;
239-
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)
240244
{
241245
std::cerr << "getCfam read failed addr=0x" << std::hex << addr
242246
<< " errno=" << errno << " (" << strerror(errno) << ")\n";
@@ -252,15 +256,15 @@ int getCfam(TARGETING::ConstTargetPtr target, std::uint32_t addr,
252256
int putCfam(TARGETING::ConstTargetPtr target, std::uint32_t addr,
253257
std::uint32_t value)
254258
{
255-
auto fdPtrOpt = prepareCfamAccess(target, addr);
256-
if (!fdPtrOpt)
259+
auto fdOpt = prepareCfamAccess(target, addr);
260+
if (!fdOpt)
257261
{
258262
return -1;
259263
}
260264

261-
FdHandle* fd = *fdPtrOpt;
265+
FdHandle& fd = *fdOpt;
262266
value = htobe32(value);
263-
if (::write(fd->get(), &value, sizeof(value)) < 0)
267+
if (::write(fd.get(), &value, sizeof(value)) < 0)
264268
{
265269
std::cerr << "putCfam write failed addr=0x" << std::hex << addr << "\n";
266270
return -1;

0 commit comments

Comments
 (0)