This change fixes potential problems with thread functions being
called several times in parallel (which may happen if the network
operations performed by these functions really take long). In these
cases, the thread's data structure (see previous commit) will not be
used exclusively anymore.
To fix this, the thread's data structure will be allocated separately
for each invocation of the corresponding thread function.
DownloadServerScoreToCache(data->level_nr,
data->score_cache_filename);
DownloadServerScoreToCache(data->level_nr,
data->score_cache_filename);
+ checked_free(data->score_cache_filename);
+ checked_free(data);
+
return 0;
}
static void DownloadServerScoreToCacheAsThread(int nr)
{
return 0;
}
static void DownloadServerScoreToCacheAsThread(int nr)
{
- static struct DownloadServerScoreToCacheThreadData data;
+ struct DownloadServerScoreToCacheThreadData *data =
+ checked_malloc(sizeof(struct DownloadServerScoreToCacheThreadData));
char *score_cache_filename = getScoreCacheFilename(nr);
char *score_cache_filename = getScoreCacheFilename(nr);
- checked_free(data.score_cache_filename);
-
- data.level_nr = nr;
- data.score_cache_filename = getStringCopy(score_cache_filename);
+ data->level_nr = nr;
+ data->score_cache_filename = getStringCopy(score_cache_filename);
ExecuteAsThread(DownloadServerScoreToCacheThread,
ExecuteAsThread(DownloadServerScoreToCacheThread,
- "DownloadServerScoreToCache", &data,
+ "DownloadServerScoreToCache", data,
"download scores from server");
}
"download scores from server");
}
data->score_tape_filename,
&data->score_entry);
data->score_tape_filename,
&data->score_entry);
+ checked_free(data->score_tape_filename);
+ checked_free(data);
+
return 0;
}
static void UploadScoreToServerAsThread(int nr)
{
return 0;
}
static void UploadScoreToServerAsThread(int nr)
{
- static struct UploadScoreToServerThreadData data;
+ struct UploadScoreToServerThreadData *data =
+ checked_malloc(sizeof(struct UploadScoreToServerThreadData));
struct ScoreEntry *score_entry = &scores.entry[scores.last_added];
char *score_tape_filename = getScoreTapeFilename(score_entry->tape_basename, nr);
struct ScoreEntry *score_entry = &scores.entry[scores.last_added];
char *score_tape_filename = getScoreTapeFilename(score_entry->tape_basename, nr);
- checked_free(data.score_tape_filename);
-
- data.level_nr = nr;
- data.score_entry = *score_entry;
- data.score_tape_filename = getStringCopy(score_tape_filename);
+ data->level_nr = nr;
+ data->score_entry = *score_entry;
+ data->score_tape_filename = getStringCopy(score_tape_filename);
ExecuteAsThread(UploadScoreToServerThread,
ExecuteAsThread(UploadScoreToServerThread,
- "UploadScoreToServer", &data,
+ "UploadScoreToServer", data,
"upload score to server");
}
"upload score to server");
}