Content API: Avoid content message copy in content user callback.

This commit is contained in:
Michael Drake 2017-08-26 16:38:18 +01:00
parent d70beb28db
commit e94fe1632e
4 changed files with 45 additions and 20 deletions

View File

@ -643,9 +643,13 @@ bool content_scaled_redraw(struct hlcache_handle *h,
* called with the content.
*/
bool content_add_user(struct content *c,
void (*callback)(struct content *c, content_msg msg,
union content_msg_data data, void *pw),
bool content_add_user(
struct content *c,
void (*callback)(
struct content *c,
content_msg msg,
const union content_msg_data *data,
void *pw),
void *pw)
{
struct content_user *user;
@ -673,9 +677,13 @@ bool content_add_user(struct content *c,
* content_add_user().
*/
void content_remove_user(struct content *c,
void (*callback)(struct content *c, content_msg msg,
union content_msg_data data, void *pw),
void content_remove_user(
struct content *c,
void (*callback)(
struct content *c,
content_msg msg,
const union content_msg_data *data,
void *pw),
void *pw)
{
struct content_user *user, *next;
@ -753,17 +761,13 @@ void content_broadcast(struct content *c, content_msg msg,
const union content_msg_data *data)
{
struct content_user *user, *next;
union content_msg_data d = { 0 };
assert(c);
if (data != NULL) {
d = *data;
}
// LOG("%p -> msg:%d", c, msg);
for (user = c->user_list->next; user != 0; user = next) {
next = user->next; /* user may be destroyed during callback */
if (user->callback != 0)
user->callback(c, msg, d, user->pw);
user->callback(c, msg, data, user->pw);
}
}
@ -779,8 +783,10 @@ void content_broadcast_errorcode(struct content *c, nserror errorcode)
for (user = c->user_list->next; user != 0; user = next) {
next = user->next; /* user may be destroyed during callback */
if (user->callback != 0)
user->callback(c, CONTENT_MSG_ERRORCODE, data, user->pw);
if (user->callback != 0) {
user->callback(c, CONTENT_MSG_ERRORCODE,
&data, user->pw);
}
}
}

View File

@ -200,10 +200,24 @@ union content_msg_data {
void content_destroy(struct content *c);
bool content_add_user(struct content *h, void (*callback)(struct content *c, content_msg msg, union content_msg_data data, void *pw), void *pw);
bool content_add_user(
struct content *h,
void (*callback)(
struct content *c,
content_msg msg,
const union content_msg_data *data,
void *pw),
void *pw);
void content_remove_user(struct content *c, void (*callback)(struct content *c, content_msg msg, union content_msg_data data, void *pw), void *pw);
void content_remove_user(
struct content *c,
void (*callback)(
struct content *c,
content_msg msg,
const union content_msg_data *data,
void *pw),
void *pw);
uint32_t content_count_users(struct content *c);

View File

@ -92,8 +92,11 @@ struct content_handler {
/** Linked list of users of a content. */
struct content_user
{
void (*callback)(struct content *c, content_msg msg,
union content_msg_data data, void *pw);
void (*callback)(
struct content *c,
content_msg msg,
const union content_msg_data *data,
void *pw);
void *pw;
struct content_user *next;

View File

@ -179,14 +179,16 @@ static bool hlcache_type_is_acceptable(lwc_string *mime_type,
* \param pw Pointer to private data (hlcache_handle)
*/
static void hlcache_content_callback(struct content *c, content_msg msg,
union content_msg_data data, void *pw)
const union content_msg_data *data, void *pw)
{
hlcache_handle *handle = pw;
hlcache_event event;
hlcache_event event = { 0 };
nserror error = NSERROR_OK;
event.type = msg;
event.data = data;
if (data != NULL) {
event.data = *data;
}
if (handle->cb != NULL)
error = handle->cb(handle, &event, handle->pw);