From: Steven Rostedt <rostedt@goodmis.org>
To: linux-trace-devel@vger.kernel.org
Subject: [PATCH 28/38 v2] trace-cmd msg: Add server structure of msg_handler
Date: Wed, 3 Jan 2018 15:31:35 -0500 [thread overview]
Message-ID: <20180103153135.334fb40f@gandalf.local.home> (raw)
In-Reply-To: <20180103175338.836951140@goodmis.org>
[ This wasn't backported properly ]
From: "Steven Rostedt (Red Hat)" <rostedt@goodmis.org>
Have a server descriptor that is passed around. Currently, it only holds the
"done" variable to tell when the server is finished.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
trace-cmd.h | 2 ++
trace-listen.c | 40 +++++++++++++++++-----------------------
trace-msg.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
trace-msg.h | 3 ---
4 files changed, 74 insertions(+), 29 deletions(-)
diff --git a/trace-cmd.h b/trace-cmd.h
index 0fce54b..2fe4b20 100644
--- a/trace-cmd.h
+++ b/trace-cmd.h
@@ -336,6 +336,8 @@ int tracecmd_msg_initial_setting(struct tracecmd_msg_handle *msg_handle,
int tracecmd_msg_send_port_array(struct tracecmd_msg_handle *msg_handle,
int total_cpus, int *ports);
int tracecmd_msg_collect_metadata(struct tracecmd_msg_handle *msg_handle, int ofd);
+bool tracecmd_msg_done(struct tracecmd_msg_handle *msg_handle);
+void tracecmd_msg_set_done(struct tracecmd_msg_handle *msg_handle);
/* --- Plugin handling --- */
extern struct pevent_plugin_option trace_ftrace_options[];
diff --git a/trace-listen.c b/trace-listen.c
index d5379b3..92f6561 100644
--- a/trace-listen.c
+++ b/trace-listen.c
@@ -55,6 +55,10 @@ static int proto_ver;
static int do_daemon;
+/* Used for signaling INT to finish */
+static struct tracecmd_msg_handle *stop_msg_handle;
+static bool done;
+
#define TEMP_FILE_STR "%s.%s:%s.cpu%d", output_file, host, port, cpu
static char *get_temp_file(const char *host, const char *port, int cpu)
{
@@ -118,28 +122,10 @@ static int process_option(char *option)
return 0;
}
-struct tracecmd_msg_handle *
-tracecmd_msg_handle_alloc(int fd, unsigned long flags)
-{
- struct tracecmd_msg_handle *handle;
-
- handle = calloc(1, sizeof(struct tracecmd_msg_handle));
- if (!handle)
- return NULL;
-
- handle->fd = fd;
- handle->flags = flags;
- return handle;
-}
-
-void tracecmd_msg_handle_close(struct tracecmd_msg_handle *msg_handle)
-{
- close(msg_handle->fd);
- free(msg_handle);
-}
-
static void finish(int sig)
{
+ if (stop_msg_handle)
+ tracecmd_msg_set_done(stop_msg_handle);
done = true;
}
@@ -602,10 +588,13 @@ static int *create_all_readers(int cpus, const char *node, const char *port,
return NULL;
}
-static void collect_metadata_from_client(int ifd, int ofd)
+static void
+collect_metadata_from_client(struct tracecmd_msg_handle *msg_handle,
+ int ofd)
{
char buf[BUFSIZ];
int n, s, t;
+ int ifd = msg_handle->fd;
do {
n = read(ifd, buf, BUFSIZ);
@@ -626,7 +615,7 @@ static void collect_metadata_from_client(int ifd, int ofd)
t -= s;
s = n - t;
} while (t);
- } while (n > 0 && !done);
+ } while (n > 0 && !tracecmd_msg_done(msg_handle));
}
static void stop_all_readers(int cpus, int *pid_array)
@@ -686,11 +675,16 @@ static int process_client(struct tracecmd_msg_handle *msg_handle,
if (!pid_array)
return -ENOMEM;
+ /* on signal stop this msg */
+ stop_msg_handle = msg_handle;
+
/* Now we are ready to start reading data from the client */
if (proto_ver == V2_PROTOCOL)
tracecmd_msg_collect_metadata(msg_handle, ofd);
else
- collect_metadata_from_client(msg_handle->fd, ofd);
+ collect_metadata_from_client(msg_handle, ofd);
+
+ stop_msg_handle = NULL;
/* wait a little to let our readers finish reading */
sleep(1);
diff --git a/trace-msg.c b/trace-msg.c
index 7c93ff3..0c37db9 100644
--- a/trace-msg.c
+++ b/trace-msg.c
@@ -81,8 +81,20 @@ bool use_tcp;
/* for client */
unsigned int page_size;
-/* for server */
-bool done;
+struct tracecmd_msg_server {
+ struct tracecmd_msg_handle handle;
+ int done;
+};
+
+static struct tracecmd_msg_server *
+make_server(struct tracecmd_msg_handle *msg_handle)
+{
+ if (!(msg_handle->flags & TRACECMD_MSG_FL_SERVER)) {
+ plog("Message handle not of type server\n");
+ return NULL;
+ }
+ return (struct tracecmd_msg_server *)msg_handle;
+}
struct tracecmd_msg_opt {
be32 size;
@@ -357,6 +369,20 @@ error:
#define MSG_WAIT_MSEC 5000
static int msg_wait_to = MSG_WAIT_MSEC;
+bool tracecmd_msg_done(struct tracecmd_msg_handle *msg_handle)
+{
+ struct tracecmd_msg_server *msg_server = make_server(msg_handle);
+
+ return (volatile int)msg_server->done;
+}
+
+void tracecmd_msg_set_done(struct tracecmd_msg_handle *msg_handle)
+{
+ struct tracecmd_msg_server *msg_server = make_server(msg_handle);
+
+ msg_server->done = true;
+}
+
/*
* A return value of 0 indicates time-out
*/
@@ -452,6 +478,32 @@ static void error_operation_for_server(struct tracecmd_msg *msg)
warning("Message: cmd=%d size=%d\n", cmd, ntohl(msg->hdr.size));
}
+struct tracecmd_msg_handle *
+tracecmd_msg_handle_alloc(int fd, unsigned long flags)
+{
+ struct tracecmd_msg_handle *handle;
+ int size;
+
+ if (flags == TRACECMD_MSG_FL_SERVER)
+ size = sizeof(struct tracecmd_msg_server);
+ else
+ size = sizeof(struct tracecmd_msg_handle);
+
+ handle = calloc(1, size);
+ if (!handle)
+ return NULL;
+
+ handle->fd = fd;
+ handle->flags = flags;
+ return handle;
+}
+
+void tracecmd_msg_handle_close(struct tracecmd_msg_handle *msg_handle)
+{
+ close(msg_handle->fd);
+ free(msg_handle);
+}
+
#define MAX_OPTION_SIZE 4096
int tracecmd_msg_initial_setting(struct tracecmd_msg_handle *msg_handle,
@@ -648,7 +700,7 @@ int tracecmd_msg_collect_metadata(struct tracecmd_msg_handle *msg_handle, int of
} while (cmd == MSG_SENDMETA);
/* check the finish message of the client */
- while (!done) {
+ while (!tracecmd_msg_done(msg_handle)) {
ret = tracecmd_msg_recv(msg_handle->fd, &msg);
if (ret < 0) {
warning("reading client");
diff --git a/trace-msg.h b/trace-msg.h
index 7f6a146..da563ea 100644
--- a/trace-msg.h
+++ b/trace-msg.h
@@ -16,9 +16,6 @@ extern bool use_tcp;
/* for client */
extern unsigned int page_size;
-/* for server */
-extern bool done;
-
void plog(const char *fmt, ...);
void pdie(const char *fmt, ...);
--
2.13.6
next prev parent reply other threads:[~2018-01-03 20:31 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-03 17:52 [PATCH 00/38] trace-cmd: Simplify the msg handling Steven Rostedt
2018-01-03 17:52 ` [PATCH 01/38] trace-cmd recorder: Check if pipe_size was modified by fcntl(F_GETPIPE_SZ) Steven Rostedt
2018-01-03 17:52 ` [PATCH 02/38] pevent: Simplify pointer print logic and fix %pF Steven Rostedt
2018-01-03 17:52 ` [PATCH 03/38] pevent: Handle new pointer processing of bprint strings Steven Rostedt
2018-01-03 17:52 ` [PATCH 04/38] trace-cmd record: Fix clearing out the ctx->instance when used in for_all_instances() Steven Rostedt
2018-01-03 17:52 ` [PATCH 05/38] trace-cmd: Remove the creating of msg out of tracecmd_msg_send() Steven Rostedt
2018-01-03 17:52 ` [PATCH 06/38] trace-cmd: Move tracecmd_msg_send_and_wait_for_msg() into its only user Steven Rostedt
2018-01-03 17:52 ` [PATCH 07/38] trace-cmd: Turn tracecmd_msg data into an anonymous union Steven Rostedt
2018-01-03 17:52 ` [PATCH 08/38] trace-cmd: Remove unused structure tracecmd_msg_error Steven Rostedt
2018-01-03 17:52 ` [PATCH 09/38] trace-cmd: Move size and cmd in tracecmd_msg into its own header struct Steven Rostedt
2018-01-03 17:52 ` [PATCH 10/38] trace-cmd: Move the tracecmd_msg pointers into their own union Steven Rostedt
2018-01-03 17:52 ` [PATCH 11/38] trace-cmd: Just use the buf field for sending pointers Steven Rostedt
2018-01-03 17:52 ` [PATCH 12/38] trace-cmd: Use an array to map msg types and min sizes Steven Rostedt
2018-01-03 17:52 ` [PATCH 13/38] trace-cmd: Merge msg_do_write_check() into msg_write() Steven Rostedt
2018-01-03 17:52 ` [PATCH 14/38] trace-cmd: Simplify msg_free() by using min sizes Steven Rostedt
2018-01-03 17:52 ` [PATCH 15/38] trace-cmd: Add tracecmd_msg_init() helper function Steven Rostedt
2018-01-03 17:52 ` [PATCH 16/38] trace-cmd: Remove mulitplexer tracecmd_msg_create() Steven Rostedt
2018-01-03 17:52 ` [PATCH 17/38] trace-cmd: Simplify msg_read_extra() Steven Rostedt
2018-01-03 17:52 ` [PATCH 18/38] trace-cmd: Have msg_free() zero out msg contents Steven Rostedt
2018-01-03 17:52 ` [PATCH 19/38] trace-cmd: Verify RINIT was received after TINIT msg sent Steven Rostedt
2018-01-03 17:52 ` [PATCH 20/38] trace-cmd: Make send_metadata a flag in the output handle Steven Rostedt
2018-01-03 17:52 ` [PATCH 21/38] trace-cmd: Pass cpu count and port array to make_rinit() Steven Rostedt
2018-01-03 17:52 ` [PATCH 22/38] trace-cmd: Pass cpu_count instead of having it as a global Steven Rostedt
2018-01-03 17:52 ` [PATCH 23/38] trace-cmd: Pass in client_ports instead of using a global variable Steven Rostedt
2018-01-03 17:52 ` [PATCH 24/38] trace-cmd msg: Add debug prints of messages sent and received Steven Rostedt
2018-01-03 17:52 ` [PATCH 25/38] trace-cmd msg: Move the saved closing fd to the caller Steven Rostedt
2018-01-03 17:52 ` [PATCH 26/38] trace-cmd listen: Add better output on error of connections Steven Rostedt
2018-01-03 17:52 ` [PATCH 27/38] trace-cmd msg: Create a msg_handle to pass around for saved state Steven Rostedt
2018-01-03 17:52 ` [PATCH 28/38] trace-cmd msg: Add server structure of msg_handler Steven Rostedt
2018-01-03 20:31 ` Steven Rostedt [this message]
2018-01-03 17:52 ` [PATCH 29/38] trace-cmd: Remove global use_tcp variable Steven Rostedt
2018-01-03 17:52 ` [PATCH 30/38] trace-cmd: Move protocol version into msg_handler Steven Rostedt
2018-01-03 17:52 ` [PATCH 31/38] tracecmd: Clean up handling of cpu_count Steven Rostedt
2018-01-03 17:52 ` [PATCH 32/38] tracecmd listen: Have pagesize passed as return not parameter Steven Rostedt
2018-01-03 17:52 ` [PATCH 33/38] trace-cmd: Have cpu_count reside in instances and not be global Steven Rostedt
2018-01-03 17:52 ` [PATCH 34/38] trace-cmd: Add option CPUCOUNT to buffer instance options Steven Rostedt
2018-01-03 17:52 ` [PATCH 35/38] trace-cmd: Have msg_handle part of the buffer instance Steven Rostedt
2018-01-03 17:52 ` [PATCH 36/38] trace-cmd record: Allow instances to be recorded over the network Steven Rostedt
2018-01-03 17:52 ` [PATCH 37/38] trace-cmd: Have keep and profile be flags of buffer instance Steven Rostedt
2018-01-03 17:52 ` [PATCH 38/38] trace-cmd: Add network handle into " Steven Rostedt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180103153135.334fb40f@gandalf.local.home \
--to=rostedt@goodmis.org \
--cc=linux-trace-devel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).