xref: /oneTBB/python/rml/ipc_utils.cpp (revision 51c0b2f7)
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