1. demux
#@h=tangler('tmp/flx_demux_config.hpp')
#@select(h)
#// This is a fake flx_demux_config.h to be used at config time, before
#// the rtl proper exists. It contains just enough info to compile
#// a few of the demuxers.
##define DEMUX_EXTERN
Start cpp section to rtl/flx_demux_config.hpp[1
/1
]
1: #line 11 "./lpsrc/flx_demux.pak"
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Start cpp section to demux/flx_demux.hpp[1
/1
]
1: #line 24 "./lpsrc/flx_demux.pak"
2:
3:
4:
5:
6:
7:
8:
9: namespace flx { namespace demux {
10: typedef iocp_demuxer flx_demuxer_t;
11: }}
12:
13:
14: namespace flx { namespace demux {
15: typedef kqueue_demuxer flx_demuxer_t;
16: }}
17:
18:
19: namespace flx { namespace demux {
20: typedef evtport_demuxer flx_demuxer_t;
21: }}
22:
23:
24: namespace flx { namespace demux {
25: typedef epoll_demuxer flx_demuxer_t;
26: }}
27:
28:
29:
30:
31: namespace flx { namespace demux {
32: typedef ts_poll_demuxer flx_demuxer_t;
33: }}
34:
35:
36: namespace flx { namespace demux {
37: typedef ts_select_demuxer flx_demuxer_t;
38: }}
39:
40:
41:
42: namespace flx { namespace demux {
43: DEMUX_EXTERN flx_demuxer_t * make_std_demuxer();
44: }}
45:
46:
47:
Start cpp section to demux/flx_demux.cpp[1
/1
]
1: #line 72 "./lpsrc/flx_demux.pak"
2:
3:
4:
5:
6: namespace flx { namespace demux {
7:
8:
9: static void
10: pthread_thread(void* udat)
11: {
12: demuxer* d = (demuxer*)udat;
13:
14: while(1)
15: {
16:
17: d->wait();
18:
19: demux_quit_flag* f = d->get_quit_flag();
20: if(f)
21: {
22:
23:
24:
25:
26: f->signal_true();
27:
28:
29:
30: break;
31: }
32: }
33:
34:
35: }
36:
37: flx_demuxer_t *
38: make_std_demuxer()
39: {
40: flx_demuxer_t *d = new flx_demuxer_t();
41: pthread::flx_thread_t ethread;
42: if(ethread.init(pthread_thread, d) == -1)
43: {
44: fprintf(stderr,"Proto_async thread init failure\n");
45: exit(1);
46: }
47: return d;
48: }
49: }}
50:
Start felix section to lib/flx_demux.flx[1
/1
]
1: #line 123 "./lpsrc/flx_demux.pak"
2: module Demux
3: {
4: type demuxer = "flx::demux::flx_demuxer_t*"
5: requires header '#include "flx_demux.hpp"'
6: ;
7: gen mk_sys_demux: 1->demuxer = "flx::demux::make_std_demuxer()";
8: val sys_demux = mk_sys_demux();
9: }
10:
Start cpp section to demux/demux_demuxer.hpp[1
/1
]
1: #line 134 "./lpsrc/flx_demux.pak"
2:
3:
4:
5:
6: namespace flx { namespace demux {
7:
8: struct sel_param {
9: char* buffer;
10: long buffer_size;
11: long bytes_written;
12:
13: bool finished() { return bytes_written == buffer_size; }
14: };
15:
16:
17:
18: enum { PDEMUX_READ = 1, PDEMUX_WRITE = 2, PDEMUX_EOF=4, PDEMUX_ERROR=8 };
19:
20:
21:
22: class DEMUX_EXTERN demux_quit_flag
23: {
24: public:
25: virtual void signal_true() = 0;
26: virtual ~demux_quit_flag() {}
27: };
28:
29:
30:
31:
32: class DEMUX_EXTERN demuxer {
33: protected:
34:
35:
36:
37:
38: virtual void get_evts(bool poll) = 0;
39:
40:
41:
42: demux_quit_flag* quit_flag;
43: public:
44: demuxer() : quit_flag(0) {}
45: virtual ~demuxer() {}
46:
47: void wait() { get_evts(false); }
48: void poll() { get_evts(true); }
49:
50:
51:
52:
53: virtual demux_quit_flag* get_quit_flag() { return quit_flag; }
54: virtual void set_quit_flag(demux_quit_flag* f) { quit_flag = f; }
55: };
56:
57:
58:
59:
60:
61: class DEMUX_EXTERN demux_callback {
62: public:
63: virtual void callback(demuxer* d) = 0;
64: virtual ~demux_callback() {}
65: };
66:
67: }}
68:
69:
Start cpp section to demux/demux_timer_queue.hpp[1
/1
]
1: #line 204 "./lpsrc/flx_demux.pak"
2:
3:
4:
5:
6:
7: namespace flx { namespace demux {
8:
9:
10:
11:
12:
13:
14: class DEMUX_EXTERN sleep_task
15: {
16: public:
17: virtual ~sleep_task() {}
18:
19: virtual void fire() = 0;
20: };
21:
22: class DEMUX_EXTERN timer_queue
23: {
24: public:
25: virtual ~timer_queue() {}
26:
27: virtual void add_sleep_request(sleep_task* st, double delta) = 0;
28: virtual void add_abs_sleep_request(sleep_task* st, double when) = 0;
29:
30:
31:
32: static void get_time(double& t);
33: };
34:
35: DEMUX_EXTERN timer_queue *mk_timer_queue();
36:
37: }}
38:
39:
40:
Start cpp section to demux/demux_demuxer.cpp[1
/1
]
1: #line 245 "./lpsrc/flx_demux.pak"
2:
3:
4:
5:
Start cpp section to demux/demux_quitter.hpp[1
/1
]
1: #line 251 "./lpsrc/flx_demux.pak"
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17: namespace flx { namespace demux {
18:
19:
20: class DEMUX_EXTERN demux_quitter
21: : public demux_callback, public demux_quit_flag {
22:
23: #if FLX_WIN32
24: wself_piper sp;
25: #else
26: self_piper sp;
27: #endif
28: pthread::waitable_bool finished;
29: void callback(demuxer* demux);
30: virtual void signal_true();
31: public:
32: void quit(demuxer* demux);
33: };
34:
35: } }
36:
37:
38:
Start cpp section to demux/demux_quitter.cpp[1
/1
]
1: #line 290 "./lpsrc/flx_demux.pak"
2:
3:
4:
5: namespace flx { namespace demux {
6:
7:
8:
9:
10:
11:
12:
13:
14:
15: void
16: demux_quitter::callback(demuxer* demux)
17: {
18:
19: demux->set_quit_flag(this);
20: }
21:
22:
23:
24:
25:
26: void
27: demux_quitter::signal_true()
28: {
29: finished.signal_true();
30:
31:
32: }
33:
34: void
35: demux_quitter::quit(demuxer* demux)
36: {
37:
38:
39: sp.install(demux, this);
40:
41: sp.wake();
42:
43: finished.wait_until_true();
44:
45: }
46:
47: } }
48:
1.1. OS specific demux codes