00001 #ifndef _SIGX_TUNNEL_CONTEXT_BASE_HPP_ 00002 #define _SIGX_TUNNEL_CONTEXT_BASE_HPP_ 00003 00004 /* 00005 * Copyright 2008 Klaus Triendl 00006 * 00007 * This library is free software; you can redistribute it and/or 00008 * modify it under the terms of the GNU Library General Public 00009 * License as published by the Free Software Foundation; either 00010 * version 2 of the License, or (at your option) any later version. 00011 * 00012 * This library is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 * Library General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU Library General Public 00018 * License along with this library; if not, write to the Free 00019 * Software Foundation, 51 Franklin Street, Fifth Floor, 00020 * Boston, MA 02110-1301, USA. 00021 */ 00022 00023 #include <glibmm/thread.h> 00024 #include <sigx/fwddecl.h> 00025 #include <sigx/bad_dispatcher.h> 00026 #include <sigx/operator_new.h> 00027 #include <sigx/shared_dispatchable.h> 00028 #include <sigx/tunnel_validity_tracker.h> 00029 00030 00031 namespace sigx 00032 { 00033 00042 class SIGX_API tunnel_context_base: public operator_new 00043 { 00044 public: 00045 tunnel_context_base(const shared_dispatchable& _A_disp, const tunnel_validity_tracker& _A_validity_tracker, bool sync = false); 00046 virtual ~tunnel_context_base(); 00047 00050 virtual void invoke() = 0; 00051 00052 bool is_sync() const { return m_sync; } 00053 bool is_valid() const { return m_validity_tracker.is_valid(); } 00054 const void* creator_thread() const { return m_creator_thread; } 00055 00056 protected: 00060 void dispatch_me(); 00061 00062 protected: 00063 tunnel_validity_tracker m_validity_tracker; 00064 shared_dispatchable m_disp; 00065 bool m_sync; 00066 const void* const m_creator_thread; 00067 }; 00068 00069 00073 class SIGX_API sync_tunnel_context_base: public tunnel_context_base 00074 { 00075 public: 00076 sync_tunnel_context_base(const shared_dispatchable& _A_disp, const tunnel_validity_tracker& _A_validity_tracker); 00077 00078 00079 protected: 00088 void dispatch_me(); 00089 00090 00091 protected: 00092 Glib::Cond m_cond; 00093 Glib::Mutex m_mutex; 00094 }; 00095 00096 00097 } // namespace sigx 00098 00099 00100 #endif // end file guard