2012-12-27 4 views
12

Durante l'esecuzione delle prove di morte scritte utilizzando il framework di test Google il seguente avviso viene prodotto per ciascuna delle prove:Come fare che Google Test rilevi il numero di thread su 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. 

C'è un modo per rendere Google prova di rilevare il numero di thread su Linux?

+1

Si potrebbe pensare che le persone intelligenti di Google saprebbero come farlo se fosse facile? ;) –

+2

@MatsPetersson: Beh, a volte ci sono troppe cose facili da fare. – vitaut

risposta

11

Ho guardato il codice sorgente e ho scoperto che il rilevamento del numero di thread è implementato solo per MacOS X e QNX, ma non su Linux o altre piattaforme. Quindi ho implementato personalmente le funzionalità mancanti contando il numero di voci in /proc/self/task. Dal momento che potrebbe essere utile per gli altri sto postando qui (ho anche inviato alla 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; 
} 

partire dal 25 agosto 2015, Google prova implements GetThreadCount on Linux:

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

Ottimizzazione leggera, dal momento che tutte le voci sarebbero numeri, si potrebbe semplicemente fare 'if (entry-> d_name [0]! = '.') ...' invece delle tue due chiamate a strcmp ... Sono sicuro non importa davvero ... –

+1

Mi piace la tua soluzione, a proposito. –

+0

@MatsPetersson: Grazie. Hai ragione riguardo alle prestazioni, ma è solo per i test di morte che sono comunque lenti. – vitaut

4

Se non si cura molto circa il tempo di esecuzione di test, una vantaggiosa alternativa è quella di utilizzare:

::testing::FLAGS_gtest_death_test_style = "threadsafe"; 

Maggiori dettagli here.

+1

Mi interessa il tempo di esecuzione del test, ma grazie per la risposta. Non sapevo di questa opzione. – vitaut

+0

Può anche essere passato come argomento della riga di comando: '--gtest_death_test_style = threadsafe' – psur