Discussion:
is it safe to generate profiles from multiple concurrent processes?
Vincenzo Innocente
2014-06-25 09:35:42 UTC
Permalink
I have built a library with -fprofile-generate.
Now I want to generate profiles using various applications that link that library.

My understanding is that it is safe to run a multi-thread process to populate the profiles.
It is unclear to me if one can safely run multiple processes concurrently.

is there any risk of corruption or overwriting of the various "gcda” files if different processes attempt to write on them?
If safe I can easily speed up the generation of profiles by orders of magnitude.

thanks,
vincenzo
Markus Trippelsdorf
2014-06-25 11:59:32 UTC
Permalink
I have built a library with -fprofile-generate. Now I want to
generate profiles using various applications that link that library.
My understanding is that it is safe to run a multi-thread process to populate the profiles.
It is unclear to me if one can safely run multiple processes concurrently.
is there any risk of corruption or overwriting of the various "gcda”
files if different processes attempt to write on them? If safe I can
easily speed up the generation of profiles by orders of magnitude.
The gcda files are accessed by proper locks, so you should be save.
(See gcc/gcov-io.c).
--
Markus
Arbol One
2014-06-25 13:13:17 UTC
Permalink
I would like to change this code
------
#include <fstream>
int main () {
std::fstream fs;
fs.open ("test.txt", std::fstream::in | std::fstream::out |
std::fstream::app);
fs << " more lorem ipsum";
fs.close();
return 0;
}
-------
To look like this
#include <fstream>
int main () {
using my_read = std::fstream::in; //<== Error: expected type-specifier
std::fstream fs;
fs.open ("test.txt", my_read | std::fstream::out; | std::fstream::app);
fs << " more lorem ipsum";
fs.close();
return 0;
}

What am I doing wrong?

-----Original Message-----
From: Markus Trippelsdorf
Sent: Wednesday, June 25, 2014 7:59 AM
To: Vincenzo Innocente
Cc: gcc-***@gcc.gnu.org
Subject: Re: is it safe to generate profiles from multiple concurrent
processes?
I have built a library with -fprofile-generate. Now I want to
generate profiles using various applications that link that library.
My understanding is that it is safe to run a multi-thread process to populate the profiles.
It is unclear to me if one can safely run multiple processes concurrently.
is there any risk of corruption or overwriting of the various "gcda”
files if different processes attempt to write on them? If safe I can
easily speed up the generation of profiles by orders of magnitude.
The gcda files are accessed by proper locks, so you should be save.
(See gcc/gcov-io.c).
--
Markus
Jonathan Wakely
2014-06-25 13:15:47 UTC
Permalink
On 25 June 2014 14:13, Arbol One wrote:

Please don't hijack other people's threads for unrelated questions.
Post by Arbol One
To look like this
#include <fstream>
int main () {
using my_read = std::fstream::in; //<== Error: expected type-specifier
"using" declares a typedef, not a variable.

Try:

auto my_read = ...
Vincenzo Innocente
2014-06-25 13:52:27 UTC
Permalink
std::fstream::in is not a type
the error is indeed
error: ‘in’ in ‘std::fstream {aka class std::basic_fstream<char>}’ does not name a type

btw you have a spurious “;” before "|"

I think you are confusing the usage of “using” and “auto” keywords

this compiles

#include <fstream>
int main () {
auto && my_read = std::fstream::in;
std::fstream fs;
fs.open ("test.txt", my_read | std::fstream::out | std::fstream::app);
fs << " more lorem ipsum";
fs.close();
return 0;
}
#include <fstream>
int main () {
using my_read = std::fstream::in; //<== Error: expected type-specifier
std::fstream fs;
fs.open ("test.txt", my_read | std::fstream::out; | std::fstream::app);
fs << " more lorem ipsum";
fs.close();
return 0;
}
Loading...