summaryrefslogtreecommitdiff
path: root/ACE/apps/JAWS3/bench
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/apps/JAWS3/bench')
-rw-r--r--ACE/apps/JAWS3/bench/average.cpp24
-rw-r--r--ACE/apps/JAWS3/bench/mkfiles.cpp156
-rw-r--r--ACE/apps/JAWS3/bench/rqfiles.cpp261
3 files changed, 441 insertions, 0 deletions
diff --git a/ACE/apps/JAWS3/bench/average.cpp b/ACE/apps/JAWS3/bench/average.cpp
new file mode 100644
index 00000000000..5a8a68594b7
--- /dev/null
+++ b/ACE/apps/JAWS3/bench/average.cpp
@@ -0,0 +1,24 @@
+// $Id$
+#include "ace/OS.h"
+
+int
+main (void)
+{
+ double sum = 0;
+ double count = 0;
+ int input;
+ char buf[BUFSIZ];
+
+ while (::fgets (buf, sizeof (buf), stdin) != 0)
+ {
+ input = ACE_OS::atoi (buf);
+ sum += input;
+ count++;
+ }
+
+ ACE_OS::printf ("sum of input is: %f\n", sum);
+ ACE_OS::printf ("number of inputs is: %f\n", count);
+ ACE_OS::printf ("average of input is: %f\n", sum / count);
+
+ return 0;
+}
diff --git a/ACE/apps/JAWS3/bench/mkfiles.cpp b/ACE/apps/JAWS3/bench/mkfiles.cpp
new file mode 100644
index 00000000000..42bc2c969fa
--- /dev/null
+++ b/ACE/apps/JAWS3/bench/mkfiles.cpp
@@ -0,0 +1,156 @@
+// $Id$
+
+#include "ace/OS.h"
+#include "ace/Get_Opt.h"
+//FUZZ: disable check_for_math_include/
+#include <math.h>
+
+static float gammln (float xx);
+static float poidev (float xm);
+
+int main (int argc, char *argv[])
+{
+ ACE_Get_Opt options (argc, argv, "m:s:x:n:");
+ // m -- median file size in kB
+ // x -- maximum file size in kB
+ // n -- number of files
+
+ long median = 8;
+ long maximum = 1024;
+ long number = 1000;
+
+ int c;
+ while ((c = options ()) != -1)
+ {
+ switch (c)
+ {
+ case 'm':
+ median = ACE_OS::atoi (options.optarg);
+ break;
+ case 'x':
+ maximum = ACE_OS::atoi (options.optarg);
+ break;
+ case 'n':
+ number = ACE_OS::atoi (options.optarg);
+ break;
+ default:
+ break;
+ }
+ }
+
+ char filename[1024];
+ const char *seventyfive_bytes = "\
+01010101010101010101010101010101010101010101010101010101010101010101010101\n\
+";
+
+ int seen_max = 0;
+
+ long i;
+ for (i = 0; i < number; i++)
+ {
+ long size = 0;
+ float p = ::floor (::pow (2, poidev (::log (2 * median)/::log (2)) - 1));
+ if (p > maximum)
+ p = maximum;
+ p *= 1024;
+ if (p < 1.0)
+ p = 1.0;
+ size = (long) p;
+ if (i == (number - 1))
+ if (! seen_max)
+ size = maximum * 1024;
+ else
+ seen_max = (size == (maximum * 1024));
+
+ ::sprintf (filename, "file%011ld.html", i);
+ FILE *fp = ::fopen (filename, "w+b");
+ while (size > 75)
+ {
+ fprintf (fp, "%s", seventyfive_bytes);
+ size -= 75;
+ }
+ if (size > 15)
+ {
+ fprintf (fp, "%0*.0f\n", (int) (size - 1), p);
+ }
+ else
+ {
+ fprintf (fp, "%015.0f\n", p + 16 - size);
+ }
+ fclose (fp);
+ }
+
+ return 0;
+}
+
+static float
+gammln (float xx)
+{
+ double x, y, tmp, ser;
+ static const double cof[6] = { 76.18009172947146,
+ -86.50532032941677,
+ 24.01409824083091,
+ -1.231739572450155,
+ 0.1208650973866179e-2,
+ -0.5395239384953e-5 };
+ int j;
+
+ y = x = xx;
+ tmp = x + 5.5;
+ tmp -= (x+0.5) * ::log (tmp);
+
+ ser = 1.000000000190015;
+ for (j = 0; j < 6; j++)
+ ser += cof[j]/++y;
+
+ return -tmp + ::log (2.5066282746310005 * ser / x);
+}
+
+static float
+poidev (float xm)
+{
+ static const double PI = 3.141592654;
+ static float sq, alxm, g, oldm = -1.0;
+ float em, t, y, fem;
+
+ if (xm < 2.0)
+ {
+ if (xm != oldm)
+ {
+ oldm = xm;
+ g = ::exp (-xm);
+ }
+ em = -1.0;
+ t = 1.0;
+ do
+ {
+ ++em;
+ t *= (1.0 + ::rand ())/RAND_MAX;
+ }
+ while (t > g);
+ }
+ else
+ {
+ if (xm != oldm)
+ {
+ oldm = xm;
+ sq = ::sqrt (2.0 + xm);
+ alxm = log (xm);
+ g = xm * alxm - gammln (xm + 1.0);
+ }
+ do
+ {
+ do
+ {
+ y = ::tan (PI * (1.0 + ::rand ())/RAND_MAX);
+ em = sq * y + xm;
+ }
+ while (em < 0.0);
+ fem = ::floor (em);
+ t = 0.9 * (1.0 + y * y) * ::exp (fem * alxm - gammln (fem + 1.0) - g);
+ }
+ while ((1.0 + ::rand ())/RAND_MAX > t);
+ }
+
+ return em;
+}
diff --git a/ACE/apps/JAWS3/bench/rqfiles.cpp b/ACE/apps/JAWS3/bench/rqfiles.cpp
new file mode 100644
index 00000000000..49e6bf726d0
--- /dev/null
+++ b/ACE/apps/JAWS3/bench/rqfiles.cpp
@@ -0,0 +1,261 @@
+// $Id$
+
+#include "ace/OS.h"
+#include "ace/Get_Opt.h"
+#include "ace/Svc_Handler.h"
+#include "ace/Reactor.h"
+#include "ace/Select_Reactor.h"
+#include "ace/Connector.h"
+#include "ace/SOCK_Connector.h"
+
+//FUZZ: disable check_for_math_include/
+#include <math.h>
+
+static char **requests;
+static int number_of_urls;
+static int number_of_outstanding_requests;
+
+class HTTP_Sink_Svc_Handler
+ : public ACE_Svc_Handler <ACE_SOCK_STREAM, ACE_NULL_SYNCH>
+{
+public:
+
+ int open (void *)
+ {
+ ACE_Reactor::instance ()
+ ->register_handler (this, ACE_Event_Handler::WRITE_MASK);
+ return 0;
+ }
+
+ int handle_input (ACE_HANDLE handle)
+ {
+ char buf[8 * 1024];
+ int result = this->peer ().recv (buf, sizeof (buf));
+ if (result <= 0)
+ {
+ ACE_Reactor::instance ()
+ ->cancel_wakeup (handle, ACE_Event_Handler::READ_MASK);
+
+ if (--number_of_outstanding_requests == 0)
+ ACE_Reactor::instance ()->end_event_loop ();
+
+ return -1;
+ }
+ return 0;
+ }
+
+ int handle_output (ACE_HANDLE handle)
+ {
+ int random_number;
+ random_number = (int) ((::rand () / (1.0 + RAND_MAX)) * number_of_urls);
+ const char *random_request = requests[random_number];
+ size_t random_request_length = ::strlen (random_request);
+ ssize_t result = 0;
+ result = this->peer ().send_n (random_request, random_request_length);
+ ACE_Reactor::instance ()
+ ->cancel_wakeup (handle, ACE_Event_Handler::WRITE_MASK);
+ if (result < 0)
+ return -1;
+ ACE_Reactor::instance ()
+ ->schedule_wakeup (handle, ACE_Event_Handler::READ_MASK);
+ return 0;
+ }
+
+};
+
+typedef ACE_Connector <HTTP_Sink_Svc_Handler, ACE_SOCK_CONNECTOR>
+ HTTP_Sink_Connector;
+
+
+class HTTP_Make_Request_Event_Handler
+ : public ACE_Event_Handler
+{
+public:
+
+ HTTP_Make_Request_Event_Handler (const ACE_Time_Value &request_rate,
+ int number_of_requests = -1,
+ const char *website = 0)
+ : number_of_requests_ (number_of_requests)
+ , addr_ (website ? website : "localhost:5432")
+ {
+ number_of_outstanding_requests = number_of_requests;
+ this->timer_id_
+ = ACE_Reactor::instance ()->schedule_timer (this, 0, 0, request_rate);
+ }
+
+ int handle_timeout (const ACE_Time_Value &, const void *)
+ {
+ if (this->number_of_requests_ > 0)
+ this->number_of_requests_--;
+
+ int tries = 0;
+ int result = 0;
+
+ do
+ {
+ HTTP_Sink_Svc_Handler *handler = 0;
+ result = this->connector_.connect (handler, this->addr_,
+ ACE_Synch_Options::asynch);
+ tries++;
+ }
+ while (result < 0 && tries < 100);
+
+ if (ACE_Reactor::instance ()->event_loop_done ())
+ this->number_of_requests_ = 0;
+
+ if (this->number_of_requests_ == 0 || result < 0)
+ ACE_Reactor::instance ()->cancel_timer (this->timer_id_);
+
+ if (result < 0)
+ {
+ ACE_Reactor::instance ()->end_event_loop ();
+ return -1;
+ }
+
+ return 0;
+ }
+
+ int handle_close (ACE_HANDLE, ACE_Reactor_Mask)
+ {
+ delete this;
+ return 0;
+ }
+
+private:
+
+ int number_of_requests_;
+ int number_of_outstanding_requests_;
+
+ HTTP_Sink_Connector connector_;
+ ACE_INET_Addr addr_;
+
+ long timer_id_;
+
+};
+
+class Signal_Handler
+ : public ACE_Event_Handler
+{
+public:
+
+ int handle_signal (int signo, siginfo_t *, ucontext_t *)
+ {
+ switch (signo)
+ {
+ case SIGINT:
+ ACE_Reactor::instance ()->end_event_loop ();
+ break;
+
+ default:
+ break;
+ }
+
+ return 0;
+ }
+
+};
+
+typedef ACE_Select_Reactor_Token_T<ACE_Noop_Token>
+ ACE_Select_Reactor_Noop_Token;
+typedef ACE_Select_Reactor_T<ACE_Select_Reactor_Noop_Token>
+ ACE_Select_NULL_LOCK_Reactor;
+
+int
+main (int argc, char *argv[])
+{
+ ACE_Select_NULL_LOCK_Reactor *select_reactor;
+ select_reactor = new ACE_Select_NULL_LOCK_Reactor;
+ ACE_Reactor::instance (new ACE_Reactor (select_reactor, 1), 1);
+
+ // Install signal handlers
+ Signal_Handler *signal_handler = new Signal_Handler;
+
+ ACE_Reactor::instance ()->register_handler (SIGINT, signal_handler);
+ ACE_OS::signal (SIGPIPE, SIG_IGN);
+
+ ACE_Get_Opt options (argc, argv, "f:r:n:w:");
+
+ // f -- file list
+ // r -- request rate in requests per second
+ // n -- number of requests to generate
+ // w -- website in form of hostname:port (e.g., www.yahoo.com:80)
+
+ char *filelist_name = 0;
+ double request_rate = 1.0;
+ char *website = 0;
+ int number_of_requests = 0;
+
+ int c;
+ while ((c = options ()) != -1)
+ {
+ switch (c)
+ {
+ case 'f':
+ filelist_name = options.optarg;
+ break;
+ case 'r':
+ request_rate = ::atof (options.optarg);
+ if (request_rate == 0.0)
+ request_rate = 1.0;
+ break;
+ case 'n':
+ number_of_requests = ACE_OS::atoi (options.optarg);
+ break;
+ case 'w':
+ website = options.optarg;
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (filelist_name == 0)
+ ::abort ();
+
+ double rq_interval_sec;
+ double rq_interval_usec;
+ rq_interval_usec = 1000000 * ::modf (1/request_rate, &rq_interval_sec);
+ ACE_Time_Value tv ((long) rq_interval_sec, (long) rq_interval_usec);
+
+ // Scan file for number of lines.
+
+ FILE *fp = ::fopen (filelist_name, "r+b");
+ while ((c = ::fgetc (fp)) != EOF)
+ {
+ if (c == '\n')
+ number_of_urls++;
+ }
+ ::fclose (fp);
+
+ requests = (char **) ::malloc (number_of_urls * sizeof (char *));
+
+ // Read in the file list and create requests
+
+ int i = 0;
+ static char buf[BUFSIZ];
+ fp = ::fopen (filelist_name, "r+b");
+ while (::fgets (buf, sizeof (buf), fp) != NULL)
+ {
+ static char rq[BUFSIZ];
+ sprintf (rq, "GET /%s\r\n", buf);
+ requests[i++] = ::strdup (rq);
+ }
+ ::fclose (fp);
+
+ // Create a series of requests
+
+ HTTP_Make_Request_Event_Handler *eh;
+ eh = new HTTP_Make_Request_Event_Handler (tv, number_of_requests, website);
+
+ while (! ACE_Reactor::instance ()->event_loop_done ())
+ ACE_Reactor::instance ()->handle_events ();
+
+ // Cleanup
+
+ for (i = 0; i < number_of_urls; i++)
+ ::free (requests[i]);
+ ::free (requests);
+
+ return 0;
+}
+