Skip to content

Commit d642b9f

Browse files
authored
Merge pull request #3004 from geky/callback-fix-iar-typeinfo-2
callback - Fixed missing workaround for IAR issue with type information
2 parents 0ef0c61 + bac63e7 commit d642b9f

File tree

2 files changed

+31
-99
lines changed

2 files changed

+31
-99
lines changed

events/Event.h

Lines changed: 12 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -212,26 +212,15 @@ class Event<void()> {
212212
new (p) C(*(F*)(e + 1));
213213
equeue_event_delay(p, e->delay);
214214
equeue_event_period(p, e->period);
215-
equeue_event_dtor(p, &Event::function_dtor<C>);
216-
return equeue_post(e->equeue, &Event::function_call<C>, p);
215+
equeue_event_dtor(p, &EventQueue::function_dtor<C>);
216+
return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
217217
}
218218

219219
template <typename F>
220220
static void event_dtor(struct event *e) {
221221
((F*)(e + 1))->~F();
222222
}
223223

224-
// Function attributes
225-
template <typename F>
226-
static void function_call(void *p) {
227-
(*(F*)p)();
228-
}
229-
230-
template <typename F>
231-
static void function_dtor(void *p) {
232-
((F*)p)->~F();
233-
}
234-
235224
public:
236225
/** Create an event
237226
* @see Event::Event
@@ -616,26 +605,15 @@ class Event<void(A0)> {
616605
new (p) C(*(F*)(e + 1), a0);
617606
equeue_event_delay(p, e->delay);
618607
equeue_event_period(p, e->period);
619-
equeue_event_dtor(p, &Event::function_dtor<C>);
620-
return equeue_post(e->equeue, &Event::function_call<C>, p);
608+
equeue_event_dtor(p, &EventQueue::function_dtor<C>);
609+
return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
621610
}
622611

623612
template <typename F>
624613
static void event_dtor(struct event *e) {
625614
((F*)(e + 1))->~F();
626615
}
627616

628-
// Function attributes
629-
template <typename F>
630-
static void function_call(void *p) {
631-
(*(F*)p)();
632-
}
633-
634-
template <typename F>
635-
static void function_dtor(void *p) {
636-
((F*)p)->~F();
637-
}
638-
639617
public:
640618
/** Create an event
641619
* @see Event::Event
@@ -1020,26 +998,15 @@ class Event<void(A0, A1)> {
1020998
new (p) C(*(F*)(e + 1), a0, a1);
1021999
equeue_event_delay(p, e->delay);
10221000
equeue_event_period(p, e->period);
1023-
equeue_event_dtor(p, &Event::function_dtor<C>);
1024-
return equeue_post(e->equeue, &Event::function_call<C>, p);
1001+
equeue_event_dtor(p, &EventQueue::function_dtor<C>);
1002+
return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
10251003
}
10261004

10271005
template <typename F>
10281006
static void event_dtor(struct event *e) {
10291007
((F*)(e + 1))->~F();
10301008
}
10311009

1032-
// Function attributes
1033-
template <typename F>
1034-
static void function_call(void *p) {
1035-
(*(F*)p)();
1036-
}
1037-
1038-
template <typename F>
1039-
static void function_dtor(void *p) {
1040-
((F*)p)->~F();
1041-
}
1042-
10431010
public:
10441011
/** Create an event
10451012
* @see Event::Event
@@ -1424,26 +1391,15 @@ class Event<void(A0, A1, A2)> {
14241391
new (p) C(*(F*)(e + 1), a0, a1, a2);
14251392
equeue_event_delay(p, e->delay);
14261393
equeue_event_period(p, e->period);
1427-
equeue_event_dtor(p, &Event::function_dtor<C>);
1428-
return equeue_post(e->equeue, &Event::function_call<C>, p);
1394+
equeue_event_dtor(p, &EventQueue::function_dtor<C>);
1395+
return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
14291396
}
14301397

14311398
template <typename F>
14321399
static void event_dtor(struct event *e) {
14331400
((F*)(e + 1))->~F();
14341401
}
14351402

1436-
// Function attributes
1437-
template <typename F>
1438-
static void function_call(void *p) {
1439-
(*(F*)p)();
1440-
}
1441-
1442-
template <typename F>
1443-
static void function_dtor(void *p) {
1444-
((F*)p)->~F();
1445-
}
1446-
14471403
public:
14481404
/** Create an event
14491405
* @see Event::Event
@@ -1828,26 +1784,15 @@ class Event<void(A0, A1, A2, A3)> {
18281784
new (p) C(*(F*)(e + 1), a0, a1, a2, a3);
18291785
equeue_event_delay(p, e->delay);
18301786
equeue_event_period(p, e->period);
1831-
equeue_event_dtor(p, &Event::function_dtor<C>);
1832-
return equeue_post(e->equeue, &Event::function_call<C>, p);
1787+
equeue_event_dtor(p, &EventQueue::function_dtor<C>);
1788+
return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
18331789
}
18341790

18351791
template <typename F>
18361792
static void event_dtor(struct event *e) {
18371793
((F*)(e + 1))->~F();
18381794
}
18391795

1840-
// Function attributes
1841-
template <typename F>
1842-
static void function_call(void *p) {
1843-
(*(F*)p)();
1844-
}
1845-
1846-
template <typename F>
1847-
static void function_dtor(void *p) {
1848-
((F*)p)->~F();
1849-
}
1850-
18511796
public:
18521797
/** Create an event
18531798
* @see Event::Event
@@ -2232,26 +2177,15 @@ class Event<void(A0, A1, A2, A3, A4)> {
22322177
new (p) C(*(F*)(e + 1), a0, a1, a2, a3, a4);
22332178
equeue_event_delay(p, e->delay);
22342179
equeue_event_period(p, e->period);
2235-
equeue_event_dtor(p, &Event::function_dtor<C>);
2236-
return equeue_post(e->equeue, &Event::function_call<C>, p);
2180+
equeue_event_dtor(p, &EventQueue::function_dtor<C>);
2181+
return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
22372182
}
22382183

22392184
template <typename F>
22402185
static void event_dtor(struct event *e) {
22412186
((F*)(e + 1))->~F();
22422187
}
22432188

2244-
// Function attributes
2245-
template <typename F>
2246-
static void function_call(void *p) {
2247-
(*(F*)p)();
2248-
}
2249-
2250-
template <typename F>
2251-
static void function_dtor(void *p) {
2252-
((F*)p)->~F();
2253-
}
2254-
22552189
public:
22562190
/** Create an event
22572191
* @see Event::Event

events/EventQueue.h

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16+
1617
#ifndef EVENT_QUEUE_H
1718
#define EVENT_QUEUE_H
1819

@@ -173,19 +174,14 @@ class EventQueue {
173174
*/
174175
template <typename F>
175176
int call(F f) {
176-
struct local {
177-
static void call(void *p) { (*static_cast<F*>(p))(); }
178-
static void dtor(void *p) { static_cast<F*>(p)->~F(); }
179-
};
180-
181177
void *p = equeue_alloc(&_equeue, sizeof(F));
182178
if (!p) {
183179
return 0;
184180
}
185181

186182
F *e = new (p) F(f);
187-
equeue_event_dtor(e, &local::dtor);
188-
return equeue_post(&_equeue, &local::call, e);
183+
equeue_event_dtor(e, &EventQueue::function_dtor<F>);
184+
return equeue_post(&_equeue, &EventQueue::function_call<F>, e);
189185
}
190186

