forked from enlightenment/efl
eina_debug: make shutdown perform cleanups and kill the timer thread
this should not remain active after eina has been deactivated, so ensure that everything stops as expected ref T7019 Differential Revision: https://phab.enlightenment.org/D6306
This commit is contained in:
parent
9d2d1a2677
commit
bd9edfad00
|
@ -98,9 +98,6 @@
|
||||||
// and if that day comes
|
// and if that day comes
|
||||||
Eina_Spinlock _eina_debug_lock;
|
Eina_Spinlock _eina_debug_lock;
|
||||||
|
|
||||||
// only init once
|
|
||||||
static Eina_Bool _inited = EINA_FALSE;
|
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
extern char *__progname;
|
extern char *__progname;
|
||||||
#endif
|
#endif
|
||||||
|
@ -110,6 +107,8 @@ extern Eina_Bool eina_mempool_init(void);
|
||||||
extern Eina_Bool eina_list_init(void);
|
extern Eina_Bool eina_list_init(void);
|
||||||
|
|
||||||
extern Eina_Spinlock _eina_debug_thread_lock;
|
extern Eina_Spinlock _eina_debug_thread_lock;
|
||||||
|
static Eina_Spinlock _thread_delete_lock;
|
||||||
|
static Eina_List *sessions;
|
||||||
|
|
||||||
static Eina_Bool _debug_disabled = EINA_FALSE;
|
static Eina_Bool _debug_disabled = EINA_FALSE;
|
||||||
|
|
||||||
|
@ -208,9 +207,8 @@ _packet_receive(Eina_Debug_Session *session, unsigned char **buffer)
|
||||||
int rret = -1;
|
int rret = -1;
|
||||||
unsigned int size = 0;
|
unsigned int size = 0;
|
||||||
|
|
||||||
if (!session) goto end;
|
rret = read(session->fd, &size, 4);
|
||||||
|
if (rret == 4)
|
||||||
if ((rret = read(session->fd, &size, 4)) == 4)
|
|
||||||
{
|
{
|
||||||
size = SWAP_32(size);
|
size = SWAP_32(size);
|
||||||
if (size > EINA_DEBUG_MAX_PACKET_SIZE)
|
if (size > EINA_DEBUG_MAX_PACKET_SIZE)
|
||||||
|
@ -453,6 +451,9 @@ _session_create(int fd)
|
||||||
if (!session) return NULL;
|
if (!session) return NULL;
|
||||||
session->dispatch_cb = eina_debug_dispatch;
|
session->dispatch_cb = eina_debug_dispatch;
|
||||||
session->fd = fd;
|
session->fd = fd;
|
||||||
|
eina_spinlock_take(&_thread_delete_lock);
|
||||||
|
sessions = eina_list_append(sessions, session);
|
||||||
|
eina_spinlock_release(&_thread_delete_lock);
|
||||||
// start the monitor thread
|
// start the monitor thread
|
||||||
_thread_start(session);
|
_thread_start(session);
|
||||||
return session;
|
return session;
|
||||||
|
@ -562,7 +563,7 @@ _monitor(void *_data)
|
||||||
// sit forever processing commands or timeouts in the debug monitor
|
// sit forever processing commands or timeouts in the debug monitor
|
||||||
// thread - this is separate to the rest of the app so it shouldn't
|
// thread - this is separate to the rest of the app so it shouldn't
|
||||||
// impact the application specifically
|
// impact the application specifically
|
||||||
for (;session;)
|
while (1)
|
||||||
{
|
{
|
||||||
unsigned char *buffer = NULL;
|
unsigned char *buffer = NULL;
|
||||||
int size;
|
int size;
|
||||||
|
@ -587,8 +588,11 @@ _monitor(void *_data)
|
||||||
{
|
{
|
||||||
close(session->fd);
|
close(session->fd);
|
||||||
_opcodes_unregister_all(session);
|
_opcodes_unregister_all(session);
|
||||||
|
eina_spinlock_take(&_thread_delete_lock);
|
||||||
|
sessions = eina_list_remove(sessions, session);
|
||||||
free(session);
|
free(session);
|
||||||
session = NULL;
|
eina_spinlock_release(&_thread_delete_lock);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -702,20 +706,12 @@ eina_debug_init(void)
|
||||||
{
|
{
|
||||||
pthread_t self;
|
pthread_t self;
|
||||||
|
|
||||||
// if already inbitted simply release our lock that we may have locked on
|
|
||||||
// shutdown if we are re-initted again in the same process
|
|
||||||
if (_inited)
|
|
||||||
{
|
|
||||||
eina_spinlock_release(&_eina_debug_thread_lock);
|
|
||||||
return EINA_TRUE;
|
|
||||||
}
|
|
||||||
// mark as initted
|
|
||||||
_inited = EINA_TRUE;
|
|
||||||
eina_threads_init();
|
eina_threads_init();
|
||||||
// For Windows support GetModuleFileName can be used
|
// For Windows support GetModuleFileName can be used
|
||||||
// set up thread things
|
// set up thread things
|
||||||
eina_spinlock_new(&_eina_debug_lock);
|
eina_spinlock_new(&_eina_debug_lock);
|
||||||
eina_spinlock_new(&_eina_debug_thread_lock);
|
eina_spinlock_new(&_eina_debug_thread_lock);
|
||||||
|
eina_spinlock_new(&_thread_delete_lock);
|
||||||
self = pthread_self();
|
self = pthread_self();
|
||||||
_eina_debug_thread_mainloop_set(&self);
|
_eina_debug_thread_mainloop_set(&self);
|
||||||
_eina_debug_thread_add(&self);
|
_eina_debug_thread_add(&self);
|
||||||
|
@ -739,13 +735,30 @@ eina_debug_init(void)
|
||||||
Eina_Bool
|
Eina_Bool
|
||||||
eina_debug_shutdown(void)
|
eina_debug_shutdown(void)
|
||||||
{
|
{
|
||||||
|
Eina_Debug_Session *session;
|
||||||
|
Eina_List *l;
|
||||||
|
pthread_t self = pthread_self();
|
||||||
|
|
||||||
|
eina_spinlock_take(&_thread_delete_lock);
|
||||||
|
EINA_LIST_FOREACH(sessions, l, session)
|
||||||
|
eina_debug_session_terminate(session);
|
||||||
|
eina_spinlock_release(&_thread_delete_lock);
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
eina_spinlock_take(&_thread_delete_lock);
|
||||||
|
if (!sessions) break;
|
||||||
|
eina_spinlock_release(&_thread_delete_lock);
|
||||||
|
}
|
||||||
|
eina_spinlock_release(&_thread_delete_lock);
|
||||||
|
|
||||||
_eina_debug_timer_shutdown();
|
_eina_debug_timer_shutdown();
|
||||||
_eina_debug_bt_shutdown();
|
_eina_debug_bt_shutdown();
|
||||||
_eina_debug_cpu_shutdown();
|
_eina_debug_cpu_shutdown();
|
||||||
eina_spinlock_take(&_eina_debug_thread_lock);
|
_eina_debug_thread_del(&self);
|
||||||
// yes - we never free on shutdown - this is because the monitor thread
|
eina_spinlock_free(&_eina_debug_lock);
|
||||||
// never exits. this is not a leak - we intend to never free up any
|
eina_spinlock_free(&_eina_debug_thread_lock);
|
||||||
// resources here because they are allocated once only ever.
|
eina_spinlock_free(&_thread_delete_lock);
|
||||||
eina_threads_shutdown();
|
eina_threads_shutdown();
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue