/* 
 * init.c
 *
 * x-kernel v3.3
 *
 * Copyright (c) 1993,1991,1990,1996  Arizona Board of Regents
 *
 * $Revision: 1.1 $
 * $Date: 1996/11/22 15:48:40 $
 */

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

#include "config.h"
#include "xk_thread.h"
#include "upi.h"
#include "xk_debug.h"
#include "rom.h"
#include "idmap.h"
#include "event_i.h"
#include "netmask.h"
#include "prottbl.h"
#include "platform.h"

int traceinit = 0;

int globalArgc;
char **globalArgv;
char *rom[ROM_MAX_LINES + 1][ROM_MAX_FIELDS + 1];  

int	traceinit;

static void*
init( void* argptr )
{
    xTrace0(init,TR_FULL_TRACE,"init: calling initRom");
    initRom();
    xTrace0(init,TR_FULL_TRACE,"init: calling map_init");
    map_init();
    xTrace0(init,TR_FULL_TRACE,"init: calling evInit");
    evInit(EVENT_INTERVAL);
    xTrace0(init,TR_FULL_TRACE,"init: calling netMaskInit");
    netMaskInit();
    xTrace0(init,TR_FULL_TRACE,"init: calling prottbl_init");
    prottbl_init();
    xTrace0(init,TR_FULL_TRACE,"init: calling upiInit");
    upiInit();
    xTrace0(init,TR_FULL_TRACE,"init: calling xMallocInit");
    xMallocInit();
    xTrace0(init,TR_FULL_TRACE,"init: calling build_pgraph_dev");
    build_pgraph_dev();
    xTrace0(init,TR_FULL_TRACE,"init: calling build_pgraph");
    build_pgraph();
    xTrace0(init,TR_FULL_TRACE,"init: returning");
    return NULL;    /* just to match init's type to threadInit's */
}

int
main( int argc, char *argv[] )
{
    setbuf(stdout, 0);

    /*
     * If the first argument is "-gdb", start a *very* long loop,
     * so we have time to attach gdb to this process. This is necessary
     * since at this point this is the only way to debug a process in
     * a compute node, since gdb is not able to follow a process
     * after nx_init.
     */

    if ( ( argc > 1 )&&( !strcmp(argv[1],"-gdb") ) )
    {
	int i, j, k, l, max=1000000;

	argv++; argc--;
	fprintf(stderr,"Looping to wait for gdb attachment. My pid is %ld\n",
	        getpid() );
	for (i=0;i<1000000;i+=1)
	    for (j=0;j<1000000;j+=1)
		for (k=0;k<1000000;k+=1)
		    l = (i+1)/(j+1)/(k+1);
    }

    globalArgc = argc;
    globalArgv = argv;

    xTraceInit();
    xTrace0(init,TR_FULL_TRACE,"init: calling threadInit");
    threadInit(init,NULL);	
    /* Should never return */
    return 0;
}
