add mutex in critical section

This commit is contained in:
Chen Han
2019-10-30 16:39:35 +08:00
parent 4080ef371c
commit a58895f50c

View File

@@ -81,18 +81,24 @@ interrupt_manager _int_manager={
}; };
static uint64_t tick_ms = 0; static uint64_t tick_ms = 0;
static pthread_t main_thread_id;
static pthread_mutex_t cpsr_mutex;
#define CHECK_IS_MAIN_THREAD(main_thread_id) \
if(main_thread_id != pthread_self()) return
__PORT__ void port_int_disable(void) __PORT__ void port_int_disable(void)
{ {
sigset_t signal_mask,*manager_mask=NULL; sigset_t signal_mask,*manager_mask=NULL;
if(_int_manager.count == 0){ if(_int_manager.count == 0){
pthread_mutex_lock(&cpsr_mutex);
manager_mask = &(_int_manager.signal_mask); manager_mask = &(_int_manager.signal_mask);
}
_int_manager.count ++;
sigfillset(&signal_mask); sigfillset(&signal_mask);
_filter_signal(&signal_mask); _filter_signal(&signal_mask);
pthread_sigmask(SIG_BLOCK,&signal_mask,manager_mask); pthread_sigmask(SIG_BLOCK,&signal_mask,manager_mask);
} }
_int_manager.count ++;
}
__PORT__ void port_int_enable(void) __PORT__ void port_int_enable(void)
{ {
@@ -102,6 +108,7 @@ __PORT__ void port_int_enable(void)
if(_int_manager.count == 0){ if(_int_manager.count == 0){
sigaddset(&(_int_manager.signal_mask),SIG_RESUME); //ensure SIG_RESUME is blocked sigaddset(&(_int_manager.signal_mask),SIG_RESUME); //ensure SIG_RESUME is blocked
_filter_signal(&(_int_manager.signal_mask)); _filter_signal(&(_int_manager.signal_mask));
pthread_mutex_unlock(&cpsr_mutex);
pthread_sigmask(SIG_SETMASK,&(_int_manager.signal_mask),NULL); pthread_sigmask(SIG_SETMASK,&(_int_manager.signal_mask),NULL);
} }
} }
@@ -126,6 +133,8 @@ __PORT__ pthread_t port_create_thread(void *arg)
__PORT__ void port_sched_start(void) __PORT__ void port_sched_start(void)
{ {
main_thread_id = pthread_self();
pthread_mutex_init(&cpsr_mutex,NULL);
_install_signal(SIG_SUSPEND, _handle_suspend_thread); _install_signal(SIG_SUSPEND, _handle_suspend_thread);
_install_signal(SIG_RESUME, _handle_resume_thread); _install_signal(SIG_RESUME, _handle_resume_thread);
_install_signal(SIG_CONTEXT_SWITCH, _handle_context_switch); _install_signal(SIG_CONTEXT_SWITCH, _handle_context_switch);
@@ -224,6 +233,7 @@ __PORT__ void _install_signal(int sig,void (*func)(int))
__PORT__ void _handle_tick_signal() __PORT__ void _handle_tick_signal()
{ {
CHECK_IS_MAIN_THREAD(main_thread_id);
tick_ms ++; tick_ms ++;
if(tos_knl_is_running()) { if(tos_knl_is_running()) {
tos_knl_irq_enter(); tos_knl_irq_enter();