@@ -34,13 +34,6 @@ SP<CSyncTimeline> CSyncTimeline::create(int drmFD_, CFileDescriptor&& drmSyncobj
34
34
}
35
35
36
36
CSyncTimeline::~CSyncTimeline () {
37
- for (auto & w : waiters) {
38
- if (w->source ) {
39
- wl_event_source_remove (w->source );
40
- w->source = nullptr ;
41
- }
42
- }
43
-
44
37
if (handle == 0 )
45
38
return ;
46
39
@@ -64,34 +57,8 @@ std::optional<bool> CSyncTimeline::check(uint64_t point, uint32_t flags) {
64
57
return ret == 0 ;
65
58
}
66
59
67
- static int handleWaiterFD (int fd, uint32_t mask, void * data) {
68
- auto waiter = (CSyncTimeline::SWaiter*)data;
69
-
70
- if (mask & (WL_EVENT_HANGUP | WL_EVENT_ERROR)) {
71
- Debug::log (ERR, " handleWaiterFD: eventfd error" );
72
- return 0 ;
73
- }
74
-
75
- if (mask & WL_EVENT_READABLE) {
76
- uint64_t value = 0 ;
77
- if (read (fd, &value, sizeof (value)) <= 0 )
78
- Debug::log (ERR, " handleWaiterFD: failed to read from eventfd" );
79
- }
80
-
81
- wl_event_source_remove (waiter->source );
82
- waiter->source = nullptr ;
83
-
84
- if (waiter->fn )
85
- waiter->fn ();
86
-
87
- if (waiter->timeline )
88
- waiter->timeline ->removeWaiter (waiter);
89
-
90
- return 0 ;
91
- }
92
-
93
60
bool CSyncTimeline::addWaiter (const std::function<void ()>& waiter, uint64_t point, uint32_t flags) {
94
- CFileDescriptor eventFd = CFileDescriptor{ eventfd (0 , EFD_CLOEXEC)} ;
61
+ auto eventFd = CFileDescriptor ( eventfd (0 , EFD_CLOEXEC)) ;
95
62
96
63
if (!eventFd.isValid ()) {
97
64
Debug::log (ERR, " CSyncTimeline::addWaiter: failed to acquire an eventfd" );
@@ -103,46 +70,11 @@ bool CSyncTimeline::addWaiter(const std::function<void()>& waiter, uint64_t poin
103
70
return false ;
104
71
}
105
72
106
- if (eventFd.isReadable ()) {
107
- waiter ();
108
- return true ;
109
- }
110
-
111
- auto w = makeShared<SWaiter>();
112
- w->fn = waiter;
113
- w->timeline = self;
114
- w->eventFd = std::move (eventFd);
115
-
116
- w->source = wl_event_loop_add_fd (g_pEventLoopManager->m_sWayland .loop , w->eventFd .get (), WL_EVENT_READABLE, ::handleWaiterFD, w.get ());
117
- if (!w->source ) {
118
- Debug::log (ERR, " CSyncTimeline::addWaiter: wl_event_loop_add_fd failed" );
119
- return false ;
120
- }
121
-
122
- waiters.emplace_back (w);
73
+ g_pEventLoopManager->doOnReadable (std::move (eventFd), waiter);
123
74
124
75
return true ;
125
76
}
126
77
127
- void CSyncTimeline::removeWaiter (SWaiter* w) {
128
- if (w->source ) {
129
- wl_event_source_remove (w->source );
130
- w->source = nullptr ;
131
- }
132
- std::erase_if (waiters, [w](const auto & e) { return e.get () == w; });
133
- }
134
-
135
- void CSyncTimeline::removeAllWaiters () {
136
- for (auto & w : waiters) {
137
- if (w->source ) {
138
- wl_event_source_remove (w->source );
139
- w->source = nullptr ;
140
- }
141
- }
142
-
143
- waiters.clear ();
144
- }
145
-
146
78
CFileDescriptor CSyncTimeline::exportAsSyncFileFD (uint64_t src) {
147
79
int sync = -1 ;
148
80
0 commit comments