1*51c0b2f7Stbbdev /* 2*51c0b2f7Stbbdev Copyright (c) 2017-2020 Intel Corporation 3*51c0b2f7Stbbdev 4*51c0b2f7Stbbdev Licensed under the Apache License, Version 2.0 (the "License"); 5*51c0b2f7Stbbdev you may not use this file except in compliance with the License. 6*51c0b2f7Stbbdev You may obtain a copy of the License at 7*51c0b2f7Stbbdev 8*51c0b2f7Stbbdev http://www.apache.org/licenses/LICENSE-2.0 9*51c0b2f7Stbbdev 10*51c0b2f7Stbbdev Unless required by applicable law or agreed to in writing, software 11*51c0b2f7Stbbdev distributed under the License is distributed on an "AS IS" BASIS, 12*51c0b2f7Stbbdev WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*51c0b2f7Stbbdev See the License for the specific language governing permissions and 14*51c0b2f7Stbbdev limitations under the License. 15*51c0b2f7Stbbdev */ 16*51c0b2f7Stbbdev 17*51c0b2f7Stbbdev #include "ipc_utils.h" 18*51c0b2f7Stbbdev 19*51c0b2f7Stbbdev #include <stdlib.h> 20*51c0b2f7Stbbdev #include <stdio.h> 21*51c0b2f7Stbbdev #include <limits.h> 22*51c0b2f7Stbbdev #include <string.h> 23*51c0b2f7Stbbdev #include <unistd.h> 24*51c0b2f7Stbbdev 25*51c0b2f7Stbbdev namespace tbb { 26*51c0b2f7Stbbdev namespace internal { 27*51c0b2f7Stbbdev namespace rml { 28*51c0b2f7Stbbdev 29*51c0b2f7Stbbdev #define MAX_STR_LEN 255 30*51c0b2f7Stbbdev #define STARTTIME_ITEM_ID 21 31*51c0b2f7Stbbdev 32*51c0b2f7Stbbdev static char* get_stat_item(char* line, int item_id) { 33*51c0b2f7Stbbdev int id = 0, i = 0; 34*51c0b2f7Stbbdev 35*51c0b2f7Stbbdev while( id!=item_id ) { 36*51c0b2f7Stbbdev while( line[i]!='(' && line[i]!=' ' && line[i]!='\0' ) { 37*51c0b2f7Stbbdev ++i; 38*51c0b2f7Stbbdev } 39*51c0b2f7Stbbdev if( line[i]==' ' ) { 40*51c0b2f7Stbbdev ++id; 41*51c0b2f7Stbbdev ++i; 42*51c0b2f7Stbbdev } else if( line[i]=='(' ) { 43*51c0b2f7Stbbdev while( line[i]!=')' && line[i]!='\0' ) { 44*51c0b2f7Stbbdev ++i; 45*51c0b2f7Stbbdev } 46*51c0b2f7Stbbdev if( line[i]==')' ) { 47*51c0b2f7Stbbdev ++i; 48*51c0b2f7Stbbdev } else { 49*51c0b2f7Stbbdev return nullptr; 50*51c0b2f7Stbbdev } 51*51c0b2f7Stbbdev } else { 52*51c0b2f7Stbbdev return nullptr; 53*51c0b2f7Stbbdev } 54*51c0b2f7Stbbdev } 55*51c0b2f7Stbbdev 56*51c0b2f7Stbbdev return line + i; 57*51c0b2f7Stbbdev } 58*51c0b2f7Stbbdev 59*51c0b2f7Stbbdev unsigned long long get_start_time(int pid) { 60*51c0b2f7Stbbdev const char* stat_file_path_template = "/proc/%d/stat"; 61*51c0b2f7Stbbdev char stat_file_path[MAX_STR_LEN + 1]; 62*51c0b2f7Stbbdev sprintf( stat_file_path, stat_file_path_template, pid ); 63*51c0b2f7Stbbdev 64*51c0b2f7Stbbdev FILE* stat_file = fopen( stat_file_path, "rt" ); 65*51c0b2f7Stbbdev if( stat_file==nullptr ) { 66*51c0b2f7Stbbdev return 0; 67*51c0b2f7Stbbdev } 68*51c0b2f7Stbbdev 69*51c0b2f7Stbbdev char stat_line[MAX_STR_LEN + 1]; 70*51c0b2f7Stbbdev char* line = fgets( stat_line, MAX_STR_LEN, stat_file ); 71*51c0b2f7Stbbdev if( line==nullptr ) { 72*51c0b2f7Stbbdev return 0; 73*51c0b2f7Stbbdev } 74*51c0b2f7Stbbdev 75*51c0b2f7Stbbdev char* starttime_str = get_stat_item( stat_line, STARTTIME_ITEM_ID ); 76*51c0b2f7Stbbdev if( starttime_str==nullptr ) { 77*51c0b2f7Stbbdev return 0; 78*51c0b2f7Stbbdev } 79*51c0b2f7Stbbdev 80*51c0b2f7Stbbdev unsigned long long starttime = strtoull( starttime_str, nullptr, 10 ); 81*51c0b2f7Stbbdev if( starttime==ULLONG_MAX ) { 82*51c0b2f7Stbbdev return 0; 83*51c0b2f7Stbbdev } 84*51c0b2f7Stbbdev 85*51c0b2f7Stbbdev return starttime; 86*51c0b2f7Stbbdev } 87*51c0b2f7Stbbdev 88*51c0b2f7Stbbdev char* get_shared_name(const char* prefix, int pid, unsigned long long time) { 89*51c0b2f7Stbbdev const char* name_template = "%s_%d_%llu"; 90*51c0b2f7Stbbdev const int digits_in_int = 10; 91*51c0b2f7Stbbdev const int digits_in_long = 20; 92*51c0b2f7Stbbdev 93*51c0b2f7Stbbdev int len = strlen( name_template ) + strlen( prefix ) + digits_in_int + digits_in_long + 1; 94*51c0b2f7Stbbdev char* name = new char[len]; 95*51c0b2f7Stbbdev sprintf( name, name_template, prefix, pid, time ); 96*51c0b2f7Stbbdev 97*51c0b2f7Stbbdev return name; 98*51c0b2f7Stbbdev } 99*51c0b2f7Stbbdev 100*51c0b2f7Stbbdev char* get_shared_name(const char* prefix) { 101*51c0b2f7Stbbdev int pid = getpgrp(); 102*51c0b2f7Stbbdev unsigned long long time = get_start_time( pid ); 103*51c0b2f7Stbbdev return get_shared_name( prefix, pid, time ); 104*51c0b2f7Stbbdev } 105*51c0b2f7Stbbdev 106*51c0b2f7Stbbdev int get_num_threads(const char* env_var) { 107*51c0b2f7Stbbdev if( env_var==nullptr ) { 108*51c0b2f7Stbbdev return 0; 109*51c0b2f7Stbbdev } 110*51c0b2f7Stbbdev 111*51c0b2f7Stbbdev char* value = getenv( env_var ); 112*51c0b2f7Stbbdev if( value==nullptr ) { 113*51c0b2f7Stbbdev return 0; 114*51c0b2f7Stbbdev } 115*51c0b2f7Stbbdev 116*51c0b2f7Stbbdev int num_threads = (int)strtol( value, nullptr, 10 ); 117*51c0b2f7Stbbdev return num_threads; 118*51c0b2f7Stbbdev } 119*51c0b2f7Stbbdev 120*51c0b2f7Stbbdev bool get_enable_flag(const char* env_var) { 121*51c0b2f7Stbbdev if( env_var==nullptr ) { 122*51c0b2f7Stbbdev return false; 123*51c0b2f7Stbbdev } 124*51c0b2f7Stbbdev 125*51c0b2f7Stbbdev char* value = getenv( env_var ); 126*51c0b2f7Stbbdev if( value==nullptr ) { 127*51c0b2f7Stbbdev return false; 128*51c0b2f7Stbbdev } 129*51c0b2f7Stbbdev 130*51c0b2f7Stbbdev if( strcmp( value, "0" ) == 0 || 131*51c0b2f7Stbbdev strcmp( value, "false" ) == 0 || 132*51c0b2f7Stbbdev strcmp( value, "False" ) == 0 || 133*51c0b2f7Stbbdev strcmp( value, "FALSE" ) == 0 ) { 134*51c0b2f7Stbbdev return false; 135*51c0b2f7Stbbdev } 136*51c0b2f7Stbbdev 137*51c0b2f7Stbbdev return true; 138*51c0b2f7Stbbdev } 139*51c0b2f7Stbbdev 140*51c0b2f7Stbbdev }}} // namespace tbb::internal::rml 141