openATV enigma2
openATV is an open source SetTopBox Graphical user interface.
message.h
Go to the documentation of this file.
1 #ifndef __lib_base_message_h
2 #define __lib_base_message_h
3 
4 #include <queue>
5 #include <lib/base/ebase.h>
7 #include <lib/python/swig.h>
8 #include <unistd.h>
9 #include <lib/base/elock.h>
10 #include <lib/base/wrappers.h>
11 
12 
19 #ifndef SWIG
21 {
22  int fd[2];
23  eLock content;
24 public:
26  virtual ~eMessagePumpMT();
27 protected:
28  int send(const void *data, int len);
29  int recv(void *data, int len); // blockierend
30  int getInputFD() const { return fd[1]; }
31  int getOutputFD() const { return fd[0]; }
32 };
33 
40 template<class T>
41 class eFixedMessagePump: public sigc::trackable
42 {
44  std::queue<T> m_queue;
45  int m_pipe[2];
46  const char *name;
47  eSingleLock lock;
48  void do_recv(int)
49  {
50  char byte;
51  if (singleRead(m_pipe[0], &byte, sizeof(byte)) <= 0) return;
52 
53  lock.lock();
54  if (!m_queue.empty())
55  {
56  T msg = m_queue.front();
57  m_queue.pop();
58  lock.unlock();
59  /*
60  * We should not deliver the message while holding the lock,
61  * not even if we would use a recursive mutex.
62  * We would risk deadlock when pump writer and reader share another
63  * mutex besides this one, which could be grabbed / released
64  * in a different order
65  */
66  /*emit*/ recv_msg(msg);
67  }
68  else
69  {
70  lock.unlock();
71  }
72  }
73 public:
74  sigc::signal1<void,const T&> recv_msg;
75  void send(const T &msg)
76  {
77  {
78  eSingleLocker s(lock);
79  m_queue.push(msg);
80  }
81  char byte = 0;
82  writeAll(m_pipe[1], &byte, sizeof(byte));
83  }
84  eFixedMessagePump(eMainloop *context, int mt)
85  {
86  if (pipe(m_pipe) == -1)
87  {
88  eDebug("[eFixedMessagePump] failed to create pipe (%m)");
89  }
90  sn = eSocketNotifier::create(context, m_pipe[0], eSocketNotifier::Read, false);
92  sn->start();
93  }
94  eFixedMessagePump(eMainloop *context, int mt, const char *name) : name(name)
95  {
96  if (pipe(m_pipe) == -1)
97  {
98  eDebug("[eFixedMessagePump<%s>] failed to create pipe (%m)", name);
99  }
100  sn = eSocketNotifier::create(context, m_pipe[0], eSocketNotifier::Read, false);
102  sn->start();
103  }
105  {
106  close(m_pipe[0]);
107  close(m_pipe[1]);
108  }
109 };
110 #endif
111 
112 class ePythonMessagePump: public eMessagePumpMT, public sigc::trackable
113 {
115  void do_recv(int)
116  {
117  int msg;
118  recv(&msg, sizeof(msg));
119  /*emit*/ recv_msg(msg);
120  }
121 public:
123  void send(int msg)
124  {
125  eMessagePumpMT::send(&msg, sizeof(msg));
126  }
128  {
130  CONNECT(sn->activated, ePythonMessagePump::do_recv);
131  sn->start();
132  }
133  void start() { if (sn) sn->start(); }
134  void stop() { if (sn) sn->stop(); }
135 };
136 
137 #endif
A messagepump with fixed-length packets.
Definition: message.h:42
eFixedMessagePump(eMainloop *context, int mt)
Definition: message.h:84
~eFixedMessagePump()
Definition: message.h:104
void send(const T &msg)
Definition: message.h:75
sigc::signal1< void, const T & > recv_msg
Definition: message.h:74
eFixedMessagePump(eMainloop *context, int mt, const char *name)
Definition: message.h:94
Definition: elock.h:149
Definition: ebase.h:187
A generic messagepump.
Definition: message.h:21
eMessagePumpMT()
Definition: message.cpp:5
int send(const void *data, int len)
Definition: message.cpp:21
int getInputFD() const
Definition: message.h:30
virtual ~eMessagePumpMT()
Definition: message.cpp:14
int recv(void *data, int len)
Definition: message.cpp:29
int getOutputFD() const
Definition: message.h:31
Definition: message.h:113
void stop()
Definition: message.h:134
void start()
Definition: message.h:133
ePythonMessagePump()
Definition: message.h:127
PSignal1< void, int > recv_msg
Definition: message.h:122
void send(int msg)
Definition: message.h:123
Definition: elock.h:81
Definition: elock.h:133
@ Read
Definition: ebase.h:150
void start()
Definition: ebase.cpp:25
static eSocketNotifier * create(eMainloop *context, int fd, int req, bool startnow=true)
Constructs a eSocketNotifier.
Definition: ebase.h:167
void stop()
Definition: ebase.cpp:37
PSignal1< void, int > activated
Definition: ebase.h:170
eApplication * eApp
Definition: ebase.cpp:416
unsigned char data[256]
Definition: hdmi_cec.h:2
int pipe(int modus[2])
Definition: libopen.c:283
#define CONNECT(_signal, _slot)
Definition: libsig_comp.h:6
def close()
Definition: Plugins/SystemPlugins/PositionerSetup/log.py:53
eDebug("[ePicLoad] deprecated loadPic function used!!! please use the non blocking version! you can see demo code in Pictureplayer plugin... this function is removed in the near future!")
ssize_t writeAll(int fd, const void *buf, size_t count)
Definition: wrappers.cpp:242
ssize_t singleRead(int fd, void *buf, size_t count)
Definition: wrappers.cpp:58