Skip to content

Commit 31ed8a4

Browse files
committed
improve ada callback, return false if there is not enough memory.
1 parent e57a039 commit 31ed8a4

File tree

2 files changed

+17
-14
lines changed

2 files changed

+17
-14
lines changed

cores/nRF5/utility/AdaCallback.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,16 +105,23 @@ void ada_callback_queue(ada_callback_t* cb_item)
105105
}
106106
}
107107

108-
void ada_callback_invoke(const void* malloc_data, uint32_t malloc_len, const void* func, uint32_t arguments[], uint8_t argcount)
108+
bool ada_callback_invoke(const void* malloc_data, uint32_t malloc_len, const void* func, uint32_t arguments[], uint8_t argcount)
109109
{
110110
ada_callback_t* cb_data = (ada_callback_t*) rtos_malloc( sizeof(ada_callback_t) + (argcount ? (argcount-1)*4 : 0) );
111+
VERIFY(cb_data);
112+
111113
cb_data->malloced_data = NULL;
112114
cb_data->callback_func = func;
113115
cb_data->arg_count = argcount;
114116

115117
if ( malloc_data && malloc_len )
116118
{
117119
cb_data->malloced_data = rtos_malloc(malloc_len);
120+
if ( !cb_data->malloced_data )
121+
{
122+
rtos_free(cb_data);
123+
return false;
124+
}
118125
memcpy(cb_data->malloced_data, malloc_data, malloc_len);
119126
}
120127

@@ -133,6 +140,8 @@ void ada_callback_invoke(const void* malloc_data, uint32_t malloc_len, const voi
133140
}
134141

135142
ada_callback_queue(cb_data);
143+
144+
return true;
136145
}
137146

138147
void ada_callback_init(uint32_t stack_sz)

cores/nRF5/utility/AdaCallback.h

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -81,16 +81,6 @@ typedef void (*adacb_5arg_t) (uint32_t, uint32_t, uint32_t, uint32_t, uint32_t);
8181

8282
#define _ADA_CB_ARGS(...) _GET_6TH_ARG(_0, ##__VA_ARGS__, _ADA_CB_ARGS_5, _ADA_CB_ARGS_4, _ADA_CB_ARGS_3, _ADA_CB_ARGS_2, _ADA_CB_ARGS_1, _ADA_CB_ARGS_0)(__VA_ARGS__)
8383

84-
/**
85-
* Macro function is called by other module with all intended parameters.
86-
*/
87-
#define _cb_setup(_malloc_data, _malloc_len, _func, ... ) \
88-
do { \
89-
uint8_t const _count = VA_ARGS_NUM(__VA_ARGS__); \
90-
uint32_t arguments[] = { _ADA_CB_ARGS(__VA_ARGS__) }; \
91-
ada_callback_invoke(_malloc_data, _malloc_len, (void const*) _func, arguments, _count); \
92-
} while(0)
93-
9484
/**
9585
* Schedule an function and parameters to be invoked in Ada Callback Task
9686
* Macro can take at least 2 and at max 7 arguments
@@ -100,11 +90,15 @@ typedef void (*adacb_5arg_t) (uint32_t, uint32_t, uint32_t, uint32_t, uint32_t);
10090
* - 3rd arg : function to be invoked
10191
* - 3rd-7th arg : function argument, will be cast to uint32_t
10292
*/
103-
#define ada_callback(...) _cb_setup(__VA_ARGS__)
104-
93+
#define ada_callback(_malloc_data, _malloc_len, _func, ... ) \
94+
({ \
95+
uint8_t const _count = VA_ARGS_NUM(__VA_ARGS__); \
96+
uint32_t arguments[] = { _ADA_CB_ARGS(__VA_ARGS__) }; \
97+
ada_callback_invoke(_malloc_data, _malloc_len, (void const*) _func, arguments, _count); \
98+
})
10599

106100
void ada_callback_init(uint32_t stack_sz);
107-
void ada_callback_invoke(const void* mdata, uint32_t mlen, const void* func, uint32_t arguments[], uint8_t argcount);
101+
bool ada_callback_invoke(const void* mdata, uint32_t mlen, const void* func, uint32_t arguments[], uint8_t argcount);
108102
void ada_callback_queue(ada_callback_t* cb_item);
109103
bool ada_callback_queue_resize(uint32_t new_depth);
110104

0 commit comments

Comments
 (0)