NASL2 optimization

Michel Arboi <[email protected]>
Newsgroups gmane.comp.security.nessus.devel
Message-ID <1045448570.1016.58.camel@rotissoire>
For those who want to optimize their plugins or even NASL2, here is a
quick and dirty patch
p3 (text/plain, 4.3 KB)
--- 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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.