diff --git a/wpa_supplicant-2.9/src/utils/eloop.c b/wpa_supplicant-2.9/src/utils/eloop.c index d77875f29094f6548756f161b7ee86b280d78c05..6e3fd3019cb005ba345c6048d7e57cc1a680a588 100755 --- a/wpa_supplicant-2.9/src/utils/eloop.c +++ b/wpa_supplicant-2.9/src/utils/eloop.c @@ -8,6 +8,7 @@ #include "includes.h" #include +#include #include "common.h" #include "trace.h" @@ -123,6 +124,7 @@ struct eloop_data { static struct eloop_data eloop; +static pthread_mutex_t lock; #ifdef WPA_TRACE @@ -867,15 +869,18 @@ int eloop_register_timeout(unsigned int secs, unsigned int usecs, wpa_trace_add_ref(timeout, user, user_data); wpa_trace_record(timeout); + pthread_mutex_lock(&lock); /* Maintain timeouts in order of increasing time */ dl_list_for_each(tmp, &eloop.timeout, struct eloop_timeout, list) { if (os_reltime_before(&timeout->time, &tmp->time)) { dl_list_add(tmp->list.prev, &timeout->list); (void)eloop_wakeup(); + pthread_mutex_unlock(&lock); return 0; } } dl_list_add_tail(&eloop.timeout, &timeout->list); + pthread_mutex_unlock(&lock); (void)eloop_wakeup(); return 0; @@ -884,10 +889,12 @@ int eloop_register_timeout(unsigned int secs, unsigned int usecs, static void eloop_remove_timeout(struct eloop_timeout *timeout) { + pthread_mutex_lock(&lock); dl_list_del(&timeout->list); wpa_trace_remove_ref(timeout, eloop, timeout->eloop_data); wpa_trace_remove_ref(timeout, user, timeout->user_data); os_free(timeout); + pthread_mutex_unlock(&lock); } @@ -944,14 +951,16 @@ int eloop_is_timeout_registered(eloop_timeout_handler handler, void *eloop_data, void *user_data) { struct eloop_timeout *tmp; - + pthread_mutex_lock(&lock); dl_list_for_each(tmp, &eloop.timeout, struct eloop_timeout, list) { if (tmp->handler == handler && tmp->eloop_data == eloop_data && - tmp->user_data == user_data) - return 1; + tmp->user_data == user_data) { + pthread_mutex_unlock(&lock); + return 1; + } } - + pthread_mutex_unlock(&lock); return 0; } diff --git a/wpa_supplicant-2.9_standard/src/utils/eloop.c b/wpa_supplicant-2.9_standard/src/utils/eloop.c index 0da479360303394dc8ce466ab2d75e6e8f20dd9a..e48bffc56b6f2e9ce0a1172f79c871ddf2063512 100644 --- a/wpa_supplicant-2.9_standard/src/utils/eloop.c +++ b/wpa_supplicant-2.9_standard/src/utils/eloop.c @@ -8,6 +8,7 @@ #include "includes.h" #include +#include #include "common.h" #include "trace.h" @@ -123,6 +124,7 @@ struct eloop_data { static struct eloop_data eloop; +static pthread_mutex_t lock; #ifdef WPA_TRACE @@ -871,15 +873,18 @@ int eloop_register_timeout(unsigned int secs, unsigned int usecs, wpa_trace_add_ref(timeout, user, user_data); wpa_trace_record(timeout); + pthread_mutex_lock(&lock); /* Maintain timeouts in order of increasing time */ dl_list_for_each(tmp, &eloop.timeout, struct eloop_timeout, list) { if (os_reltime_before(&timeout->time, &tmp->time)) { dl_list_add(tmp->list.prev, &timeout->list); (void)eloop_wakeup(); + pthread_mutex_unlock(&lock); return 0; } } dl_list_add_tail(&eloop.timeout, &timeout->list); + pthread_mutex_unlock(&lock); (void)eloop_wakeup(); return 0; @@ -888,10 +893,12 @@ int eloop_register_timeout(unsigned int secs, unsigned int usecs, static void eloop_remove_timeout(struct eloop_timeout *timeout) { + pthread_mutex_lock(&lock); dl_list_del(&timeout->list); wpa_trace_remove_ref(timeout, eloop, timeout->eloop_data); wpa_trace_remove_ref(timeout, user, timeout->user_data); os_free(timeout); + pthread_mutex_unlock(&lock); } @@ -948,14 +955,16 @@ int eloop_is_timeout_registered(eloop_timeout_handler handler, void *eloop_data, void *user_data) { struct eloop_timeout *tmp; - + pthread_mutex_lock(&lock); dl_list_for_each(tmp, &eloop.timeout, struct eloop_timeout, list) { if (tmp->handler == handler && tmp->eloop_data == eloop_data && - tmp->user_data == user_data) - return 1; + tmp->user_data == user_data) { + pthread_mutex_unlock(&lock); + return 1; + } } - + pthread_mutex_unlock(&lock); return 0; }