aboutsummaryrefslogtreecommitdiffstats
path: root/pseudo_server.c
diff options
context:
space:
mode:
Diffstat (limited to 'pseudo_server.c')
-rw-r--r--pseudo_server.c30
1 files changed, 20 insertions, 10 deletions
diff --git a/pseudo_server.c b/pseudo_server.c
index 4af5265..2597def 100644
--- a/pseudo_server.c
+++ b/pseudo_server.c
@@ -1,7 +1,7 @@
/*
* pseudo_server.c, pseudo's server-side logic and message handling
*
- * Copyright (c) 2008-2010 Wind River Systems, Inc.
+ * Copyright (c) 2008-2010, 2013 Wind River Systems, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the Lesser GNU General Public License version 2.1 as
@@ -76,7 +76,7 @@ quit_now(int signal) {
die_forcefully = 1;
}
-static int messages = 0;
+static int messages = 0, responses = 0;
static struct timeval message_time = { .tv_sec = 0 };
static void pseudo_server_loop(void);
@@ -268,6 +268,7 @@ serve_client(int i) {
in = pseudo_msg_receive(clients[i].fd);
if (in) {
char *response_path = 0;
+ int send_response = 1;
pseudo_debug(4, "got a message (%d): %s\n", in->type, (in->pathlen ? in->path : "<no path>"));
/* handle incoming ping */
if (in->type == PSEUDO_MSG_PING && !clients[i].pid) {
@@ -303,6 +304,8 @@ serve_client(int i) {
* pseudo_server_response.
*/
if (in->type != PSEUDO_MSG_SHUTDOWN) {
+ if (in->type == PSEUDO_MSG_FASTOP)
+ send_response = 0;
if (pseudo_server_response(in, clients[i].program, clients[i].tag)) {
in->type = PSEUDO_MSG_NAK;
} else {
@@ -343,10 +346,14 @@ serve_client(int i) {
die_peacefully = 1;
}
}
- if ((rc = pseudo_msg_send(clients[i].fd, in, -1, response_path)) != 0)
- pseudo_debug(1, "failed to send response to client %d [%d]: %d (%s)\n",
- i, (int) clients[i].pid, rc, strerror(errno));
- rc = in->op;
+ if (send_response) {
+ if ((rc = pseudo_msg_send(clients[i].fd, in, -1, response_path)) != 0) {
+ pseudo_debug(1, "failed to send response to client %d [%d]: %d (%s)\n",
+ i, (int) clients[i].pid, rc, strerror(errno));
+ }
+ } else {
+ rc = 1;
+ }
free(response_path);
return rc;
} else {
@@ -423,10 +430,11 @@ pseudo_server_loop(void) {
die_peacefully = 1;
} else {
/* display this if not exiting */
- pseudo_debug(1, "%d messages handled in %.4f seconds\n",
+ pseudo_debug(1, "%d messages handled in %.4f seconds, %d responses\n",
messages,
(double) message_time.tv_sec +
- (double) message_time.tv_usec / 1000000.0);
+ (double) message_time.tv_usec / 1000000.0,
+ responses);
}
}
} else if (rc > 0) {
@@ -439,11 +447,13 @@ pseudo_server_loop(void) {
close_client(i);
} else if (FD_ISSET(clients[i].fd, &reads)) {
struct timeval tv1, tv2;
- int op;
+ int rc;
gettimeofday(&tv1, NULL);
- op = serve_client(i);
+ rc = serve_client(i);
gettimeofday(&tv2, NULL);
++messages;
+ if (rc == 0)
+ ++responses;
message_time.tv_sec += (tv2.tv_sec - tv1.tv_sec);
message_time.tv_usec += (tv2.tv_usec - tv1.tv_usec);
if (message_time.tv_usec < 0) {