xref: /oneTBB/python/rml/ipc_utils.cpp (revision b15aabb3)
151c0b2f7Stbbdev /*
2*b15aabb3Stbbdev     Copyright (c) 2017-2021 Intel Corporation
351c0b2f7Stbbdev 
451c0b2f7Stbbdev     Licensed under the Apache License, Version 2.0 (the "License");
551c0b2f7Stbbdev     you may not use this file except in compliance with the License.
651c0b2f7Stbbdev     You may obtain a copy of the License at
751c0b2f7Stbbdev 
851c0b2f7Stbbdev         http://www.apache.org/licenses/LICENSE-2.0
951c0b2f7Stbbdev 
1051c0b2f7Stbbdev     Unless required by applicable law or agreed to in writing, software
1151c0b2f7Stbbdev     distributed under the License is distributed on an "AS IS" BASIS,
1251c0b2f7Stbbdev     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1351c0b2f7Stbbdev     See the License for the specific language governing permissions and
1451c0b2f7Stbbdev     limitations under the License.
1551c0b2f7Stbbdev */
1651c0b2f7Stbbdev 
1751c0b2f7Stbbdev #include "ipc_utils.h"
1851c0b2f7Stbbdev 
1951c0b2f7Stbbdev #include <stdlib.h>
2051c0b2f7Stbbdev #include <stdio.h>
2151c0b2f7Stbbdev #include <limits.h>
2251c0b2f7Stbbdev #include <string.h>
2351c0b2f7Stbbdev #include <unistd.h>
2451c0b2f7Stbbdev 
2551c0b2f7Stbbdev namespace tbb {
2651c0b2f7Stbbdev namespace internal {
2751c0b2f7Stbbdev namespace rml {
2851c0b2f7Stbbdev 
2951c0b2f7Stbbdev #define MAX_STR_LEN 255
3051c0b2f7Stbbdev #define STARTTIME_ITEM_ID 21
3151c0b2f7Stbbdev 
get_stat_item(char * line,int item_id)3251c0b2f7Stbbdev static char* get_stat_item(char* line, int item_id) {
3351c0b2f7Stbbdev     int id = 0, i = 0;
3451c0b2f7Stbbdev 
3551c0b2f7Stbbdev     while( id!=item_id ) {
3651c0b2f7Stbbdev         while( line[i]!='(' && line[i]!=' ' && line[i]!='\0' ) {
3751c0b2f7Stbbdev             ++i;
3851c0b2f7Stbbdev         }
3951c0b2f7Stbbdev         if( line[i]==' ' ) {
4051c0b2f7Stbbdev             ++id;
4151c0b2f7Stbbdev             ++i;
4251c0b2f7Stbbdev         } else if( line[i]=='(' ) {
4351c0b2f7Stbbdev             while( line[i]!=')' && line[i]!='\0' ) {
4451c0b2f7Stbbdev                ++i;
4551c0b2f7Stbbdev             }
4651c0b2f7Stbbdev             if( line[i]==')' ) {
4751c0b2f7Stbbdev                 ++i;
4851c0b2f7Stbbdev             } else {
4951c0b2f7Stbbdev                 return nullptr;
5051c0b2f7Stbbdev             }
5151c0b2f7Stbbdev         } else {
5251c0b2f7Stbbdev             return nullptr;
5351c0b2f7Stbbdev         }
5451c0b2f7Stbbdev     }
5551c0b2f7Stbbdev 
5651c0b2f7Stbbdev     return line + i;
5751c0b2f7Stbbdev }
5851c0b2f7Stbbdev 
get_start_time(int pid)5951c0b2f7Stbbdev unsigned long long get_start_time(int pid) {
6051c0b2f7Stbbdev     const char* stat_file_path_template = "/proc/%d/stat";
6151c0b2f7Stbbdev     char stat_file_path[MAX_STR_LEN + 1];
6251c0b2f7Stbbdev     sprintf( stat_file_path, stat_file_path_template, pid );
6351c0b2f7Stbbdev 
6451c0b2f7Stbbdev     FILE* stat_file = fopen( stat_file_path, "rt" );
6551c0b2f7Stbbdev     if( stat_file==nullptr ) {
6651c0b2f7Stbbdev         return 0;
6751c0b2f7Stbbdev     }
6851c0b2f7Stbbdev 
6951c0b2f7Stbbdev     char stat_line[MAX_STR_LEN + 1];
7051c0b2f7Stbbdev     char* line = fgets( stat_line, MAX_STR_LEN, stat_file );
7151c0b2f7Stbbdev     if( line==nullptr ) {
7251c0b2f7Stbbdev         return 0;
7351c0b2f7Stbbdev     }
7451c0b2f7Stbbdev 
7551c0b2f7Stbbdev     char* starttime_str = get_stat_item( stat_line, STARTTIME_ITEM_ID );
7651c0b2f7Stbbdev     if( starttime_str==nullptr ) {
7751c0b2f7Stbbdev         return 0;
7851c0b2f7Stbbdev     }
7951c0b2f7Stbbdev 
8051c0b2f7Stbbdev     unsigned long long starttime = strtoull( starttime_str, nullptr, 10 );
8151c0b2f7Stbbdev     if( starttime==ULLONG_MAX ) {
8251c0b2f7Stbbdev         return 0;
8351c0b2f7Stbbdev     }
8451c0b2f7Stbbdev 
8551c0b2f7Stbbdev     return starttime;
8651c0b2f7Stbbdev }
8751c0b2f7Stbbdev 
get_shared_name(const char * prefix,int pid,unsigned long long time)8851c0b2f7Stbbdev char* get_shared_name(const char* prefix, int pid, unsigned long long time) {
8951c0b2f7Stbbdev     const char* name_template = "%s_%d_%llu";
9051c0b2f7Stbbdev     const int digits_in_int = 10;
9151c0b2f7Stbbdev     const int digits_in_long = 20;
9251c0b2f7Stbbdev 
9351c0b2f7Stbbdev     int len = strlen( name_template ) + strlen( prefix ) + digits_in_int + digits_in_long + 1;
9451c0b2f7Stbbdev     char* name = new char[len];
9551c0b2f7Stbbdev     sprintf( name, name_template, prefix, pid, time );
9651c0b2f7Stbbdev 
9751c0b2f7Stbbdev     return name;
9851c0b2f7Stbbdev }
9951c0b2f7Stbbdev 
get_shared_name(const char * prefix)10051c0b2f7Stbbdev char* get_shared_name(const char* prefix) {
10151c0b2f7Stbbdev     int pid = getpgrp();
10251c0b2f7Stbbdev     unsigned long long time = get_start_time( pid );
10351c0b2f7Stbbdev     return get_shared_name( prefix, pid, time );
10451c0b2f7Stbbdev }
10551c0b2f7Stbbdev 
get_num_threads(const char * env_var)10651c0b2f7Stbbdev int get_num_threads(const char* env_var) {
10751c0b2f7Stbbdev     if( env_var==nullptr ) {
10851c0b2f7Stbbdev         return 0;
10951c0b2f7Stbbdev     }
11051c0b2f7Stbbdev 
11151c0b2f7Stbbdev     char* value = getenv( env_var );
11251c0b2f7Stbbdev     if( value==nullptr ) {
11351c0b2f7Stbbdev         return 0;
11451c0b2f7Stbbdev     }
11551c0b2f7Stbbdev 
11651c0b2f7Stbbdev     int num_threads = (int)strtol( value, nullptr, 10 );
11751c0b2f7Stbbdev     return num_threads;
11851c0b2f7Stbbdev }
11951c0b2f7Stbbdev 
get_enable_flag(const char * env_var)12051c0b2f7Stbbdev bool get_enable_flag(const char* env_var) {
12151c0b2f7Stbbdev     if( env_var==nullptr ) {
12251c0b2f7Stbbdev         return false;
12351c0b2f7Stbbdev     }
12451c0b2f7Stbbdev 
12551c0b2f7Stbbdev     char* value = getenv( env_var );
12651c0b2f7Stbbdev     if( value==nullptr ) {
12751c0b2f7Stbbdev         return false;
12851c0b2f7Stbbdev     }
12951c0b2f7Stbbdev 
13051c0b2f7Stbbdev     if( strcmp( value, "0" ) == 0 ||
13151c0b2f7Stbbdev         strcmp( value, "false" ) == 0 ||
13251c0b2f7Stbbdev         strcmp( value, "False" ) == 0 ||
13351c0b2f7Stbbdev         strcmp( value, "FALSE" ) == 0 ) {
13451c0b2f7Stbbdev         return false;
13551c0b2f7Stbbdev     }
13651c0b2f7Stbbdev 
13751c0b2f7Stbbdev     return true;
13851c0b2f7Stbbdev }
13951c0b2f7Stbbdev 
14051c0b2f7Stbbdev }}} // namespace tbb::internal::rml
141