File: env.c

package info (click to toggle)
ga 5.9.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 18,472 kB
  • sloc: ansic: 192,963; fortran: 53,761; f90: 11,218; cpp: 5,784; makefile: 2,248; sh: 1,945; python: 1,734; perl: 534; csh: 134; asm: 106
file content (101 lines) | stat: -rw-r--r-- 3,619 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*
 *  * Copyright (c) 2016 Intel Corporation.  All rights reserved.
 */

#include <stddef.h>

#include "comex.h"
#include "comex_impl.h"

#include "env.h"
#include "log.h"

#if defined(__APPLE__) && defined(__MACH__)
#define DEFAULT_OFI_LIB "libfabric.dylib"
#else
#define DEFAULT_OFI_LIB "libfabric.so"
#endif

#define IS_SPACE(c)     ((c==0x20 || c==0x09 || c==0x0a || c==0x0b || c==0x0c || c==0x0d) ? 8 : 0)

env_data_t env_data = { ERROR,     /* log_level */
                        1,         /* native_atomics */
                        et_target, /* emulation_type */
                        1,         /* progress_thread */
                        8,         /* cq_entries_count */
                        0,         /* force_sync */
                        NULL,      /* provider */
                        NULL       /* library_path */ };

void parse_env_vars()
{
    env_to_int("COMEX_OFI_LOG_LEVEL", &(env_data.log_level));
    env_to_int("COMEX_OFI_NATIVE_ATOMICS", &(env_data.native_atomics));
    env_to_int("COMEX_OFI_ATOMICS_EMULATION_TYPE", &(env_data.emulation_type));
    env_to_int("COMEX_OFI_PROGRESS_THREAD", &(env_data.progress_thread));
    env_to_int("COMEX_OFI_CQ_ENTRIES_COUNT", &(env_data.cq_entries_count));
    env_to_int("COMEX_OFI_FORCE_SYNC", &(env_data.force_sync));
    env_data.provider = getenv("COMEX_OFI_PROVIDER");
    env_data.library_path = getenv("COMEX_OFI_LIBRARY");

    if (l_state.proc == 0)
    {
        COMEX_OFI_LOG(INFO, "COMEX_OFI_LOG_LEVEL: %d", env_data.log_level);
        COMEX_OFI_LOG(INFO, "COMEX_OFI_NATIVE_ATOMICS: %d", env_data.native_atomics);
        COMEX_OFI_LOG(INFO, "COMEX_OFI_ATOMICS_EMULATION_TYPE: %d", env_data.emulation_type);
        COMEX_OFI_LOG(INFO, "COMEX_OFI_PROGRESS_THREAD: %d", env_data.progress_thread);
        COMEX_OFI_LOG(INFO, "COMEX_OFI_CQ_ENTRIES_COUNT: %d", env_data.cq_entries_count);
        COMEX_OFI_LOG(INFO, "COMEX_OFI_FORCE_SYNC: %d", env_data.force_sync);
        COMEX_OFI_LOG(INFO, "COMEX_OFI_PROVIDER: %s", env_data.provider);
        COMEX_OFI_LOG(INFO, "COMEX_OFI_LIBRARY: %s", env_data.library_path);
    }

    assert(env_data.log_level >= ERROR && env_data.log_level <= TRACE);
    assert(env_data.native_atomics == 0 || env_data.native_atomics == 1);
    assert(env_data.emulation_type == et_origin || env_data.emulation_type == et_target);
    assert(env_data.progress_thread == 0 || env_data.progress_thread == 1);
    assert(env_data.cq_entries_count >= 1 && env_data.cq_entries_count <= 1024);
    assert(env_data.force_sync == 0 || env_data.force_sync == 1);

    if (env_data.native_atomics == 0 && env_data.emulation_type == et_target)
    {
        env_data.progress_thread = 1;
        if (l_state.proc == 0)
            COMEX_OFI_LOG(INFO, "enable progress thread to handle preposted requests in target atomics emulation");
    }

    if (!env_data.library_path || *env_data.library_path == '\0')
        env_data.library_path = DEFAULT_OFI_LIB;
}

int env_to_int(const char* env_name, int* val)
{
    const char* val_ptr;

    val_ptr = getenv(env_name);
    if (val_ptr)
    {
        const char* p;
        int sign = 1, value = 0;
        p = val_ptr;
        while (*p && IS_SPACE(*p)) p++;
        if (*p == '-')
        {
            p++;
            sign = -1;
        }
        if (*p == '+') p++;

        while (*p && isdigit(*p))
            value = 10 * value + (*p++ - '0');

        if (*p)
        {
            COMEX_OFI_LOG(ERROR, "invalid character %c in %s", *p, env_name);
            return -1;
        }
        *val = sign * value;
        return 1;
    }
    return 0;
}