add interface for timedwait on semaphores

According to SDL documentation, the SDL implementation of timedwait may
suck on some platforms, so it should only be used, where high CPU usage
during the wait is no issue.

getpckserver() will now only wait for one second for access to the
package server list and return an error instead of waiting indefinitely.
This commit is contained in:
ac-stef
2015-09-17 16:40:59 +02:00
parent cbd0e7b4bc
commit 12a05d41e9
4 changed files with 28 additions and 5 deletions
+7 -4
View File
@@ -53,13 +53,16 @@ COMMAND(addpckserver, "ss");
void getpckserver() // return a table of all package servers with four columns
{
sem_pckservers.wait();
vector<char> res;
loopv(pckservers) cvecprintf(res, "\"%s\" %d %d %d\n", pckservers[i]->host, pckservers[i]->priority, pckservers[i]->ping, pckservers[i]->resolved);
if(sem_pckservers.timedwait(1000)) cvecprintf(res, "\"serverlist is busy, try again later\" "); // single-word return value signals an error
else
{
loopv(pckservers) cvecprintf(res, "\"%s\" %d %d %d\n", pckservers[i]->host, pckservers[i]->priority, pckservers[i]->ping, pckservers[i]->resolved);
sem_pckservers.post();
}
if(res.length()) res.last() = '\0';
else res.add('\0');
result(res.getbuf());
sem_pckservers.post();
}
COMMAND(getpckserver, "");
@@ -430,7 +433,7 @@ int downloadpackages(bool loadscr) // get all pending packages
httpget h;
canceldownloads = false;
progress_of = loadscr ? pendingpackages.length() : -1;
if(sem_pckservers.trywait())
if(sem_pckservers.timedwait(1000))
{ // can't lock the server list -> this means, the server ping threads have not finished yet
if(pendingpackages.length()) conoutf("\f3failed to download packages: still pinging the servers...");
return 0;