Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 15 additions & 10 deletions src/ctrlm_main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,10 +106,11 @@ using namespace std;
#define CTRLM_RESTART_DELAY_SHORT "0"
#define CTRLM_RESTART_UPDATE_TIMEOUT (5000)

#define CTRLM_RF4CE_LEN_IR_REMOTE_USAGE 14
#define CTRLM_RF4CE_LEN_LAST_KEY_INFO sizeof(ctrlm_last_key_info)
#define CTRLM_RF4CE_LEN_SHUTDOWN_TIME 4
#define CTRLM_RF4CE_LEN_PAIRING_METRICS sizeof(ctrlm_pairing_metrics_t)
#define CTRLM_RF4CE_LEN_IR_REMOTE_USAGE 14
#define CTRLM_RF4CE_LEN_LAST_KEY_INFO sizeof(ctrlm_last_key_info)
#define CTRLM_RF4CE_LEN_SHUTDOWN_TIME_LEGACY 4
#define CTRLM_RF4CE_LEN_SHUTDOWN_TIME sizeof(time_t)
#define CTRLM_RF4CE_LEN_PAIRING_METRICS sizeof(ctrlm_pairing_metrics_t)

#define CTRLM_MAIN_QUEUE_REPEAT_DELAY (5000)

Expand Down Expand Up @@ -4446,20 +4447,24 @@ void ctrlm_discovery_remote_type_set_(const char *remote_type_str) {

void ctrlm_property_write_shutdown_time(void) {
guchar data[CTRLM_RF4CE_LEN_SHUTDOWN_TIME];
data[0] = (guchar)(g_ctrlm.shutdown_time);
data[1] = (guchar)(g_ctrlm.shutdown_time >> 8);
data[2] = (guchar)(g_ctrlm.shutdown_time >> 16);
data[3] = (guchar)(g_ctrlm.shutdown_time >> 24);
guint64 shutdown_time = (guint64)g_ctrlm.shutdown_time;
for(guchar index = 0; index < CTRLM_RF4CE_LEN_SHUTDOWN_TIME; index++) {
data[index] = (guchar)(shutdown_time >> (index * 8));
}

ctrlm_db_shutdown_time_write(data, CTRLM_RF4CE_LEN_SHUTDOWN_TIME);
}

guchar ctrlm_property_write_shutdown_time(guchar *data, guchar length) {
if(data == NULL || length != CTRLM_RF4CE_LEN_SHUTDOWN_TIME) {
if(data == NULL || (length != CTRLM_RF4CE_LEN_SHUTDOWN_TIME_LEGACY && length != CTRLM_RF4CE_LEN_SHUTDOWN_TIME)) {
XLOGD_ERROR("INVALID PARAMETERS");
return(0);
}
time_t shutdown_time = ((data[3] << 24) | (data[2] << 16) | (data[1] << 8) | data[0]);
guint64 shutdown_time_value = 0;
for(guchar index = 0; index < length; index++) {
shutdown_time_value |= ((guint64)data[index] << (index * 8));
}
time_t shutdown_time = (time_t)shutdown_time_value;

if(g_ctrlm.shutdown_time != shutdown_time) {
// Store the data
Expand Down
47 changes: 27 additions & 20 deletions src/ctrlm_network.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,13 @@

using namespace std;

static void ctrlm_network_term_hal_unref(ctrlm_network_term_hal_t *term_data) {
if(g_atomic_int_dec_and_test(&term_data->ref_count)) {
sem_destroy(&term_data->semaphore);
g_free(term_data);
}
}

void ctrlm_network_property_set(ctrlm_network_id_t network_id, ctrlm_hal_network_property_t property, void *value, guint32 length) {
// Allocate a message and send it to Control Manager's queue
ctrlm_main_queue_msg_network_property_set_t *msg = (ctrlm_main_queue_msg_network_property_set_t *)g_malloc(sizeof(ctrlm_main_queue_msg_network_property_set_t) + length);
Expand Down Expand Up @@ -74,10 +81,13 @@ ctrlm_obj_network_t::~ctrlm_obj_network_t() {
XLOGD_ERROR("Failed to allocate ctrlm_network_term_hal_t");
return;
}
sem_t semaphore;
sem_init(&semaphore, 0, 0);
if(sem_init(&term_data->semaphore, 0, 0) != 0) {
XLOGD_ERROR("Failed to initialize termination semaphore");
g_free(term_data);
return;
}

term_data->semaphore = &semaphore;
g_atomic_int_set(&term_data->ref_count, 2);
term_data->term = hal_api_term_;
term_data->hal_thread = hal_thread_;

Expand All @@ -91,7 +101,7 @@ ctrlm_obj_network_t::~ctrlm_obj_network_t() {
end_time.tv_sec += 5;
do {
errno = 0;
rc = sem_timedwait(&semaphore, &end_time);
rc = sem_timedwait(&term_data->semaphore, &end_time);
if(rc == -1 && errno == EINTR) {
XLOGD_INFO("interrupted");
} else {
Expand All @@ -102,15 +112,14 @@ ctrlm_obj_network_t::~ctrlm_obj_network_t() {

if(rc != 0) { // no response received
XLOGD_INFO("Do NOT wait for thread to exit");
g_thread_unref(thread_id);
} else {
sem_destroy(&semaphore);
// Wait for thread to exit
XLOGD_INFO("Waiting for thread to exit");
g_thread_join(thread_id);
g_thread_unref(thread_id);
XLOGD_INFO("thread exited.");
g_free(term_data);
}
ctrlm_network_term_hal_unref(term_data);
}

#ifdef CTRLM_THUNDER
Expand Down Expand Up @@ -315,23 +324,21 @@ gpointer ctrlm_obj_network_t::terminate_hal(gpointer data) {

if(NULL == term_data->term) {
XLOGD_INFO("hal_api_term_ is NULL");
return NULL;
}

ctrlm_hal_result_t res = term_data->term();
if(CTRLM_HAL_RESULT_SUCCESS != res) {
XLOGD_ERROR("HAL req term failed with code <%d>", (int)res);
} else {
XLOGD_INFO("HAL terminated successfully");
}
ctrlm_hal_result_t res = term_data->term();
if(CTRLM_HAL_RESULT_SUCCESS != res) {
XLOGD_ERROR("HAL req term failed with code <%d>", (int)res);
} else {
XLOGD_INFO("HAL terminated successfully");
}

if(CTRLM_HAL_RESULT_SUCCESS == res && term_data->hal_thread) {
g_thread_join(term_data->hal_thread);
if(CTRLM_HAL_RESULT_SUCCESS == res && term_data->hal_thread) {
g_thread_join(term_data->hal_thread);
}
}

if(term_data->semaphore) {
sem_post(term_data->semaphore);
}
sem_post(&term_data->semaphore);
ctrlm_network_term_hal_unref(term_data);
return NULL;
}

Expand Down
3 changes: 2 additions & 1 deletion src/ctrlm_network.h
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,8 @@ typedef struct {
} ctrlm_main_queue_msg_network_fw_upgrade_t;

typedef struct {
sem_t *semaphore;
gint ref_count;
sem_t semaphore;
ctrlm_hal_req_term_t term;
GThread *hal_thread;
} ctrlm_network_term_hal_t;
Expand Down
2 changes: 1 addition & 1 deletion src/voice/ctrlm_voice_obj.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -574,8 +574,8 @@ bool ctrlm_voice_t::voice_configure_config_file_json(json_t *obj_voice, json_t *
XLOGD_WARN("voice iarm settings is not the correct length, throwing away!");
} else if(voice_settings != NULL) {
this->voice_configure(voice_settings, true); // We want to write this to the database now, as this now writes to the new style DB
free(voice_settings);
}
ctrlm_db_free((guchar *)voice_settings);
}

this->set_audio_mode(&audio_settings);
Expand Down
Loading