Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • benchmark/io/http/main.cfa

    rd9c2284 r7f389a5c  
    1717#include "filecache.hfa"
    1818#include "options.hfa"
     19#include "parseargs.hfa"
    1920#include "worker.hfa"
    2021
     
    2223// Globals
    2324//=============================================================================================
     25Options options @= {
     26        0,
     27        42u,
     28        0,
     29        false,
     30        false,
     31        0
     32};
     33
    2434channel & wait_connect;
    2535
     
    2939
    3040void ?{}( ServerProc & this ) {
    31         /* paranoid */ assert( options.clopts.instance != 0p );
    32         (this.self){ "Benchmark Processor", *options.clopts.instance };
     41        /* paranoid */ assert( options.the_cluster != 0p );
     42        (this.self){ "Benchmark Processor", *options.the_cluster };
    3343
    3444        #if !defined(__CFA_NO_STATISTICS__)
    35                 if( options.clopts.procstats ) {
    36                         print_stats_at_exit( this.self, options.clopts.instance->print_stats );
     45                if( options.procstats ) {
     46                        print_stats_at_exit( this.self, options.the_cluster->print_stats );
    3747                }
    38                 if( options.clopts.viewhalts ) {
     48                if( options.viewhalts ) {
    3949                        print_halts( this.self );
    4050                }
     
    4656//============================================================================================='
    4757int main( int argc, char * argv[] ) {
     58        int port      = 8080;
     59        int backlog   = 10;
     60        int nprocs    = 1;
     61        int nworkers  = 1;
     62        int cl_flags  = 0;
     63        int chan_size = 10;
     64        const char * path = ".";
    4865        //===================
    4966        // Parse args
    50         const char * path = parse_options(argc, argv);
     67        static cfa_option opt[] = {
     68                {'p', "port", "Port the server will listen on", port},
     69                {'c', "cpus", "Number of processors to use", nprocs},
     70                {'t', "threads", "Number of worker threads to use", nworkers},
     71                {'b', "accept-backlog", "Maximum number of pending accepts", backlog},
     72                {'B', "channel-size", "Maximum number of accepted connection pending", chan_size}
     73        };
     74        int opt_cnt = sizeof(opt) / sizeof(cfa_option);
     75
     76        char **left;
     77      parse_args( argc, argv, opt, opt_cnt, "[OPTIONS] [PATH]  -- cforall http server", left );
     78
    5179
    5280        //===================
     
    5785        //===================
    5886        // Open Socket
    59         printf("Listening on port %d\n", options.socket.port);
     87        printf("Listening on port %d\n", port);
    6088        int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    6189        if(server_fd < 0) {
     
    6997        address.sin_family = AF_INET;
    7098        address.sin_addr.s_addr = htonl(INADDR_ANY);
    71         address.sin_port = htons( options.socket.port );
     99        address.sin_port = htons( port );
    72100
    73101        ret = bind( server_fd, (struct sockaddr *)&address, sizeof(address) );
     
    76104        }
    77105
    78         ret = listen( server_fd, options.socket.backlog );
     106        ret = listen( server_fd, backlog );
    79107        if(ret < 0) {
    80108                abort( "listen error: (%d) %s\n", (int)errno, strerror(errno) );
     
    84112        // Run Server Cluster
    85113        {
    86                 cluster cl = { "Server Cluster", options.clopts.flags };
     114                cluster cl = { "Server Cluster", cl_flags };
    87115                #if !defined(__CFA_NO_STATISTICS__)
    88116                        print_stats_at_exit( cl, CFA_STATS_READY_Q | CFA_STATS_IO );
    89117                #endif
    90                 options.clopts.instance = &cl;
     118                options.the_cluster = &cl;
    91119
    92                 channel chan = { options.clopts.chan_size };
     120                channel chan = { chan_size };
    93121                &wait_connect = &chan;
    94122
    95                 int pipe_cnt = options.clopts.nworkers * 2;
    96                 int pipe_off;
    97                 int * fds;
    98                 [fds, pipe_off] = filefds( pipe_cnt );
    99                 for(i; 0 ~ pipe_cnt ~ 2) {
    100                         int ret = pipe(&fds[pipe_off + i]);
    101                         if( ret < 0 ) { abort( "pipe error: (%d) %s\n", (int)errno, strerror(errno) ); }
    102                 }
    103 
    104123                {
    105                         ServerProc procs[options.clopts.nprocs];
     124                        ServerProc procs[nprocs];
    106125                        {
    107                                 Worker workers[options.clopts.nworkers];
    108                                 for(i; options.clopts.nworkers) {
    109                                         if( options.file_cache.fixed_fds ) {
    110                                                 workers[i].pipe[0] = pipe_off + (i * 2) + 0;
    111                                                 workers[i].pipe[1] = pipe_off + (i * 2) + 1;
    112                                         }
    113                                         else {
    114                                                 workers[i].pipe[0] = fds[pipe_off + (i * 2) + 0];
    115                                                 workers[i].pipe[1] = fds[pipe_off + (i * 2) + 1];
    116                                         }
    117                                         unpark( workers[i] __cfaabi_dbg_ctx2 );
    118                                 }
    119                                 printf("%d workers started on %d processors\n", options.clopts.nworkers, options.clopts.nprocs);
     126                                Worker workers[nworkers];
     127                                printf("%d workers started on %d processors\n", nworkers, nprocs);
    120128                                {
    121129                                        Acceptor acceptor = { server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen, 0 };
    122 
    123                                         char buffer[128];
    124                                         while(!feof(stdin)) {
    125                                                 fgets(buffer, 128, stdin);
    126                                         }
    127 
    128                                         printf("Shutting Down\n");
    129130                                }
    130                                 printf("Acceptor Closed\n");
     131                                printf("Shutting Down\n");
    131132
    132133                                // Clean-up the workers
    133                                 for(options.clopts.nworkers) {
     134                                for(nworkers) {
    134135                                        put( wait_connect, -1 );
    135136                                }
    136137                        }
    137                         printf("Workers Closed\n");
    138138                }
    139 
    140                 for(i; pipe_cnt) {
    141                         ret = close( fds[pipe_off + i] );
    142                         if(ret < 0) {
    143                                 abort( "close pipe error: (%d) %s\n", (int)errno, strerror(errno) );
    144                         }
    145                 }
    146                 free(fds);
    147139        }
    148140
Note: See TracChangeset for help on using the changeset viewer.