diff options
Diffstat (limited to 'gcell/lib/runtime/gc_job_manager.cc')
-rw-r--r-- | gcell/lib/runtime/gc_job_manager.cc | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/gcell/lib/runtime/gc_job_manager.cc b/gcell/lib/runtime/gc_job_manager.cc new file mode 100644 index 0000000000..d96bc5381e --- /dev/null +++ b/gcell/lib/runtime/gc_job_manager.cc @@ -0,0 +1,186 @@ +/* -*- c++ -*- */ +/* + * Copyright 2007,2008 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include <gcell/gc_job_manager.h> +#include "gc_job_manager_impl.h" +#include <boost/weak_ptr.hpp> +#include <stdio.h> + + +static boost::weak_ptr<gc_job_manager> s_singleton; + + +// custom deleter of gc_job_desc allocated via alloc_job_desc_sptr +class job_desc_deleter { + gc_job_manager_sptr d_mgr; +public: + job_desc_deleter(gc_job_manager_sptr mgr) : d_mgr(mgr) {} + + void operator()(gc_job_desc *jd) { + d_mgr->free_job_desc(jd); + } +}; + + + +gc_job_manager_sptr +gc_make_job_manager(const gc_jm_options *options) +{ + return gc_job_manager_sptr(new gc_job_manager_impl(options)); +} + +gc_job_manager::gc_job_manager(const gc_jm_options *options) +{ + // nop +} + +gc_job_manager::~gc_job_manager() +{ + // nop +} + +void +gc_job_manager::set_debug(int debug) +{ + // nop +} + +int +gc_job_manager::debug() +{ + return 0; +} + +void +gc_job_manager::set_singleton(gc_job_manager_sptr mgr) +{ + s_singleton = mgr; +} + +gc_job_manager_sptr +gc_job_manager::singleton() +{ + return gc_job_manager_sptr(s_singleton); +} + +gc_job_desc_sptr +gc_job_manager::make_jd_sptr(gc_job_manager_sptr mgr, gc_job_desc *jd) +{ + return gc_job_desc_sptr(jd, job_desc_deleter(mgr)); +} + +gc_job_desc_sptr +gc_job_manager::alloc_job_desc(gc_job_manager_sptr mgr) +{ + return make_jd_sptr(mgr, mgr->alloc_job_desc()); +} + + +// ------------------------------------------------------------------------ + + +// custom deleter +class spe_program_handle_deleter { +public: + void operator()(spe_program_handle_t *program) { + if (program){ + int r = spe_image_close(program); + if (r != 0){ + perror("spe_image_close"); + } + } + } +}; + +// nop custom deleter +class nop_spe_program_handle_deleter { +public: + void operator()(spe_program_handle_t *program) { + } +}; + +spe_program_handle_sptr +gc_program_handle_from_filename(const std::string &filename) +{ + return spe_program_handle_sptr(spe_image_open(filename.c_str()), + spe_program_handle_deleter()); +} + + +spe_program_handle_sptr +gc_program_handle_from_address(spe_program_handle_t *handle) +{ + return spe_program_handle_sptr(handle, nop_spe_program_handle_deleter()); +} + +const std::string +gc_job_status_string(gc_job_status_t status) +{ + switch(status){ + case JS_OK: return "JS_OK"; + case JS_SHUTTING_DOWN: return "JS_SHUTTING_DOWN"; + case JS_TOO_MANY_CLIENTS: return "JS_TOO_MANY_CLIENTS"; + case JS_UNKNOWN_PROC: return "JS_UNKNOWN_PROC"; + case JS_BAD_DIRECTION: return "JS_BAD_DIRECTION"; + case JS_BAD_EAH: return "JS_BAD_EAH"; + case JS_BAD_N_DIRECT: return "JS_BAD_N_DIRECT"; + case JS_BAD_N_EA: return "JS_BAD_N_EA"; + case JS_ARGS_TOO_LONG: return "JS_ARGS_TOO_LONG"; + case JS_BAD_JUJU: return "JS_BAD_JUJU"; + case JS_BAD_JOB_DESC: return "JS_BAD_JOB_DESC"; + default: + char buf[100]; + snprintf(buf, sizeof(buf), "unknown gc_job_status_t (%d)\n", status); + return buf; + } +} + +/* + * exception classes + */ + +gc_exception::gc_exception(const std::string &msg) + : runtime_error(msg) +{ +} + +gc_unknown_proc::gc_unknown_proc(const std::string &msg) + : gc_exception("gc_unknown_proc: " + msg) +{ +} + +gc_bad_alloc::gc_bad_alloc(const std::string &msg) + : gc_exception("gc_bad_alloc: " + msg) +{ +} + +gc_bad_align::gc_bad_align(const std::string &msg) + : gc_exception("gc_bad_align: " + msg) +{ +} + +gc_bad_submit::gc_bad_submit(const std::string &name, gc_job_status_t status) + : gc_exception("gc_bad_submit(" + name + "): " + gc_job_status_string(status)) +{ +} |