191187
/** Calls an event on the queue
@@ -437,20 +433,15 @@ class EventQueue {
437433
*/
438434
template <typename F>
439435
int call_in(int ms, F f) {
440-
struct local {
441-
static void call(void *p) { (*static_cast<F*>(p))(); }
442-
static void dtor(void *p) { static_cast<F*>(p)->~F(); }
443-
};
444-
445436
void *p = equeue_alloc(&_equeue, sizeof(F));
446437
if (!p) {
447438
return 0;
448439
}
449440

450441
F *e = new (p) F(f);
451442
equeue_event_delay(e, ms);
452-
equeue_event_dtor(e, &local::dtor);
453-
return equeue_post(&_equeue, &local::call, e);
443+
equeue_event_dtor(e, &EventQueue::function_dtor<F>);
444+
return equeue_post(&_equeue, &EventQueue::function_call<F>, e);
454445
}
455446

456447
/** Calls an event on the queue after a specified delay
@@ -702,11 +693,6 @@ class EventQueue {
702693
*/
703694
template <typename F>
704695
int call_every(int ms, F f) {
705-
struct local {
706-
static void call(void *p) { (*static_cast<F*>(p))(); }
707-
static void dtor(void *p) { static_cast<F*>(p)->~F(); }
708-
};
709-
710696
void *p = equeue_alloc(&_equeue, sizeof(F));
711697
if (!p) {
712698
return 0;
@@ -715,8 +701,8 @@ class EventQueue {
715701
F *e = new (p) F(f);
716702
equeue_event_delay(e, ms);
717703
equeue_event_period(e, ms);
718-
equeue_event_dtor(e, &local::dtor);
719-
return equeue_post(&_equeue, &local::call, e);
704+
equeue_event_dtor(e, &EventQueue::function_dtor<F>);
705+
return equeue_post(&_equeue, &EventQueue::function_call<F>, e);
720706
}
721707

722708
/** Calls an event on the queue periodically
@@ -2044,6 +2030,18 @@ class EventQueue {
20442030
struct equeue _equeue;
20452031
mbed::Callback<void(int)> _update;
20462032

2033+
// Function attributes
2034+
template <typename F>
2035+
static void function_call(void *p) {
2036+
(*(F*)p)();
2037+
}
2038+
2039+
template <typename F>
2040+
static void function_dtor(void *p) {
2041+
((F*)p)->~F();
2042+
}
2043+
2044+
// Context structures
20472045
template <typename F>
20482046
struct context00 {
20492047
F f;

0 commit comments

Comments
 (0)