Mailing List Archive

NASL2 optimization
For those who want to optimize their plugins or even NASL2, here is a
quick and dirty patch




--- libnasl/nasl/exec.c 13 Feb 2003 20:00:46 -0000 1.36
+++ libnasl/nasl/exec.c 16 Feb 2003 20:22:17 -0000
@@ -30,6 +30,10 @@
#include <includes.h>
#include <regex.h>

+#include <sys/time.h>
+#include <sys/resource.h>
+#include <unistd.h>
+
#include "nasl_tree.h"
#include "nasl_global_ctxt.h"
#include "nasl_func.h"
@@ -1635,6 +1639,40 @@
nasl_clean_ctx(&ctx);
free_lex_ctxt(lexic);
chdir(old_dir);
+#if NASL_RUSAGE > 0
+ {
+ struct rusage ru;
+ int i;
+ char *p, *name1;
+
+ name1 = name;
+ for (p = name; *p != '\0'; p ++)
+ if (*p == '/')
+ name1 = p + 1;
+
+ if (getrusage(RUSAGE_SELF, &ru) >= 0)
+ fprintf(stderr, "%s: pid %d rusage: utime=%d.%02d stime=%d.%02d minflt=%d majflt=%d\n",
+ name1, getpid(),
+ ru.ru_utime.tv_sec, ru.ru_utime.tv_usec / 10000,
+ ru.ru_stime.tv_sec, ru.ru_stime.tv_usec / 10000,
+ ru.ru_minflt, ru.ru_majflt );
+ if (getrusage(RUSAGE_CHILDREN, &ru) >= 0)
+ {
+ for (i = 0, p = &ru; i < sizeof(ru) && p[i] == 0; i ++)
+ ;
+ if (i < sizeof(ru))
+ fprintf(stderr, "%s: children of %d rusage: utime=%d.%02d stime=%d.%02d minflt=%d majflt=%d \n",
+ name1, getpid(),
+ ru.ru_utime.tv_sec, ru.ru_utime.tv_usec / 10000,
+ ru.ru_stime.tv_sec, ru.ru_stime.tv_usec / 10000,
+ ru.ru_minflt, ru.ru_majflt );
+ }
+ }
+#endif
+#if NASL_RUSAGE > 1
+ dump_func_stat();
+#endif
+
return err;
}

--- libnasl/nasl/nasl_func.c 2 Feb 2003 13:41:21 -0000 1.10
+++ libnasl/nasl/nasl_func.c 16 Feb 2003 20:22:17 -0000
@@ -75,6 +75,79 @@
return NULL;
}

+#if NASL_RUSAGE > 1
+typedef struct {
+ struct rusage ru;
+ char *name;
+} func_rusage_t;
+
+static func_rusage_t *fru = NULL;
+static int fru_n = 0;
+
+static void
+add_func_stat(const char* name, struct rusage* pru1, struct rusage* pru2)
+{
+ int i;
+
+ for (i = 0; i < fru_n; i ++)
+ if (strcmp(name, fru[i].name) == 0)
+ break;
+ if (i == fru_n)
+ {
+ fru_n ++;
+ fru = erealloc(fru, sizeof(*fru) * fru_n);
+ memset(fru + i, 0, sizeof(*fru));
+ fru[i].name = estrdup(name);
+ }
+ fru[i].ru.ru_utime.tv_sec += pru2->ru_utime.tv_sec - pru1->ru_utime.tv_sec - 1;
+ fru[i].ru.ru_utime.tv_usec += pru2->ru_utime.tv_usec - pru1->ru_utime.tv_usec + 1000000;
+
+ while (fru[i].ru.ru_utime.tv_usec >= 1000000)
+ {
+ fru[i].ru.ru_utime.tv_sec ++;
+ fru[i].ru.ru_utime.tv_usec -= 1000000;
+ }
+
+ fru[i].ru.ru_stime.tv_sec += pru2->ru_stime.tv_sec - pru1->ru_stime.tv_sec - 1;
+ fru[i].ru.ru_stime.tv_usec += pru2->ru_stime.tv_usec - pru1->ru_stime.tv_usec + 1000000;
+ while (fru[i].ru.ru_stime.tv_usec >= 1000000)
+ {
+ fru[i].ru.ru_stime.tv_sec ++;
+ fru[i].ru.ru_stime.tv_usec -= 1000000;
+ }
+
+ fru[i].ru.ru_minflt += pru2->ru_minflt - pru1->ru_minflt;
+ fru[i].ru.ru_majflt += pru2->ru_majflt - pru1->ru_majflt;
+}
+
+static int
+cmp_func_stat(func_rusage_t* f1, func_rusage_t* f2)
+{
+ return (f1->ru.ru_utime.tv_sec - f2->ru.ru_utime.tv_sec) * 1000 +
+ (f1->ru.ru_utime.tv_usec - f2->ru.ru_utime.tv_usec) / 1000;
+}
+
+void
+dump_func_stat()
+{
+ int i;
+
+ qsort(fru, fru_n, sizeof(*fru), cmp_func_stat);
+
+ for (i = 0; i < fru_n; i ++)
+ {
+ struct rusage *pr = fru + i;
+
+ fprintf(stderr, "Function %s rusage: utime=%d.%02d stime=%d.%02d minflt=%d majflt=%d\n",
+ fru[i].name,
+ pr->ru_utime.tv_sec, pr->ru_utime.tv_usec / 10000,
+ pr->ru_stime.tv_sec, pr->ru_stime.tv_usec / 10000,
+ pr->ru_minflt, pr->ru_majflt );
+ }
+}
+
+#endif
+
nasl_func*
insert_nasl_func(lex_ctxt* lexic, const char* fname, tree_cell* decl_node)
{
@@ -164,6 +237,10 @@
char *trace_buf = NULL;
int trace_buf_len = 0, tn;
#define TRACE_BUF_SZ 255
+#if NASL_RUSAGE > 1
+ struct rusage ru1, ru2;
+ int good_ru = 0;
+#endif

#if 0
nasl_dump_tree(arg_list);
@@ -272,6 +349,10 @@

/* 4. Chain new context to old (lexic) */
lexic2->up_ctxt = lexic;
+#if NASL_RUSAGE > 1
+ if (getrusage(RUSAGE_SELF, &ru1) >= 0)
+ good_ru = 1;
+#endif
/* 5. Execute */
if (f->flags & FUNC_FLAG_INTERNAL)
{
@@ -296,6 +377,10 @@
ref_cell(retc);
}

+#if NASL_RUSAGE > 1
+ if (good_ru && getrusage(RUSAGE_SELF, &ru2) >= 0)
+ add_func_stat(f->func_name, &ru1, &ru2);
+#endif
nasl_trace(lexic, "NASL> Return %s: %s\n", f->func_name,
dump_cell_val(retc));
#if 1