Annotation of embedaddon/strongswan/scripts/thread_analysis.c, revision 1.1
1.1 ! misho 1: /* Analyzes the concurrent use of charon's threads
! 2: *
! 3: * Copyright (C) 2008 Andreas Steffen
! 4: * HSR Hochschule fuer Technik Rapperswil
! 5: *
! 6: * This program is free software; you can redistribute it and/or modify it
! 7: * under the terms of the GNU General Public License as published by the
! 8: * Free Software Foundation; either version 2 of the License, or (at your
! 9: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 10: *
! 11: * This program is distributed in the hope that it will be useful, but
! 12: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 13: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 14: * for more details.
! 15: */
! 16:
! 17: #include <stdio.h>
! 18: #include <stdlib.h>
! 19: #include <string.h>
! 20:
! 21: #define LOGFILE "moon.daemon.log"
! 22: #define LINE_LEN 2048
! 23: #define THREADS 99
! 24:
! 25: typedef enum state_t state_t;
! 26:
! 27: enum state_t {
! 28: STATE_IDLE = 0,
! 29: STATE_INIT = 1,
! 30: STATE_AUTH = 2,
! 31: STATE_BUSY = 3,
! 32: STATE_RETRY = 4,
! 33: STATE_ERROR = 5
! 34: };
! 35:
! 36: typedef enum print_t print_t;
! 37:
! 38: enum print_t {
! 39: MODE_ANY = 0,
! 40: MODE_ADD = 1,
! 41: MODE_DEL = 2
! 42: };
! 43:
! 44: static char *state_names[] = { "idle", "init", "auth", "busy", "retry", "error" };
! 45:
! 46: static int readline(FILE *fd, char *line)
! 47: {
! 48: while (fread(line, 1, 1, fd))
! 49: {
! 50: if (*line == '\n')
! 51: {
! 52: *line = '\0';
! 53: return 1;
! 54: }
! 55: line++;
! 56: }
! 57: *line = '\0';
! 58: return 0;
! 59: }
! 60:
! 61: static void printline(state_t *state, char *timestamp)
! 62: {
! 63: int states[] = { 0, 0, 0, 0, 0};
! 64: int th, total ;
! 65:
! 66: printf(" <tr>\n");
! 67: printf(" <td class=\"log\">%.15s</td>", timestamp);
! 68:
! 69: for (th = 1; th <= THREADS; th++)
! 70: {
! 71: states[state[th]]++;
! 72: printf("<td class=\"%s\"></td>", state_names[state[th]]);
! 73: }
! 74: total = states[STATE_INIT] + states[STATE_AUTH] + states[STATE_BUSY] + states[STATE_RETRY];
! 75: printf("<td class=\"init\">%d</td><td class=\"auth\">%d</td><td class=\"busy\">%d</td>",
! 76: states[STATE_INIT], states[STATE_AUTH], total);
! 77: for (th = 10; th <= (THREADS + 2); th += 5)
! 78: {
! 79: printf("<td class=\"%s\"></td>", (th <= total + 2)? "busy":"idle");
! 80: }
! 81: printf("\n");
! 82: printf(" </tr>\n");
! 83: }
! 84:
! 85: int main(int argc, char *argv[])
! 86: {
! 87: char line[LINE_LEN];
! 88: int section = 0;
! 89: int mode = MODE_ANY;
! 90: int th;
! 91: FILE *fd;
! 92:
! 93: state_t state[THREADS + 1];
! 94:
! 95: /* threads 1..5 and 9 are always busy */
! 96: for (th = 1; th <= THREADS; th++)
! 97: {
! 98: state[th] = (th <= 7 && th != 3)? STATE_BUSY : STATE_IDLE;
! 99: }
! 100:
! 101: /* open the log file */
! 102: fd = fopen(LOGFILE, "r");
! 103: if (!fd)
! 104: {
! 105: printf("could not open log file '%s'\n", LOGFILE);
! 106: return 1;
! 107: }
! 108:
! 109: printf("<html>\n");
! 110: printf("<head>\n");
! 111: printf(" <title>Charon Thread Analysis</title>\n");
! 112: printf(" <style>\n");
! 113: printf(" body { font: 11px verdana,arial, helvetica, sans-serif }\n");
! 114: printf(" td { font: 10px verdana,arial, helvetica, sans-serif;\n");
! 115: printf(" text-align: center; padding: 0px 1px 0px 1px; background: #FFFF66 }\n");
! 116: printf(" td.log { text-align: left; background: #FFFF66; white-space: nowrap }\n");
! 117: printf(" td.idle { background: #FFFF66 }\n");
! 118: printf(" td.init { background: #FFA522 }\n");
! 119: printf(" td.auth { background: #90EE90 }\n");
! 120: printf(" td.busy { background: #ADD8E6 }\n");
! 121: printf(" td.retry { background: #7B68EE }\n");
! 122: printf(" td.error { background: #FF6347 }\n");
! 123: printf(" hr { background-color: #000000; border: 0; height: 1px; }\n");
! 124: printf(" a:visited { color: #000000 }\n");
! 125: printf(" a:link { color: #000000 }\n");
! 126: printf(" a:hover { color: #0000FF }\n");
! 127: printf(" </style>\n");
! 128: printf("</head>\n");
! 129: printf("<body>\n");
! 130: printf(" <h1>Charon Thread Analysis</h1>\n");
! 131: printf(" <table>\n");
! 132:
! 133: /* print table header */
! 134: printf(" <tr>\n");
! 135: printf(" <td class=\"log\">Timestamp</td>");
! 136: for (th = 1 ; th <= THREADS; th++)
! 137: {
! 138: printf("<td>%02d</td>", th);
! 139: }
! 140: printf("<td class=\"init\">I</td><td class=\"auth\">A</td><td class=\"busy\">B</td>");
! 141: for (th = 10; th <= (THREADS + 2); th += 5)
! 142: {
! 143: printf("<td class=\"busy\">%d</td>", (th == 100)? 99:th);
! 144: }
! 145: printf("\n");
! 146: printf(" </tr>\n");
! 147:
! 148: while (readline(fd, line))
! 149: {
! 150: char *p_section, *p_charon, *p_thread, *p_log;
! 151:
! 152: p_section = strstr(line, "---");
! 153: if (p_section)
! 154: {
! 155: printline(state, line);
! 156: mode = MODE_ANY;
! 157:
! 158: if (section++ < 1)
! 159: {
! 160: continue;
! 161: }
! 162: else
! 163: {
! 164: break;
! 165: }
! 166: }
! 167:
! 168: p_charon = strstr(line, "charon");
! 169: if (!p_charon)
! 170: {
! 171: continue;
! 172: }
! 173:
! 174: /* determine thread */
! 175: p_thread = p_charon + 8;
! 176: th = atol(p_thread);
! 177:
! 178: /* determine log message */
! 179: p_log = p_charon + 16;
! 180: if (strstr(p_log, "received packet"))
! 181: {
! 182: if (mode == MODE_DEL)
! 183: {
! 184: printline(state, line);
! 185: }
! 186: mode = MODE_ADD;
! 187: if (state[th] != STATE_IDLE)
! 188: {
! 189: state[th] = STATE_ERROR;
! 190: }
! 191: else
! 192: {
! 193: state[th] = STATE_BUSY;
! 194: }
! 195: }
! 196: if (strstr(p_log, "sending packet"))
! 197: {
! 198: if (mode == MODE_ADD)
! 199: {
! 200: printline(state, line);
! 201: }
! 202: mode = MODE_DEL;
! 203: if (state[th] == STATE_IDLE)
! 204: {
! 205: state[th] = STATE_ERROR;
! 206: }
! 207: else
! 208: {
! 209: state[th] = STATE_IDLE;
! 210: }
! 211: }
! 212: if (strstr(p_log, "parsed IKE_SA_INIT request"))
! 213: {
! 214: if (state[th] != STATE_BUSY)
! 215: {
! 216: state[th] = STATE_ERROR;
! 217: }
! 218: else
! 219: {
! 220: state[th] = STATE_INIT;
! 221: }
! 222: }
! 223: if (strstr(p_log, "parsed IKE_AUTH request"))
! 224: {
! 225: if (state[th] != STATE_BUSY)
! 226: {
! 227: state[th] = STATE_ERROR;
! 228: }
! 229: else
! 230: {
! 231: state[th] = STATE_AUTH;
! 232: }
! 233: }
! 234: if (strstr(p_log, "already processing"))
! 235: {
! 236: if (state[th] != STATE_IDLE)
! 237: {
! 238: state[th] = STATE_ERROR;
! 239: }
! 240: else
! 241: {
! 242: state[th] = STATE_RETRY;
! 243: }
! 244: printline(state, line);
! 245: mode = MODE_ANY;
! 246: state[th] = STATE_IDLE;
! 247: }
! 248: }
! 249: printf(" </table>\n");
! 250: printf(" <p>\n");
! 251: printf(" <table>\n");
! 252: printf(" <tr>\n");
! 253: printf(" <td class=\"init\"> I </td><td>IKE_SA_INIT Thread </td>\n");
! 254: printf(" <td class=\"auth\"> A </td><td>IKE_AUTH Thread </td>\n");
! 255: printf(" <td class=\"retry\"> R </td><td>Retransmit Thread </td>\n");
! 256: printf(" <td class=\"busy\"> B </td><td>Busy Thread </td>\n");
! 257: printf(" <td class=\"error\"> E </td><td>State Error </td>\n");
! 258: printf(" </tr>\n");
! 259: printf(" </table>\n");
! 260: printf(" <p>\n");
! 261: printf(" <hr/>\n");
! 262: printf(" <em>© 2008\n");
! 263: printf(" <a href=\"http://www.hsr.ch/?&L=1\" target=\"popup\">\n");
! 264: printf(" HSR Hochschule für Technik Rapperswil</a>\n");
! 265: printf(" </em>\n");
! 266: printf("</body>\n");
! 267: printf("</html>\n");
! 268:
! 269: fclose(fd);
! 270: return 0;
! 271: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>