summaryrefslogtreecommitdiffstats
path: root/host/include
diff options
context:
space:
mode:
authorJohannes Demel <johannes.demel@ettus.com>2013-11-05 13:56:00 -0800
committerJohannes Demel <johannes.demel@ettus.com>2013-11-19 12:33:22 -0800
commit25660c5c9e83e352e10d9fe9feb115d40a322353 (patch)
tree41d9fd9d97a7ebb04664d2cb0a7afd314b479e1f /host/include
parent45a780cc858dd84e4883139ad2121aeb222d2d8e (diff)
downloaduhd-25660c5c9e83e352e10d9fe9feb115d40a322353.tar.gz
uhd-25660c5c9e83e352e10d9fe9feb115d40a322353.tar.bz2
uhd-25660c5c9e83e352e10d9fe9feb115d40a322353.zip
b200/dtor-stall: fixed bug that stalled b200 on shutdown.
Diffstat (limited to 'host/include')
-rw-r--r--host/include/uhd/transport/zero_copy.hpp1
-rw-r--r--host/include/uhd/utils/CMakeLists.txt1
-rw-r--r--host/include/uhd/utils/msg_task.hpp74
-rw-r--r--host/include/uhd/utils/tasks.hpp1
4 files changed, 76 insertions, 1 deletions
diff --git a/host/include/uhd/transport/zero_copy.hpp b/host/include/uhd/transport/zero_copy.hpp
index 1dc0e8e26..fe2974d09 100644
--- a/host/include/uhd/transport/zero_copy.hpp
+++ b/host/include/uhd/transport/zero_copy.hpp
@@ -72,6 +72,7 @@ namespace uhd{ namespace transport{
}
boost::detail::atomic_count _ref_count;
+ typedef boost::intrusive_ptr<managed_buffer> sptr;
protected:
void *_buffer;
diff --git a/host/include/uhd/utils/CMakeLists.txt b/host/include/uhd/utils/CMakeLists.txt
index cdef2e946..e86826435 100644
--- a/host/include/uhd/utils/CMakeLists.txt
+++ b/host/include/uhd/utils/CMakeLists.txt
@@ -27,6 +27,7 @@ UHD_INSTALL(FILES
images.hpp
log.hpp
msg.hpp
+ msg_task.hpp
paths.hpp
pimpl.hpp
safe_call.hpp
diff --git a/host/include/uhd/utils/msg_task.hpp b/host/include/uhd/utils/msg_task.hpp
new file mode 100644
index 000000000..ebb29af08
--- /dev/null
+++ b/host/include/uhd/utils/msg_task.hpp
@@ -0,0 +1,74 @@
+//
+// Copyright 2011-2013 Ettus Research LLC
+//
+// This program 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 of the License, or
+// (at your option) any later version.
+//
+// This program 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, see <http://www.gnu.org/licenses/>.
+//
+
+#ifndef INCLUDED_UHD_UTILS_MSG_TASK_HPP
+#define INCLUDED_UHD_UTILS_MSG_TASK_HPP
+
+#include <uhd/config.hpp>
+#include <uhd/transport/zero_copy.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/function.hpp>
+#include <boost/utility.hpp>
+#include <boost/optional/optional.hpp>
+#include <vector>
+
+namespace uhd{
+ class UHD_API msg_task : boost::noncopyable{
+ public:
+ typedef boost::shared_ptr<msg_task> sptr;
+ typedef std::vector<uint8_t> msg_payload_t;
+ typedef std::pair<uint32_t, msg_payload_t > msg_type_t;
+ typedef boost::function<boost::optional<msg_type_t>(void)> task_fcn_type;
+
+ /*
+ * During shutdown message queues for radio control cores might not be available anymore.
+ * Such stranded messages get pushed into a dump queue.
+ * With this function radio_ctrl_core can check if one of the messages meant for it got stranded.
+ */
+ virtual msg_payload_t get_msg_from_dump_queue(boost::uint32_t sid) = 0;
+
+ inline static std::vector<uint8_t> buff_to_vector(uint8_t* p, size_t n) {
+ if(p and n > 0){
+ std::vector<uint8_t> v(n);
+ memcpy(&v.front(), p, n);
+ return v;
+ }
+ return std::vector<uint8_t>();
+ }
+
+ /*!
+ * Create a new task object with function callback.
+ * The task function callback will be run in a loop.
+ * until the thread is interrupted by the deconstructor.
+ *
+ * A function may return payload which is then pushed to
+ * a synchronized message queue.
+ *
+ * A task should return in a reasonable amount of time
+ * or may block forever under the following conditions:
+ * - The blocking call is interruptible.
+ * - The task polls the interrupt condition.
+ *
+ * \param task_fcn the task callback function
+ * \return a new task object
+ */
+ static sptr make(const task_fcn_type &task_fcn);
+ };
+} //namespace uhd
+
+#endif /* INCLUDED_UHD_UTILS_MSG_TASK_HPP */
+
diff --git a/host/include/uhd/utils/tasks.hpp b/host/include/uhd/utils/tasks.hpp
index dcb003e39..a1f682a83 100644
--- a/host/include/uhd/utils/tasks.hpp
+++ b/host/include/uhd/utils/tasks.hpp
@@ -46,7 +46,6 @@ namespace uhd{
static sptr make(const task_fcn_type &task_fcn);
};
-
} //namespace uhd
#endif /* INCLUDED_UHD_UTILS_TASKS_HPP */