diff --git a/src/driver/lcd4l.cpp b/src/driver/lcd4l.cpp index a749fe863..ec88778d4 100644 --- a/src/driver/lcd4l.cpp +++ b/src/driver/lcd4l.cpp @@ -31,7 +31,7 @@ #include #endif -#include + #include #include #include @@ -44,7 +44,7 @@ #include #include - +#include #include #include #include @@ -68,7 +68,7 @@ extern CPictureViewer *g_PicViewer; #define LCD_ICONSDIR TARGET_PREFIX "/share/lcd/icons/" #define ICONSEXT ".png" -#define LOGO_DUMMY ICONSDIR "/blank.png" +#define LOGO_DUMMY ICONSDIR "blank.png" #define BRIGHTNESS LCD_DATADIR "brightness" #define BRIGHTNESS_STANDBY LCD_DATADIR "brightness_standby" @@ -154,8 +154,13 @@ static void lcd4linux(bool run) } else { - if (my_system(3, "killall", "-9", buf) != 0) - printf("[CLCD4l] %s: terminating '%s' failed\n", __FUNCTION__, buf); + if (file_exists(PIDFILE)) + { + if (my_system(3, "killall", "-9", buf) != 0) + printf("[CLCD4l] %s: terminating '%s' failed\n", __FUNCTION__, buf); + } + else + dprintf(DEBUG_NORMAL,"\033[33m[CLCD4l] [%s - %d] %s is not running \033[0m\n", __func__, __LINE__); } } @@ -163,14 +168,17 @@ static void lcd4linux(bool run) CLCD4l::CLCD4l() { - thrLCD4l = 0; + thrLCD4l = NULL; + exit_proc = false; } CLCD4l::~CLCD4l() { + exit_proc = true; if (thrLCD4l) - pthread_cancel(thrLCD4l); - thrLCD4l = 0; + thrLCD4l->join(); + delete thrLCD4l; + thrLCD4l = NULL; } /* ----------------------------------------------------------------- */ @@ -179,32 +187,39 @@ void CLCD4l::InitLCD4l() { if (thrLCD4l) { - printf("[CLCD4l] %s: initializing\n", __FUNCTION__); + dprintf(DEBUG_NORMAL,"\033[32m[CLCD4l] [%s - %d] initializing %d \033[0m\n", __func__, __LINE__); Init(); } } void CLCD4l::StartLCD4l() { - if (!thrLCD4l && (g_settings.lcd4l_support == 1 || g_settings.lcd4l_support == 2)) + if (!thrLCD4l && g_settings.lcd4l_support) { - printf("[CLCD4l] %s: starting thread\n", __FUNCTION__); - pthread_create(&thrLCD4l, NULL, LCD4lProc, (void*) this); - pthread_detach(thrLCD4l); - lcd4linux(true); + dprintf(DEBUG_NORMAL,"\033[32m[CLCD4l] [%s - %d] starting thread with mode %d \033[0m\n", __func__, __LINE__, g_settings.lcd4l_support); + + exit_proc = false; + thrLCD4l = new std::thread (LCD4lProc, this); + dprintf(DEBUG_NORMAL,"\033[32m[CLCD4l] [%s - %d] thread [%p] is running\033[0m\n", __func__, __LINE__, thrLCD4l); } - if (g_settings.lcd4l_support) - exec_initscript("lcd4linux", "start"); + lcd4linux(true); + exec_initscript("lcd4linux", "start"); } void CLCD4l::StopLCD4l() { if (thrLCD4l) { - printf("[CLCD4l] %s: stopping thread\n", __FUNCTION__); - pthread_cancel(thrLCD4l); - thrLCD4l = 0; + dprintf(DEBUG_NORMAL,"\033[32m[CLCD4l] [%s - %d] stopping thread [%p]\033[0m\n", __func__, __LINE__, thrLCD4l); + lcd4linux(false); + exit_proc = true; + thrLCD4l->join(); + dprintf(DEBUG_NORMAL,"\033[32m[CLCD4l] [%s - %d] thread [%p] joined\033[0m\n", __func__, __LINE__, thrLCD4l); + + delete thrLCD4l; + thrLCD4l = NULL; + dprintf(DEBUG_NORMAL,"\033[32m[CLCD4l] [%s - %d] thread [%p] terminated\033[0m\n", __func__, __LINE__, thrLCD4l); } exec_initscript("lcd4linux", "stop"); } @@ -322,9 +337,6 @@ void CLCD4l::Init() void* CLCD4l::LCD4lProc(void* arg) { - pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, 0); - pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0); - CLCD4l *PLCD4l = static_cast(arg); PLCD4l->Init(); @@ -336,7 +348,7 @@ void* CLCD4l::LCD4lProc(void* arg) bool NewParseID = false; //printf("[CLCD4l] %s: starting loop\n", __FUNCTION__); - while(1) + while(!PLCD4l->exit_proc) { if ( (!access(PIDFILE, F_OK) == 0) && (!FirstRun) ) { diff --git a/src/driver/lcd4l.h b/src/driver/lcd4l.h index 607ec5343..fb9d492d6 100644 --- a/src/driver/lcd4l.h +++ b/src/driver/lcd4l.h @@ -31,6 +31,7 @@ #define __lcd4l__ #include +#include class CLCD4l { @@ -66,8 +67,9 @@ class CLCD4l void ResetParseID() { m_ParseID = 0; } private: - pthread_t thrLCD4l; + std::thread *thrLCD4l; static void* LCD4lProc(void *arg); + bool exit_proc; struct tm *tm_struct; bool wait4daemon;