2012-12-27 9 views
12

Wenn der Tod Tests laufen geschrieben mit Google Test-Framework der folgende Warnung für jeden der Tests hergestellt wird:Wie erkennt Google Test die Anzahl der Threads unter 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. 

Gibt es eine Möglichkeit Google-Test erkennt die Anzahl der Threads auf Linux zu machen?

+1

Man könnte denken, dass die cleveren Leute von Google wissen würden, wie man das macht, wenn es einfach ist? ;) –

+2

@MatsPetersson: Nun, manchmal gibt es zu viele einfache Dinge zu tun. – vitaut

Antwort

11

Ich habe mir den Quellcode angesehen und es stellte sich heraus, dass die Erkennung der Anzahl der Threads nur für MacOS X und QNX implementiert ist, aber nicht für Linux oder andere Plattformen. Also habe ich fehlende Funktionalität selbst implementiert, indem ich die Anzahl der Einträge in /proc/self/task gezählt habe. Da es für andere nützlich sein könnte ich es hier bin Entsendung (Ich habe schickte es auch auf die 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; 
} 

Wie vom 25. August 2015 Google-Test implements GetThreadCount on Linux:

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

Leichte Optimierung, da alle Einträge Zahlen wären, könntest du einfach 'if (entry-> d_name [0]! ='. ') ... 'anstelle deiner beiden Aufrufe von strcmp machen ... da bin ich mir sicher es spielt keine Rolle, wirklich ... –

+1

Ich mag Ihre Lösung übrigens. –

+0

@MatsPetersson: Danke. Du hast Recht mit der Leistung, aber es ist nur für Todesversuche, die sowieso langsam sind. – vitaut

4

Wenn Sie kümmern sich die Testausführungszeit nicht viel über, eine bequeme Alternative zu bedienen:

::testing::FLAGS_gtest_death_test_style = "threadsafe"; 

Weitere Details here.

+1

Ich kümmere mich um Testlaufzeit, aber danke für die Antwort. Ich wusste nichts von dieser Option. – vitaut

+0

Es kann auch als Befehlszeilenargument übergeben werden: '--gtest_death_test_style = threadsafe ' – psur