[PATCH 1/3] record: Use exceptions
Sebastian Huber
sebastian.huber at embedded-brains.de
Wed Sep 4 05:18:38 UTC 2019
Update #3665.
---
trace/record/client.h | 41 ++++++++++++++++++++++++++++++++++----
trace/record/record-client-base.cc | 35 +++++++++++++++++++++++---------
trace/record/record-main-lttng.cc | 26 ++++++++++++++----------
3 files changed, 78 insertions(+), 24 deletions(-)
diff --git a/trace/record/client.h b/trace/record/client.h
index 2d55052..1bf8d37 100644
--- a/trace/record/client.h
+++ b/trace/record/client.h
@@ -31,9 +31,43 @@
#include <rtems/recordclient.h>
#include <rtems/recorddata.h>
+#include <errno.h>
#include <sys/types.h>
#include <csignal>
+#include <cstring>
+#include <iostream>
+#include <stdexcept>
+#include <string>
+
+class ErrnoException : public std::runtime_error {
+ public:
+ ErrnoException(std::string msg)
+ : std::runtime_error(msg + ": " + strerror(errno)) {
+ // Nothing to do
+ }
+};
+
+class FileDescriptor {
+ public:
+ FileDescriptor() = default;
+
+ FileDescriptor(const FileDescriptor&) = delete;
+
+ FileDescriptor& operator=(const FileDescriptor&) = delete;
+
+ void Open(const char* file);
+
+ void Connect(const char* host, uint16_t port);
+
+ ssize_t Read(void* buf, size_t n) { return (*reader_)(fd_, buf, n); }
+
+ void Destroy();
+
+ private:
+ int fd_ = -1;
+ ssize_t (*reader_)(int fd, void* buf, size_t n) = nullptr;
+};
class Client {
public:
@@ -43,9 +77,9 @@ class Client {
Client& operator=(const Client&) = delete;
- void Open(const char* file);
+ void Open(const char* file) { input_.Open(file); }
- void Connect(const char* host, uint16_t port);
+ void Connect(const char* host, uint16_t port) { input_.Connect(host, port); }
void Run();
@@ -62,8 +96,7 @@ class Client {
private:
rtems_record_client_context base_;
- int fd_ = -1;
- ssize_t (*reader_)(int fd, void* buf, size_t n) = nullptr;
+ FileDescriptor input_;
sig_atomic_t stop_ = 0;
};
diff --git a/trace/record/record-client-base.cc b/trace/record/record-client-base.cc
index e56608c..d9e1eea 100644
--- a/trace/record/record-client-base.cc
+++ b/trace/record/record-client-base.cc
@@ -45,17 +45,24 @@ static ssize_t ReadSocket(int fd, void* buf, size_t n) {
return recv(fd, buf, n, 0);
}
-void Client::Open(const char* file) {
+void FileDescriptor::Open(const char* file) {
assert(fd_ == -1);
+
fd_ = open(file, O_RDONLY);
- assert(fd_ >= 0);
+ if (fd_ < 0) {
+ throw ErrnoException(std::string("cannot open file '") + file + "'");
+ }
+
reader_ = ReadFile;
}
-void Client::Connect(const char* host, uint16_t port) {
+void FileDescriptor::Connect(const char* host, uint16_t port) {
assert(fd_ == -1);
+
fd_ = socket(PF_INET, SOCK_STREAM, 0);
- assert(fd_ >= 0);
+ if (fd_ < 0) {
+ throw ErrnoException("cannot open socket");
+ }
struct sockaddr_in in_addr;
memset(&in_addr, 0, sizeof(in_addr));
@@ -64,15 +71,27 @@ void Client::Connect(const char* host, uint16_t port) {
in_addr.sin_addr.s_addr = inet_addr(host);
int rv = connect(fd_, (struct sockaddr*)&in_addr, sizeof(in_addr));
- assert(rv == 0);
+ if (rv != 0) {
+ throw ErrnoException(std::string("cannot connect to ") + host + " port " +
+ std::to_string(port));
+ }
reader_ = ReadSocket;
}
+void FileDescriptor::Destroy() {
+ if (fd_ != -1) {
+ int rv = close(fd_);
+ if (rv != 0) {
+ std::cerr << "close failed: " << strerror(errno) << std::endl;
+ }
+ }
+}
+
void Client::Run() {
while (stop_ == 0) {
int buf[8192];
- ssize_t n = (*reader_)(fd_, buf, sizeof(buf));
+ ssize_t n = input_.Read(buf, sizeof(buf));
if (n > 0) {
rtems_record_client_run(&base_, buf, static_cast<size_t>(n));
@@ -83,8 +102,6 @@ void Client::Run() {
}
void Client::Destroy() {
- int rv = close(fd_);
- assert(rv == 0);
-
+ input_.Destroy();
rtems_record_client_destroy(&base_);
}
diff --git a/trace/record/record-main-lttng.cc b/trace/record/record-main-lttng.cc
index 51d4f0e..be2406d 100644
--- a/trace/record/record-main-lttng.cc
+++ b/trace/record/record-main-lttng.cc
@@ -487,19 +487,23 @@ int main(int argc, char** argv) {
}
}
- GenerateMetadata();
- client.OpenStreamFiles();
+ try {
+ GenerateMetadata();
+ client.OpenStreamFiles();
+
+ if (file != nullptr) {
+ client.Open(file);
+ } else {
+ client.Connect(host, port);
+ }
- if (file != nullptr) {
- client.Open(file);
- } else {
- client.Connect(host, port);
+ signal(SIGINT, SignalHandler);
+ client.Run();
+ client.Destroy();
+ client.CloseStreamFiles();
+ } catch (std::exception& e) {
+ std::cerr << e.what() << std::endl;
}
- signal(SIGINT, SignalHandler);
- client.Run();
- client.Destroy();
- client.CloseStreamFiles();
-
return 0;
}
--
2.16.4
More information about the devel
mailing list