Esempio n. 1
0
void ztrap_new_init(void)
{
	mstr		val;

	val.addr = ZTRAP_NEW;
	val.len = sizeof(ZTRAP_NEW) - 1;
	ztrap_new = logical_truth_value(&val, FALSE, NULL);
}
Esempio n. 2
0
void	gtm_env_init(void)
{
    mstr			val, trans;
    boolean_t		ret, is_defined;
    uint4			tdbglvl, tmsock, reservesize, memsize, cachent, trctblsize, trctblbytes;
    int4			status;
    char			buf[MAX_TRANS_NAME_LEN];
    DCL_THREADGBL_ACCESS;

    SETUP_THREADGBL_ACCESS;
    if (!TREF(gtm_env_init_done))
    {
        /* See if a debug level has been specified. Do this first since gtmDebugLevel needs
         * to be initialized before any mallocs are done in the system.
         */
        gtmDebugLevel = INITIAL_DEBUG_LEVEL;
        val.addr = GTM_DEBUG_LEVEL_ENVLOG;
        val.len = SIZEOF(GTM_DEBUG_LEVEL_ENVLOG) - 1;
        if (tdbglvl = trans_numeric(&val, &is_defined, TRUE)) /* Note assignment!! */
        {   /* Some kind of debugging was asked for.. */
            tdbglvl |= GDL_Simple;			/* Make sure simple debugging turned on if any is */
            if ((GDL_SmChkFreeBackfill | GDL_SmChkAllocBackfill) & tdbglvl)
                tdbglvl |= GDL_SmBackfill;	/* Can't check it unless it's filled in */
            if (GDL_SmStorHog & tdbglvl)
                tdbglvl |= GDL_SmBackfill | GDL_SmChkAllocBackfill;
            gtmDebugLevel |= tdbglvl;
        }
        /* gtm_boolean environment/logical */
        val.addr = GTM_BOOLEAN;
        val.len = SIZEOF(GTM_BOOLEAN) - 1;
        TREF(gtm_fullbool) = trans_numeric(&val, &is_defined, TRUE);
        /* NOUNDEF environment/logical */
        val.addr = GTM_NOUNDEF;
        val.len = SIZEOF(GTM_NOUNDEF) - 1;
        assert(FALSE == undef_inhibit);	/* should have been set to FALSE at global variable definition time */
        ret = logical_truth_value(&val, FALSE, &is_defined);
        if (is_defined)
            undef_inhibit = ret; /* if the logical is not defined, we want undef_inhibit to take its default value */
        /* gtm_trace_gbl_name environment; it controls implicit MPROF testing */
        val.addr = GTM_MPROF_TESTING;
        val.len = SIZEOF(GTM_MPROF_TESTING) - 1;
        if (SS_NORMAL == (status = TRANS_LOG_NAME(&val, &trans, buf, SIZEOF(buf), do_sendmsg_on_log2long)))
        {   /* Note assignment above */
            if (SIZEOF(buf) >= trans.len)
            {
                if (('0' == (char)(*trans.addr)) || (0 == trans.len))
                {
                    (TREF(mprof_env_gbl_name)).str.len = 0;
                    /* this malloc is just so that mprof_env_gbl_name.str.addr is not NULL for subsequent
                     * checks in gtm_startup.c and gtm$startup.c
                     */
                    (TREF(mprof_env_gbl_name)).str.addr = malloc(1);
                } else
                {
                    (TREF(mprof_env_gbl_name)).str.len = trans.len;
                    (TREF(mprof_env_gbl_name)).str.addr = malloc(trans.len);
                    memcpy((TREF(mprof_env_gbl_name)).str.addr, trans.addr, trans.len);
                }
                (TREF(mprof_env_gbl_name)).mvtype = MV_STR;
            }
        } else
            (TREF(mprof_env_gbl_name)).str.addr = NULL;
#		ifdef DEBUG
        /* GTM_GVUNDEF_FATAL environment/logical */
        val.addr = GTM_GVUNDEF_FATAL;
        val.len = SIZEOF(GTM_GVUNDEF_FATAL) - 1;
        assert(FALSE == TREF(gtm_gvundef_fatal));	/* should have been set to FALSE by gtm_threadgbl_defs */
        ret = logical_truth_value(&val, FALSE, &is_defined);
        if (is_defined)
            TREF(gtm_gvundef_fatal) = ret; /* if logical is not defined, gtm_gvundef_fatal takes the default value */
#		endif
        /* Initialize variable that controls TP allocation clue (for created blocks) */
        val.addr = GTM_TP_ALLOCATION_CLUE;
        val.len = SIZEOF(GTM_TP_ALLOCATION_CLUE) - 1;
        gtm_tp_allocation_clue = (block_id)trans_numeric(&val, &is_defined, TRUE);
        if (!is_defined)
            gtm_tp_allocation_clue = (block_id)MAXTOTALBLKS_MAX;
        /* Full Database-block Write mode */
        val.addr = GTM_FULLBLOCKWRITES;
        val.len = SIZEOF(GTM_FULLBLOCKWRITES) - 1;
        gtm_fullblockwrites = logical_truth_value(&val, FALSE, &is_defined);
        if (!is_defined)
            gtm_fullblockwrites = DEFAULT_FBW_FLAG;
        /* GDS Block certification */
        val.addr = GTM_GDSCERT;
        val.len = SIZEOF(GTM_GDSCERT) - 1;
        ret = logical_truth_value(&val, FALSE, &is_defined);
        if (is_defined)
            certify_all_blocks = ret; /* if the logical is not defined, we want to take default value */
        /* Initialize null subscript's collation order */
        val.addr = LCT_STDNULL;
        val.len = SIZEOF(LCT_STDNULL) - 1;
        ret = logical_truth_value(&val, FALSE, &is_defined);
        if (is_defined)
            TREF(local_collseq_stdnull) = ret;
        /* Initialize eXclusive Kill variety (GTM vs M Standard) */
        val.addr = GTM_STDXKILL;
        val.len = SIZEOF(GTM_STDXKILL) - 1;
        ret = logical_truth_value(&val, FALSE, &is_defined);
        if (is_defined)
            gtm_stdxkill = ret;
        /* Initialize variables for white box testing. Even though these white-box test variables only control the
         * flow of the DBG builds, the PRO builds check on these variables (for example, in tp_restart.c to decide
         * whether to fork_n_core or not) so need to do this initialization for PRO builds as well.
         */
        wbox_test_init();
        /* Initialize variable that controls dynamic GT.M block upgrade */
        val.addr = GTM_BLKUPGRADE_FLAG;
        val.len = SIZEOF(GTM_BLKUPGRADE_FLAG) - 1;
        gtm_blkupgrade_flag = trans_numeric(&val, &is_defined, TRUE);
        /* Initialize whether database file extensions need to be logged in the operator log */
        val.addr = GTM_DBFILEXT_SYSLOG_DISABLE;
        val.len = SIZEOF(GTM_DBFILEXT_SYSLOG_DISABLE) - 1;
        ret = logical_truth_value(&val, FALSE, &is_defined);
        if (is_defined)
            gtm_dbfilext_syslog_disable = ret; /* if the logical is not defined, we want to take default value */
        /* Initialize maximum sockets in a single socket device createable by this process */
        gtm_max_sockets = MAX_N_SOCKET;
        val.addr = GTM_MAX_SOCKETS;
        val.len = SIZEOF(GTM_MAX_SOCKETS) - 1;
        if ((tmsock = trans_numeric(&val, &is_defined, TRUE)) && MAX_MAX_N_SOCKET > tmsock) /* Note assignment!! */
            gtm_max_sockets = tmsock;
        /* Initialize storage to allocate and keep in our back pocket in case run out of memory */
        outOfMemoryMitigateSize = GTM_MEMORY_RESERVE_DEFAULT;
        val.addr = GTM_MEMORY_RESERVE;
        val.len = SIZEOF(GTM_MEMORY_RESERVE) - 1;
        if (reservesize = trans_numeric(&val, &is_defined, TRUE)) /* Note assignment!! */
            outOfMemoryMitigateSize = reservesize;
        /* Initialize indirect cache limits (max memory, max entries) */
        max_cache_memsize = MAX_CACHE_MEMSIZE * 1024;
        val.addr = GTM_MAX_INDRCACHE_MEMORY;
        val.len = SIZEOF(GTM_MAX_INDRCACHE_MEMORY) - 1;
        if (memsize = trans_numeric(&val, &is_defined, TRUE)) /* Note assignment!! */
            max_cache_memsize = memsize * 1024;
        max_cache_entries = MAX_CACHE_ENTRIES;
        val.addr = GTM_MAX_INDRCACHE_COUNT;
        val.len = SIZEOF(GTM_MAX_INDRCACHE_COUNT) - 1;
        if (cachent = trans_numeric(&val, &is_defined, TRUE)) /* Note assignment!! */
            max_cache_entries = cachent;
        /* Initialize ZQUIT to control funky QUIT compilation */
        val.addr = GTM_ZQUIT_ANYWAY;
        val.len = SIZEOF(GTM_ZQUIT_ANYWAY) - 1;
        ret = logical_truth_value(&val, FALSE, &is_defined);
        if (is_defined)
            dollar_zquit_anyway = ret;
        /* Initialize ZPROMPT to desired GTM prompt or default */
        val.addr = GTM_PROMPT;
        val.len = SIZEOF(GTM_PROMPT) - 1;
        if (SS_NORMAL == (status = TRANS_LOG_NAME(&val, &trans, buf, SIZEOF(buf), do_sendmsg_on_log2long)))
        {   /* Non-standard prompt requested */
            assert(SIZEOF(buf) > trans.len);
            if (SIZEOF_prombuf >= trans.len)
            {
                (TREF(gtmprompt)).len = trans.len;
                memcpy((TREF(gtmprompt)).addr, trans.addr, trans.len);
            }
        }
        /* Initialize tpnotacidtime */
        TREF(tpnotacidtime) = TPNOTACID_DEFAULT_TIME;
        val.addr = GTM_TPNOTACIDTIME;
        val.len = SIZEOF(GTM_TPNOTACIDTIME) - 1;
        if ((status = trans_numeric(&val, &is_defined, TRUE)) && (0 <= status)
                && (TPNOTACID_MAX_TIME >= status) && is_defined)
            TREF(tpnotacidtime) = status;	 /* NOTE assignment above */
        /* Initialize $gtm_tprestart_log_first */
        val.addr = GTM_TPRESTART_LOG_LIMIT;
        val.len = STR_LIT_LEN(GTM_TPRESTART_LOG_LIMIT);
        TREF(tprestart_syslog_limit) = trans_numeric(&val, &is_defined, TRUE);
        if (0 > TREF(tprestart_syslog_limit))
            TREF(tprestart_syslog_limit) = 0;
        /* Initialize $gtm_tprestart_log_delta */
        val.addr = GTM_TPRESTART_LOG_DELTA;
        val.len = STR_LIT_LEN(GTM_TPRESTART_LOG_DELTA);
        TREF(tprestart_syslog_delta) = trans_numeric(&val, &is_defined, TRUE);
        if (0 > TREF(tprestart_syslog_delta))
            TREF(tprestart_syslog_delta) = 0;
        /* See if this is a GT.M Development environment, not a production environment */
        if (GETENV("gtm_environment_init"))
            TREF(gtm_environment_init) = TRUE; /* in-house */
        /* See if a trace table is desired. If we have been asked to trace one or more groups, we also
         * see if a specific size has been specified. A default size is provided.
         */
        val.addr = GTM_TRACE_GROUPS;
        val.len = SIZEOF(GTM_TRACE_GROUPS) - 1;
        if (SS_NORMAL == (status = TRANS_LOG_NAME(&val, &trans, buf, SIZEOF(buf), do_sendmsg_on_log2long)))
        {   /* Trace-group(s) have been declared - figure out which ones */
            assert(SIZEOF(buf) > trans.len);
            parse_trctbl_groups(&trans);
            if (0 != TREF(gtm_trctbl_groups))
            {   /* At least one valid group was specified */
                val.addr = GTM_TRACE_TABLE_SIZE;
                val.len = SIZEOF(GTM_TRACE_TABLE_SIZE) - 1;
                trctblsize = trans_numeric(&val, &is_defined, TRUE);
                if (0 < (trctblsize = (0 < trctblsize) ? trctblsize : TRACE_TABLE_SIZE_DEFAULT)) /* assignment! */
                {
                    trctblbytes = trctblsize * SIZEOF(trctbl_entry);
                    TREF(gtm_trctbl_start) = malloc(trctblbytes);
                    TREF(gtm_trctbl_end) = TREF(gtm_trctbl_start) + trctblsize;
                    TREF(gtm_trctbl_cur) = TREF(gtm_trctbl_start) - 1; /* So doesn't skip 1st entry */
                    memset(TREF(gtm_trctbl_start), 0, trctblbytes);
                }
            }
        }
        /* Initialize dollar_zmaxtptime */
        val.addr = GTM_ZMAXTPTIME;
        val.len = SIZEOF(GTM_ZMAXTPTIME) - 1;
        if ((status = trans_numeric(&val, &is_defined, TRUE)) && (0 <= status) && (TPTIMEOUT_MAX_TIME >= status))
            TREF(dollar_zmaxtptime) = status;	 /* NOTE assignment above */
        /* Platform specific initializations */
        gtm_env_init_sp();
        TREF(gtm_env_init_done) = TRUE;
    }
}