8 #include <sys/socket.h>
17 static int socketfd = -1;
18 static unsigned int _rid_count = 1;
19 static int _evas_cserve2_usage_log_dom = -1;
21 static struct sockaddr_un socksize;
23 #define UNIX_PATH_MAX sizeof(socksize.sun_path)
29 #define ERR(...) EINA_LOG_DOM_ERR(_evas_cserve2_usage_log_dom, __VA_ARGS__)
33 #define DBG(...) EINA_LOG_DOM_DBG(_evas_cserve2_usage_log_dom, __VA_ARGS__)
37 #define WRN(...) EINA_LOG_DOM_WARN(_evas_cserve2_usage_log_dom, __VA_ARGS__)
41 #define INF(...) EINA_LOG_DOM_INFO(_evas_cserve2_usage_log_dom, __VA_ARGS__)
44 _socket_path_set(char *path)
47 char buf[UNIX_PATH_MAX];
49 env = getenv("EVAS_CSERVE2_SOCKET");
52 strncpy(path, env, UNIX_PATH_MAX - 1);
56 snprintf(buf, sizeof(buf), "/tmp/.evas-cserve2-%x.socket", (int)getuid());
57 /* FIXME: check we can actually create this socket */
65 struct sockaddr_un remote;
67 if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
73 remote.sun_family = AF_UNIX;
74 _socket_path_set(remote.sun_path);
75 len = strlen(remote.sun_path) + sizeof(remote.sun_family);
76 if (connect(s, (struct sockaddr *)&remote, len) == -1)
82 fcntl(s, F_SETFL, O_NONBLOCK);
86 DBG("connected to cserve2 server.");
91 _server_disconnect(void)
98 _server_send(const void *data, int size)
102 const char *msg = data;
106 ret = send(socketfd, msg + sent, size - sent, MSG_NOSIGNAL);
109 if ((errno == EAGAIN) || (errno == EINTR))
119 static int sr_size = 0;
120 static int sr_got = 0;
121 static char *sr_buf = NULL;
124 _server_read(int *size)
132 n = recv(socketfd, &sr_size, sizeof(sr_size), 0);
136 sr_buf = malloc(sr_size);
139 n = recv(socketfd, sr_buf + sr_got, sr_size - sr_got, 0);
144 if (sr_got < sr_size)
157 _usage_msg_send(void)
162 memset(&msg, 0, sizeof(msg));
163 msg.type = CSERVE2_STATS;
164 msg.rid = _rid_count++;
168 if (!_server_send(&size, sizeof(size)))
170 ERR("Could not send usage msg size to server.");
173 if (!_server_send(&msg, size))
175 ERR("Could not send usage msg body to server.");
181 _usage_msg_read(void)
183 Msg_Stats *msg = NULL;
186 printf("Requesting server statistics.\n\n");
188 msg = _server_read(&size);
190 if (msg->base.type != CSERVE2_STATS)
192 ERR("Invalid message received from server."
193 "Something went badly wrong.");
197 printf("Printing server usage.\n");
198 printf("======================\n\n");
199 printf("\nImage Usage Statistics:\n");
200 printf("----------------------\n\n");
201 printf("Image headers usage: %d bytes\n", msg->images.files_size);
202 printf("Image data requested: %d kbytes\n", msg->images.requested_size / 1024);
203 printf("Image data usage: %d kbytes\n", msg->images.images_size / 1024);
204 printf("Image data unused: %d kbytes\n", msg->images.unused_size / 1024);
205 printf("Image headers load time: %dus\n", msg->images.files_load_time);
206 printf("Image headers saved time: %dus\n", msg->images.files_saved_time);
207 printf("Image data load time: %dus\n", msg->images.images_load_time);
208 printf("Image data saved time: %dus\n", msg->images.images_saved_time);
209 printf("\nFont Usage Statistics:\n");
210 printf("----------------------\n\n");
211 printf("Requested usage: %d bytes\n", msg->fonts.requested_size);
212 printf("Real usage: %d bytes\n", msg->fonts.real_size);
213 printf("Unused size: %d bytes\n", msg->fonts.unused_size);
214 printf("Fonts load time: %dus\n", msg->fonts.fonts_load_time);
215 printf("Fonts used load time: %dus\n", msg->fonts.fonts_used_load_time);
216 printf("Fonts used saved time: %dus\n", msg->fonts.fonts_used_saved_time);
217 printf("Glyphs load time: %dus\n", msg->fonts.glyphs_load_time);
227 _evas_cserve2_usage_log_dom = eina_log_domain_register
228 ("evas_cserve2_usage", EINA_COLOR_BLUE);
230 if (!_server_connect())
232 ERR("Could not connect to server.");
240 _server_disconnect();