Imported Upstream version 3.2.2
[debian/gnuradio] / gcell / lib / runtime / gc_job_manager.cc
1 /* -*- c++ -*- */
2 /*
3  * Copyright 2007,2008 Free Software Foundation, Inc.
4  * 
5  * This file is part of GNU Radio
6  * 
7  * GNU Radio is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3, or (at your option)
10  * any later version.
11  * 
12  * GNU Radio is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25 #include <gcell/gc_job_manager.h>
26 #include "gc_job_manager_impl.h"
27 #include <boost/weak_ptr.hpp>
28 #include <stdio.h>
29
30
31 static boost::weak_ptr<gc_job_manager> s_singleton;
32
33
34 // custom deleter of gc_job_desc allocated via alloc_job_desc_sptr
35 class job_desc_deleter {
36   gc_job_manager_sptr   d_mgr;
37 public:
38   job_desc_deleter(gc_job_manager_sptr mgr) : d_mgr(mgr) {}
39
40   void operator()(gc_job_desc *jd) {
41     d_mgr->free_job_desc(jd);
42   }
43 };
44
45
46
47 gc_job_manager_sptr
48 gc_make_job_manager(const gc_jm_options *options)
49 {
50   return gc_job_manager_sptr(new gc_job_manager_impl(options));
51 }
52
53 gc_job_manager::gc_job_manager(const gc_jm_options *options)
54 {
55   // nop
56 }
57
58 gc_job_manager::~gc_job_manager()
59 {
60   // nop
61 }
62
63 void
64 gc_job_manager::set_debug(int debug)
65 {
66   // nop
67 }
68
69 int
70 gc_job_manager::debug()
71 {
72   return 0;
73 }
74
75 void 
76 gc_job_manager::set_singleton(gc_job_manager_sptr mgr)
77 {
78   s_singleton = mgr;
79 }
80
81 gc_job_manager_sptr 
82 gc_job_manager::singleton()
83 {
84   return gc_job_manager_sptr(s_singleton);
85 }
86
87 gc_job_desc_sptr 
88 gc_job_manager::make_jd_sptr(gc_job_manager_sptr mgr, gc_job_desc *jd)
89 {
90   return gc_job_desc_sptr(jd, job_desc_deleter(mgr));
91 }
92
93 gc_job_desc_sptr 
94 gc_job_manager::alloc_job_desc(gc_job_manager_sptr mgr)
95 {
96   return make_jd_sptr(mgr, mgr->alloc_job_desc());
97 }
98
99
100 // ------------------------------------------------------------------------
101
102
103 // custom deleter
104 class spe_program_handle_deleter {
105 public:
106   void operator()(spe_program_handle_t *program) {
107     if (program){
108       int r = spe_image_close(program);
109       if (r != 0){
110         perror("spe_image_close");
111       }
112     }
113   }
114 };
115
116 // nop custom deleter
117 class nop_spe_program_handle_deleter {
118 public:
119   void operator()(spe_program_handle_t *program) {
120   }
121 };
122
123 spe_program_handle_sptr 
124 gc_program_handle_from_filename(const std::string &filename)
125 {
126   return spe_program_handle_sptr(spe_image_open(filename.c_str()),
127                                  spe_program_handle_deleter());
128 }
129
130
131 spe_program_handle_sptr 
132 gc_program_handle_from_address(spe_program_handle_t *handle)
133 {
134   return spe_program_handle_sptr(handle, nop_spe_program_handle_deleter());
135 }
136
137 const std::string
138 gc_job_status_string(gc_job_status_t status)
139 {
140   switch(status){
141   case JS_OK:                   return "JS_OK";
142   case JS_SHUTTING_DOWN:        return "JS_SHUTTING_DOWN";
143   case JS_TOO_MANY_CLIENTS:     return "JS_TOO_MANY_CLIENTS";
144   case JS_UNKNOWN_PROC:         return "JS_UNKNOWN_PROC";
145   case JS_BAD_DIRECTION:        return "JS_BAD_DIRECTION";
146   case JS_BAD_EAH:              return "JS_BAD_EAH";
147   case JS_BAD_N_DIRECT:         return "JS_BAD_N_DIRECT";
148   case JS_BAD_N_EA:             return "JS_BAD_N_EA";
149   case JS_ARGS_TOO_LONG:        return "JS_ARGS_TOO_LONG";
150   case JS_BAD_JUJU:             return "JS_BAD_JUJU";
151   case JS_BAD_JOB_DESC:         return "JS_BAD_JOB_DESC";
152   default:
153     char buf[100];
154     snprintf(buf, sizeof(buf), "unknown gc_job_status_t (%d)\n", status);
155     return buf;
156   }
157 }
158
159 /*
160  * exception classes
161  */
162
163 gc_exception::gc_exception(const std::string &msg)
164   : runtime_error(msg)
165 {
166 }
167
168 gc_unknown_proc::gc_unknown_proc(const std::string &msg)
169   : gc_exception("gc_unknown_proc: " + msg)
170 {
171 }
172
173 gc_bad_alloc::gc_bad_alloc(const std::string &msg)
174   : gc_exception("gc_bad_alloc: " + msg)
175 {
176 }
177
178 gc_bad_align::gc_bad_align(const std::string &msg)
179   : gc_exception("gc_bad_align: " + msg)
180 {
181 }
182
183 gc_bad_submit::gc_bad_submit(const std::string &name, gc_job_status_t status)
184   : gc_exception("gc_bad_submit(" + name + "): " + gc_job_status_string(status))
185 {
186 }