diff options
Diffstat (limited to 'cras/src/server/cras_main_message.c')
-rw-r--r-- | cras/src/server/cras_main_message.c | 117 |
1 files changed, 0 insertions, 117 deletions
diff --git a/cras/src/server/cras_main_message.c b/cras/src/server/cras_main_message.c deleted file mode 100644 index b88e4000..00000000 --- a/cras/src/server/cras_main_message.c +++ /dev/null @@ -1,117 +0,0 @@ -/* Copyright 2015 The Chromium OS Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <syslog.h> - -#include "cras_main_message.h" -#include "cras_system_state.h" -#include "cras_util.h" - -/* Callback to handle specific type of main thread message. */ -struct cras_main_msg_callback { - enum CRAS_MAIN_MESSAGE_TYPE type; - cras_message_callback callback; - void *callback_data; - struct cras_main_msg_callback *prev, *next; -}; - -static int main_msg_fds[2]; -static struct cras_main_msg_callback *main_msg_callbacks; - -int cras_main_message_add_handler(enum CRAS_MAIN_MESSAGE_TYPE type, - cras_message_callback callback, - void *callback_data) -{ - struct cras_main_msg_callback *msg_cb; - - DL_FOREACH (main_msg_callbacks, msg_cb) { - if (msg_cb->type == type) { - syslog(LOG_ERR, "Main message type %u already exists", - type); - return -EEXIST; - } - } - - msg_cb = (struct cras_main_msg_callback *)calloc(1, sizeof(*msg_cb)); - msg_cb->type = type; - msg_cb->callback = callback; - msg_cb->callback_data = callback_data; - - DL_APPEND(main_msg_callbacks, msg_cb); - return 0; -} - -int cras_main_message_send(struct cras_main_message *msg) -{ - int err; - - err = write(main_msg_fds[1], msg, msg->length); - if (err < 0) { - syslog(LOG_ERR, "Failed to send main message, type %u", - msg->type); - return err; - } - return 0; -} - -static int read_main_message(int msg_fd, uint8_t *buf, size_t max_len) -{ - int to_read, nread, rc; - struct cras_main_message *msg = (struct cras_main_message *)buf; - - nread = read(msg_fd, buf, sizeof(msg->length)); - if (nread < 0) - return nread; - if (msg->length > max_len) - return -ENOMEM; - - to_read = msg->length - nread; - rc = read(msg_fd, &buf[0] + nread, to_read); - if (rc < 0) - return rc; - return 0; -} - -static void handle_main_messages(void *arg, int revents) -{ - uint8_t buf[256]; - int rc; - struct cras_main_msg_callback *main_msg_cb; - struct cras_main_message *msg = (struct cras_main_message *)buf; - - rc = read_main_message(main_msg_fds[0], buf, sizeof(buf)); - if (rc < 0) { - syslog(LOG_ERR, "Failed to read main message"); - return; - } - - DL_FOREACH (main_msg_callbacks, main_msg_cb) { - if (main_msg_cb->type == msg->type) { - main_msg_cb->callback(msg, main_msg_cb->callback_data); - break; - } - } -} - -void cras_main_message_init() -{ - int rc; - - rc = pipe(main_msg_fds); - if (rc < 0) { - syslog(LOG_ERR, "Fatal: main message init"); - exit(-ENOMEM); - } - - /* When full it's preferred to get error instead of blocked. */ - cras_make_fd_nonblocking(main_msg_fds[0]); - cras_make_fd_nonblocking(main_msg_fds[1]); - - cras_system_add_select_fd(main_msg_fds[0], handle_main_messages, NULL, - POLLIN); -} |