ardour
abstract_ui.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 1998-2009 Paul Davis
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or
7  (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with this program; if not, write to the Free Software
16  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 
18 */
19 
20 #ifndef __pbd_abstract_ui_h__
21 #define __pbd_abstract_ui_h__
22 
23 #include <map>
24 #include <string>
25 #include <pthread.h>
26 
27 #include <glibmm/threads.h>
28 
29 #include "pbd/libpbd_visibility.h"
30 #include "pbd/receiver.h"
31 #include "pbd/ringbufferNPT.h"
32 #include "pbd/signals.h"
33 #include "pbd/base_ui.h"
34 
35 /* We have a special case in libpbd of a template class that gets instantiated
36  * as the base class of several classes in other libraries. It is not possible
37  * to use LIBFOO_API to mark this visible, because the FOO in each case is
38  * different. So we define this generic visible/export/hidden/import pair
39  * of macros to try to deal with this special case. These should NEVER be
40  * used anywhere except AbstractUI<T> (or similar cases if they arise.
41  *
42  * Note the assumption here that other libs are being built as DLLs if this one is.
43  */
44 
45 #ifdef ABSTRACT_UI_EXPORTS
46 #define ABSTRACT_UI_API LIBPBD_DLL_EXPORT
47 #else
48 #define ABSTRACT_UI_API LIBPBD_DLL_IMPORT
49 #endif
50 
51 
52 class Touchable;
53 
54 template<typename RequestObject>
56 {
57  public:
58  AbstractUI (const std::string& name);
59  virtual ~AbstractUI() {}
60 
61  void register_thread (std::string, pthread_t, std::string, uint32_t num_requests);
62  void call_slot (EventLoop::InvalidationRecord*, const boost::function<void()>&);
63  Glib::Threads::Mutex& slot_invalidation_mutex() { return request_buffer_map_lock; }
64 
65  Glib::Threads::Mutex request_buffer_map_lock;
66 
67  protected:
68  struct RequestBuffer : public PBD::RingBufferNPT<RequestObject> {
69  bool dead;
72  : PBD::RingBufferNPT<RequestObject> (size)
73  , dead (false)
74  , ui (uir) {}
75  };
76  typedef typename RequestBuffer::rw_vector RequestBufferVector;
77 
78 #if defined(COMPILER_MINGW) && defined(PTW32_VERSION)
79  struct pthread_cmp
80  {
81  bool operator() (const ptw32_handle_t& thread1, const ptw32_handle_t& thread2)
82  {
83  return thread1.p < thread2.p;
84  }
85  };
86  typedef typename std::map<pthread_t,RequestBuffer*, pthread_cmp>::iterator RequestBufferMapIterator;
87  typedef std::map<pthread_t,RequestBuffer*, pthread_cmp> RequestBufferMap;
88 #else
89  typedef typename std::map<pthread_t,RequestBuffer*>::iterator RequestBufferMapIterator;
90  typedef std::map<pthread_t,RequestBuffer*> RequestBufferMap;
91 #endif
92 
93  RequestBufferMap request_buffers;
94  static Glib::Threads::Private<RequestBuffer> per_thread_request_buffer;
95 
96  Glib::Threads::Mutex request_list_lock;
97  std::list<RequestObject*> request_list;
98 
99  RequestObject* get_request (RequestType);
100  void handle_ui_requests ();
101  void send_request (RequestObject *);
102 
103  virtual void do_request (RequestObject *) = 0;
105 };
106 
107 #endif /* __pbd_abstract_ui_h__ */
108 
109 
Glib::Threads::Mutex request_buffer_map_lock
Definition: abstract_ui.h:65
Glib::Threads::Mutex & slot_invalidation_mutex()
Definition: abstract_ui.h:63
std::list< RequestObject * > request_list
Definition: abstract_ui.h:97
virtual ~AbstractUI()
Definition: abstract_ui.h:59
PBD::ScopedConnection new_thread_connection
Definition: abstract_ui.h:104
RequestBuffer(uint32_t size, AbstractUI< RequestObject > &uir)
Definition: abstract_ui.h:71
static Glib::Threads::Private< RequestBuffer > per_thread_request_buffer
Definition: abstract_ui.h:94
LIBPBD_API uint64_t AbstractUI
Definition: debug.cc:51
std::map< pthread_t, RequestBuffer * >::iterator RequestBufferMapIterator
Definition: abstract_ui.h:89
#define ABSTRACT_UI_API
Definition: abstract_ui.h:48
const char * name
virtual void call_slot(InvalidationRecord *, const boost::function< void()> &)=0
Glib::Threads::Mutex request_list_lock
Definition: abstract_ui.h:96
Definition: debug.h:30
RequestBufferMap request_buffers
Definition: abstract_ui.h:93
virtual void handle_ui_requests()=0
RequestBuffer::rw_vector RequestBufferVector
Definition: abstract_ui.h:76
std::map< pthread_t, RequestBuffer * > RequestBufferMap
Definition: abstract_ui.h:90
Definition: base_ui.h:45
AbstractUI< RequestObject > & ui
Definition: abstract_ui.h:70