[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: icecream/services
From: Michael Matz <matz () kde ! org>
Date: 2006-07-12 16:27:08
Message-ID: 1152721628.065335.4484.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 561593 by matz:
Fix an ugly problem with x86-64 (e.g.) machines which have only the
i686 native env but not the x86-64 native env with the same name
anymore. The scheduler was giving them out nevertheless as if they
got the x86-64 env already.
M +36 -9 scheduler.cpp
--- trunk/icecream/services/scheduler.cpp #561592:561593
@@ -587,26 +587,45 @@
return false;
}
-static bool
+/* Given a candidate CS and a JOB, check all installed environments
+ on the CS for a match. Return an empty string if none of the required
+ environments for this job is installed. Otherwise return the
+ host platform of the first found installed environment which is among
+ the requested. That can be send to the client, which then completely
+ specifies which environment to use (name, host platform and target
+ platform). */
+static string
envs_match( CS* cs, const Job *job )
{
if ( job->submitter == cs)
- return true; // it will compile itself
+ return cs->host_platform; // it will compile itself
+ /* Check all installed envs on the candidate CS ... */
for ( Environments::const_iterator it = cs->compiler_versions.begin(); it != \
cs->compiler_versions.end(); ++it ) {
- if ( platforms_compatible( it->first, job->target_platform ) )
+ if ( it->first == job->target_platform )
{
+ /* ... IT now is an installed environment which produces code for
+ the requested target platform. Now look at each env which
+ could be installed from the client (i.e. those coming with the
+ job) if it matches in name and additionally could be run
+ by the candidate CS. */
for ( Environments::const_iterator it2 = job->environments.begin(); it2 != \
job->environments.end(); ++it2 ) {
if ( it->second == it2->second && platforms_compatible( it2->first, \
cs->host_platform ) )
- return true;
+ return it2->first;
}
}
}
- return false;
+ return string();
}
+/* Given a candidate CS and a JOB, check if any of the requested
+ environments could be installed on the CS. This is the case if that
+ env can be run there, i.e. if the host platforms of the CS and of the
+ environment are compatible. Return an empty string if none can be
+ installed, otherwise return the platform of the first found
+ environments which can be installed. */
static string
can_install( CS* cs, const Job *job )
{
@@ -758,7 +777,7 @@
{
/* Make all servers compile a job at least once, so we'll get an
idea about their speed. */
- if (envs_match (cs, job))
+ if (!envs_match (cs, job).empty())
{
best = cs;
matches++;
@@ -772,7 +791,7 @@
break;
}
- if ( envs_match( cs, job ) )
+ if (!envs_match (cs, job).empty())
{
if ( !best )
best = cs;
@@ -981,8 +1000,16 @@
job->state = Job::WAITINGFORCS;
job->server = cs;
- bool gotit = envs_match( cs, job );
- UseCSMsg m2(can_install( cs, job ), cs->name, cs->remote_port, job->id, gotit, \
job->local_client_id ); + string host_platform = envs_match (cs, job);
+ bool gotit = true;
+ if (host_platform.empty ())
+ {
+ gotit = false;
+ host_platform = can_install (cs, job);
+ }
+
+ UseCSMsg m2(host_platform, cs->name, cs->remote_port, job->id,
+ gotit, job->local_client_id );
if (!job->submitter->send_msg (m2))
{
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic