2012-12-27 11 views
12

Podczas uruchamiania testów śmierci napisane przy użyciu ramy testowej Google następujące ostrzeżenie jest produkowany dla każdego z testów:Jak sprawić, aby Test Google wykrył liczbę wątków w systemie Linux?

[WARNING] .../gtest-death-test.cc:789:: Death tests use fork(), which is unsafe 
particularly in a threaded context. For this test, Google Test couldn't detect 
the number of threads. 

Czy istnieje sposób, aby zrobić test Google wykrywa liczbę wątków w systemie Linux?

+1

Można by pomyśleć, że sprytni ludzie z Google'u będą wiedzieli, jak to zrobić, skoro było to łatwe? ;) –

+2

@MatsPetersson: Cóż, czasami jest zbyt wiele łatwych do zrobienia rzeczy. – vitaut

Odpowiedz

11

Sprawdziłem kod źródłowy i okazało się, że wykrywanie liczby wątków jest realizowane tylko dla MacOS X i QNX, ale nie na Linuksie ani na innych platformach. Tak więc samodzielnie zaimplementowałem brakującą funkcjonalność, licząc liczbę wpisów w /proc/self/task. Ponieważ może to być przydatne dla innych jestem umieszczenie go tutaj (ja też wysłał go do Google Test group):

size_t GetThreadCount() { 
    size_t thread_count = 0; 
    if (DIR *dir = opendir("/proc/self/task")) { 
    while (dirent *entry = readdir(dir)) { 
     if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) 
     ++thread_count; 
    } 
    closedir(dir); 
    } 
    return thread_count; 
} 

Począwszy od 25 sierpnia 2015, test Google implements GetThreadCount on Linux:

size_t GetThreadCount() { 
    const string filename = 
     (Message() << "/proc/" << getpid() << "/stat").GetString(); 
    return ReadProcFileField<int>(filename, 19); 
} 
+0

Lekka optymalizacja, ponieważ wszystkie wpisy będą liczbami, możesz po prostu zrobić 'if (entry-> d_name [0]! = '.') ...' zamiast twoich dwóch wywołań do strcmp ... jestem pewien to nie ma znaczenia ... –

+1

Podoba mi się twoje rozwiązanie, przy okazji. –

+0

@MatsPetersson: Dzięki. Masz rację co do występu, ale tak czy tak jest tylko w przypadku testów śmierci. – vitaut

4

Jeśli nie dbają zbytnio o czas wykonania testu, wygodną alternatywą jest użycie:

::testing::FLAGS_gtest_death_test_style = "threadsafe"; 

Więcej szczegółów here.

+1

Dbam o czas wykonania testu, ale dziękuję za odpowiedź. Nie wiedziałem o tej opcji. – vitaut

+0

Może być również przekazywany jako argument wiersza poleceń: '--gtest_death_test_style = threadsafe' – psur

Powiązane problemy