mirror of https://github.com/BOINC/boinc.git
Protected the getrusage call in boinc_calling_thread_cpu_time() with the
same mutex used in boinc_api.C svn path=/trunk/boinc/; revision=10358
This commit is contained in:
parent
0cf32ac71f
commit
c2b585ade9
11
lib/util.C
11
lib/util.C
|
@ -813,13 +813,20 @@ int boinc_calling_thread_cpu_time(double& cpu) {
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
pthread_mutex_t getrusage_mutex=PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
// Unix: pthreads doesn't seem to provide an API for getting
|
// Unix: pthreads doesn't seem to provide an API for getting
|
||||||
// per-thread CPU time. So just get the process's CPU time
|
// per-thread CPU time. So just get the process's CPU time
|
||||||
//
|
//
|
||||||
int boinc_calling_thread_cpu_time(double &cpu_t) {
|
int boinc_calling_thread_cpu_time(double &cpu_t) {
|
||||||
int retval;
|
int retval=1;
|
||||||
struct rusage ru;
|
struct rusage ru;
|
||||||
retval = getrusage(RUSAGE_SELF, &ru);
|
// getrusage can return an error, so try a few times if it returns an error.
|
||||||
|
if (!pthread_mutex_trylock(&getrusage_mutex)) {
|
||||||
|
int i=0;
|
||||||
|
while (retval=getrusage(RUSAGE_SELF, &ru) && i<10) i++;
|
||||||
|
pthread_mutex_unlock(&getrusage_mutex);
|
||||||
|
}
|
||||||
if (retval) {
|
if (retval) {
|
||||||
return ERR_GETRUSAGE;
|
return ERR_GETRUSAGE;
|
||||||
}
|
}
|
||||||
|
|
10
lib/util.h
10
lib/util.h
|
@ -28,6 +28,12 @@
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#ifdef HAVE_PTHREAD
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(HAVE_STRLCPY)
|
#if !defined(HAVE_STRLCPY)
|
||||||
extern size_t strlcpy(char*, const char*, size_t);
|
extern size_t strlcpy(char*, const char*, size_t);
|
||||||
#endif
|
#endif
|
||||||
|
@ -130,6 +136,10 @@ extern void mysql_timestamp(double, char*);
|
||||||
//
|
//
|
||||||
extern const char* boincerror(int which_error);
|
extern const char* boincerror(int which_error);
|
||||||
|
|
||||||
|
#ifdef HAVE_PTHREAD
|
||||||
|
extern pthread_mutex_t getrusage_mutex;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
extern int lookup_group(char*, gid_t& gid);
|
extern int lookup_group(char*, gid_t& gid);
|
||||||
extern int check_security(void);
|
extern int check_security(void);
|
||||||
|
|
Loading…
Reference in New Issue