To allow this variable be updated from multiple threads. Signed-off-by: Andy Zhou <az...@ovn.org> --- ovsdb/jsonrpc-server.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/ovsdb/jsonrpc-server.c b/ovsdb/jsonrpc-server.c index 63788ec..5a323e0 100644 --- a/ovsdb/jsonrpc-server.c +++ b/ovsdb/jsonrpc-server.c @@ -124,7 +124,7 @@ static void sessions_thread_exit(struct sessions_thread *); struct ovsdb_jsonrpc_server { struct ovsdb_server up; - unsigned int n_sessions; + atomic_count n_sessions; /* Can be updated from multiple threads */ struct shash remotes; /* Contains "struct ovsdb_jsonrpc_remote *"s. */ struct ovs_list all_sessions; /* All 'ovsdb_jsonrpc_session's managed by the main process. Those are sessions @@ -441,16 +441,23 @@ void ovsdb_jsonrpc_server_get_memory_usage(const struct ovsdb_jsonrpc_server *svr, struct simap *usage) { - simap_increase(usage, "sessions", svr->n_sessions); + unsigned int n_sessions; + + /* atomic_count_get does not take a const pointer, the cast + * is necssary. XXX */ + n_sessions = atomic_count_get((struct atomic_count *)&svr->n_sessions); + simap_increase(usage, "sessions", n_sessions); ovsdb_jsonrpc_session_get_memory_usage_all(svr, usage); } static bool ovsdb_jsonrpc_server_use_threads(struct ovsdb_jsonrpc_server *svr) { if (svr->n_active_threads != svr->n_max_threads) { + unsigned int n_sessions = atomic_count_get(&svr->n_sessions); + /* Look up the number of sessions to decide if there is a need * for a new thread. */ - size_t n_desired_threads = svr->n_sessions / N_SESSIONS_THREASHHOLD; + size_t n_desired_threads = n_sessions / N_SESSIONS_THREASHHOLD; if (n_desired_threads > svr->n_active_threads) { sessions_thread_init(&svr->threads[svr->n_active_threads++]); @@ -504,7 +511,7 @@ ovsdb_jsonrpc_session_create(struct ovsdb_jsonrpc_remote *remote, s->js = js; s->js_seqno = jsonrpc_session_get_seqno(js); - server->n_sessions++; + atomic_count_inc(&server->n_sessions); return s; } @@ -524,7 +531,7 @@ ovsdb_jsonrpc_session_close(struct ovsdb_jsonrpc_session *s) jsonrpc_session_close(s->js); list_remove(&s->node); server = ovsdb_jsonrpc_server_cast(s->up.server); - server->n_sessions--; + atomic_count_dec(&server->n_sessions); ovsdb_session_destroy(&s->up); free(s); } -- 1.9.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev