00001 #ifndef SAGA_PACKAGES_JOB_JOB_HPP
00002 #define SAGA_PACKAGES_JOB_JOB_HPP
00003
00004 #if defined(__WAVE__) && defined(SAGA_CREATE_PREPROCESSED_FILES)
00005 #pragma wave option(preserve: 2, line: 1, output: "preprocessed/job.hpp")
00006 #endif
00007
00008
00009
00010
00011
00012
00013 #if defined(__WAVE__) && defined(SAGA_CREATE_PREPROCESSED_FILES)
00014 #pragma wave option(output: null)
00015 #endif
00016
00017 #include <string>
00018 #include <vector>
00019 #include <iosfwd>
00020
00021
00022 #include <saga/saga/util.hpp>
00023 #include <saga/saga/base.hpp>
00024 #include <saga/saga/types.hpp>
00025 #include <saga/saga/session.hpp>
00026 #include <saga/saga/call.hpp>
00027
00028 #include <saga/saga/packages/job/config.hpp>
00029 #include <saga/saga/packages/job/job_description.hpp>
00030 #include <saga/saga/packages/job/istream.hpp>
00031 #include <saga/saga/packages/job/ostream.hpp>
00032
00033 #include <saga/saga/detail/attribute.hpp>
00034 #include <saga/saga/detail/permissions.hpp>
00035
00036
00037 #if defined(BOOST_MSVC)
00038 #pragma warning(push)
00039 #pragma warning(disable: 4251 4231 4275 4660)
00040 #endif
00041
00042 #ifdef SAGA_DEBUG
00043 #include <saga/saga/packages/job/preprocessed/job.hpp>
00044 #else
00045
00046 #if defined(__WAVE__) && defined(SAGA_CREATE_PREPROCESSED_FILES)
00047 #pragma wave option(preserve: 2, line: 1, output: "preprocessed/job.hpp")
00048 #endif
00050 namespace saga
00051 {
00056 namespace job {
00057
00074 namespace attributes
00075 {
00076
00080 char const* const jobid = "JobID";
00083 char const* const execution_hosts = "ExecutionHosts";
00086 char const* const created = "Created";
00089 char const* const started = "Started";
00092 char const* const finished = "Finished";
00095 char const* const working_directory = "WorkingDirectory";
00099 char const* const exitcode = "ExitCode";
00102 char const* const termsig = "Termsig";
00105 char const* const job_service = "JobService";
00106 }
00107
00119 namespace metrics
00120 {
00124 char const* const state = "job.state";
00129 char const* const state_detail = "job.state_detail";
00133 char const* const signal = "job.signal";
00136 char const* const cpu_time = "job.cpu_time";
00139 char const* const memory_use = "job.memory_use";
00142 char const* const vmemory_use = "job.vmemory_use";
00145 char const* const performance = "job.Performance";
00146 }
00147
00152 enum state
00153 {
00156 Unknown = saga::task_base::Unknown,
00157
00162 New = saga::task_base::New,
00163
00168 Running = saga::task_base::Running,
00169
00174 Done = saga::task_base::Done,
00175
00180 Canceled = saga::task_base::Canceled,
00181
00186 Failed = saga::task_base::Failed,
00187
00191 Suspended = 6
00192 };
00193
00195 namespace detail
00196 {
00197 SAGA_JOB_PACKAGE_EXPORT std::string get_state_name(state s);
00198 }
00200
00212 class SAGA_JOB_PACKAGE_EXPORT job
00213 : public saga::task,
00214 public saga::detail::attribute<job>,
00215 public saga::detail::permissions<job>
00216 {
00217 private:
00218 friend struct saga::detail::attribute<job>;
00219 friend struct saga::detail::permissions<job>;
00220
00221
00222 SAGA_CALL_PRIV_0(get_job_id)
00223 SAGA_CALL_PRIV_0(get_state)
00224 SAGA_CALL_PRIV_0(get_description)
00225
00226
00227 SAGA_CALL_PRIV_0(run)
00228 SAGA_CALL_PRIV_1(cancel, double)
00229 SAGA_CALL_PRIV_1(wait, double)
00230
00231
00232
00233
00234 SAGA_CALL_PRIV_0(get_stdin)
00235 SAGA_CALL_PRIV_0(get_stdout)
00236 SAGA_CALL_PRIV_0(get_stderr)
00237
00238
00239 SAGA_CALL_PRIV_0(suspend)
00240 SAGA_CALL_PRIV_0(resume)
00241 SAGA_CALL_PRIV_0(checkpoint)
00242 SAGA_CALL_PRIV_1(migrate, description)
00243 SAGA_CALL_PRIV_1(signal, int)
00244
00245 protected:
00247
00248 typedef saga::detail::attribute<job> attribute_base;
00249 TR1::shared_ptr <saga::impl::job> get_impl_sp (void) const;
00250 saga::impl::job* get_impl (void) const;
00251 explicit job (saga::impl::job *);
00253
00254 public:
00259 job();
00260
00265 explicit job (saga::object const& o);
00266
00271 ~job();
00272
00277 job &operator= (saga::object const& o);
00278
00283 std::string get_job_id()
00284 {
00285 saga::task t = get_job_idpriv(saga::task_base::Sync());
00286 return t.get_result<std::string>();
00287 }
00288 SAGA_CALL_PUB_0_DEF_0(get_job_id)
00289
00290
00294 void run()
00295 {
00296 saga::task t = runpriv(saga::task_base::Sync());
00297 t.get_result ();
00298 }
00299 SAGA_CALL_PUB_0_DEF_0(run)
00300
00301
00305 bool wait(double timeout = -1.0)
00306 {
00307 saga::task t = waitpriv(timeout, saga::task_base::Sync());
00308 return t.get_result<bool>();
00309 }
00310 SAGA_CALL_PUB_1_DEF_1(wait, double, -1.0)
00311
00312
00316 void cancel(double timeout = 0.0)
00317 {
00318 saga::task t = cancelpriv(timeout, saga::task_base::Sync());
00319 t.get_result ();
00320 }
00321 SAGA_CALL_PUB_1_DEF_1(cancel, double, 0.0)
00322
00323
00328 saga::job::state get_state()
00329 {
00330 saga::task t = get_statepriv(saga::task_base::Sync());
00331 return t.get_result<saga::job::state>();
00332 }
00333 SAGA_CALL_PUB_0_DEF_0(get_state)
00334
00335
00341 saga::job::description get_description()
00342 {
00343 saga::task t = get_descriptionpriv(saga::task_base::Sync());
00344 return t.get_result<saga::job::description>();
00345 }
00346 SAGA_CALL_PUB_0_DEF_0(get_description)
00347
00348
00353 saga::job::ostream get_stdin()
00354 {
00355 saga::task t = get_stdinpriv(saga::task_base::Sync());
00356 return t.get_result<saga::job::ostream>();
00357 }
00358 SAGA_CALL_PUB_0_DEF_0(get_stdin)
00359
00360
00366 saga::job::istream get_stdout()
00367 {
00368 saga::task t = get_stdoutpriv(saga::task_base::Sync());
00369 return t.get_result<saga::job::istream>();
00370 }
00371 SAGA_CALL_PUB_0_DEF_0(get_stdout)
00372
00373
00379 saga::job::istream get_stderr()
00380 {
00381 saga::task t = get_stderrpriv(saga::task_base::Sync());
00382 return t.get_result<saga::job::istream>();
00383 }
00384 SAGA_CALL_PUB_0_DEF_0(get_stderr)
00385
00386
00391 void suspend()
00392 {
00393 saga::task t = suspendpriv(saga::task_base::Sync());
00394 t.get_result ();
00395 }
00396 SAGA_CALL_PUB_0_DEF_0(suspend)
00397
00398
00403 void resume()
00404 {
00405 saga::task t = resumepriv(saga::task_base::Sync());
00406 t.get_result ();
00407 }
00408 SAGA_CALL_PUB_0_DEF_0(resume)
00409
00410
00415 void checkpoint()
00416 {
00417 saga::task t = checkpointpriv(saga::task_base::Sync());
00418 t.get_result ();
00419 }
00420 SAGA_CALL_PUB_0_DEF_0(checkpoint)
00421
00422
00428 void migrate(description job_desc)
00429 {
00430 saga::task t = migratepriv(job_desc, saga::task_base::Sync());
00431 t.get_result ();
00432 }
00433 SAGA_CALL_PUB_1_DEF_0(migrate, description)
00434
00435
00442 void signal(int signal)
00443 {
00444 saga::task t = signalpriv(signal, saga::task_base::Sync());
00445 t.get_result ();
00446 }
00447 SAGA_CALL_PUB_1_DEF_0(signal, int)
00448 };
00449
00450 }
00451 }
00452
00453 #if defined(__WAVE__) && defined(SAGA_CREATE_PREPROCESSED_FILES)
00454 #pragma wave option(output: null)
00455 #endif
00456
00457 #endif // !defined(SAGA_DEBUG)
00458
00459
00460 #if defined(BOOST_MSVC)
00461 #pragma warning(pop)
00462 #endif
00463
00464 #endif // !defined(SAGA_PACKAGES_JOB_JOB_HPP)
00465