From fc3242089e5be3c7615608ae83f8e09790a3c1a4 Mon Sep 17 00:00:00 2001 From: Tuka Martin Date: Wed, 7 Mar 2012 23:05:41 +0100 Subject: [PATCH] Added mutex to ensure atomicity of linked list operations --- src/fwp/fwp/mngr/fwp_admctrl.c | 9 ++++----- src/fwp/fwp/mngr/fwp_admctrl.h | 1 + src/fwp/fwp/mngr/fwp_mngr.c | 4 ++++ src/fwp/fwp/mngr/test/fwp_adm_test.c | 2 ++ src/fwp/fwp/mngr/wifi_agent.c | 6 +++++- 5 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/fwp/fwp/mngr/fwp_admctrl.c b/src/fwp/fwp/mngr/fwp_admctrl.c index 6d62e6a2..e56bb420 100644 --- a/src/fwp/fwp/mngr/fwp_admctrl.c +++ b/src/fwp/fwp/mngr/fwp_admctrl.c @@ -156,12 +156,10 @@ int fwp_admctrl_utilization(struct fres_sa_scenario *scenario, void *priv, struct fres_sa_contract *c; long int period_usec; fres_block_fwp_sched *fwp_sched; - size_t bytes; long int duration_usec, tmp_usec; int fragments; int ac = FWP_AC_VO; - fwp_sta_t *sta; fres_sa_scenario_for_each_no_cancel_contract(scenario, c) { @@ -171,9 +169,10 @@ int fwp_admctrl_utilization(struct fres_sa_scenario *scenario, void *priv, fres_contract_id_to_string(id, &c->contract->id, sizeof(id)); basic = fres_contract_get_basic(c->contract); fwp_block = fres_contract_get_block(c->contract, FRES_BLOCK_FWP); - + if(fwp_block != NULL){ //from list of all stations choose the one which has requested mac address + pthread_mutex_lock( &pr->mutex ); ul_list_for_each(sta_list, &pr->sta_list, sta){ //if there's a requested mac address in node if(sta->client_mac_addr == fwp_block->mac_address){ @@ -181,8 +180,9 @@ int fwp_admctrl_utilization(struct fres_sa_scenario *scenario, void *priv, break; } } + pthread_mutex_unlock( &pr->mutex ); + } - frsh_network_budget_to_bytes(FRSH_NETPF_FWP,&basic->budget,&bytes); ul_logmsg("processing: id=%s, period=%ld ms, budget=%lu bytes\n", id, @@ -190,7 +190,6 @@ int fwp_admctrl_utilization(struct fres_sa_scenario *scenario, void *priv, (long unsigned int)bytes); period_usec = basic ? fosa_rel_time_to_msec(basic->period)*1000 : 0; - /* Calculate protocol overhead */ fragments = (bytes + MTU - 1) / MTU; diff --git a/src/fwp/fwp/mngr/fwp_admctrl.h b/src/fwp/fwp/mngr/fwp_admctrl.h index 6f80c661..0703fb96 100644 --- a/src/fwp/fwp/mngr/fwp_admctrl.h +++ b/src/fwp/fwp/mngr/fwp_admctrl.h @@ -70,6 +70,7 @@ struct frm_fwp_priv { bool short_preamble; bool bypass; fwp_sta_list_t sta_list; + pthread_mutex_t mutex; }; UL_LIST_CUST_DEC(sta_list, /* cust_prefix */ diff --git a/src/fwp/fwp/mngr/fwp_mngr.c b/src/fwp/fwp/mngr/fwp_mngr.c index 857d8d2d..dd7b0887 100644 --- a/src/fwp/fwp/mngr/fwp_mngr.c +++ b/src/fwp/fwp/mngr/fwp_mngr.c @@ -57,6 +57,7 @@ #include "wifi_agent_idl.h" #include "fwp_admctrl.h" #include "wifi_agent.h" +#include #if 0 static @@ -202,6 +203,8 @@ int main(int argc, char *argv[]) // Initialize head of linked list sta_list_init_head(&frm_fwp_state.sta_list); + + pthread_mutex_init(&frm_fwp_state.mutex, NULL); //create executors and register 2 interfaces ret = forb_executor_init(&executor_wai); @@ -242,3 +245,4 @@ error: return 0; } + diff --git a/src/fwp/fwp/mngr/test/fwp_adm_test.c b/src/fwp/fwp/mngr/test/fwp_adm_test.c index 937f76f6..260f71c8 100644 --- a/src/fwp/fwp/mngr/test/fwp_adm_test.c +++ b/src/fwp/fwp/mngr/test/fwp_adm_test.c @@ -39,12 +39,14 @@ struct frm_fwp_priv { bool short_preamble; bool bypass; fwp_sta_list_t sta_list; + pthread_mutex_t mutex; }; struct frm_fwp_priv priv = { .rate_mbps = 1, .erp_ofdm = false, .short_preamble = false, + .mutex = PTHREAD_MUTEX_INITIALIZER, // .list_head = NULL,//head of linked list initialized in main function }; diff --git a/src/fwp/fwp/mngr/wifi_agent.c b/src/fwp/fwp/mngr/wifi_agent.c index ce1f4d98..4fd489a8 100644 --- a/src/fwp/fwp/mngr/wifi_agent.c +++ b/src/fwp/fwp/mngr/wifi_agent.c @@ -50,7 +50,7 @@ void wifi_agent_idl_print_state(wifi_agent_idl _obj, CORBA_Environment *ev) */ CORBA_long wifi_agent_idl_add(wifi_agent_idl _obj, const CORBA_long rate, const CORBA_long_long client_mac_addr, CORBA_Environment *ev) { - + struct frm_fwp_priv *frm_fwp_state = forb_instance_data(_obj); fwp_sta_t *sta; fwp_sta_t *new_to_add; @@ -60,7 +60,9 @@ CORBA_long wifi_agent_idl_add(wifi_agent_idl _obj, const CORBA_long rate, const /*client was sending info before*/ if(sta->client_mac_addr == client_mac_addr) { /*mac address is the same change only rate*/ + pthread_mutex_lock( &frm_fwp_state->mutex ); sta->rate = rate; + pthread_mutex_unlock( &frm_fwp_state->mutex ); return 0; } } @@ -68,7 +70,9 @@ CORBA_long wifi_agent_idl_add(wifi_agent_idl _obj, const CORBA_long rate, const /*client was not sending info yet*/ new_to_add->rate = rate; new_to_add->client_mac_addr = client_mac_addr; + pthread_mutex_lock( &frm_fwp_state->mutex ); sta_list_ins_tail(&frm_fwp_state->sta_list, new_to_add); + pthread_mutex_unlock( &frm_fwp_state->mutex ); return 0; } -- 2.39.2