48 #include <drizzled/plugin.h>
49 #include <drizzled/statistics_variables.h>
50 #include "scoreboard.h"
54 using namespace drizzled;
57 Scoreboard::Scoreboard(uint32_t in_number_sessions, uint32_t in_number_buckets)
59 number_sessions(in_number_sessions),
60 number_buckets(in_number_buckets)
64 number_per_bucket=
static_cast<uint32_t
> ( ceil( static_cast<double>(number_sessions) / static_cast<double>(number_buckets) ) );
66 vector_of_scoreboard_vectors.reserve(number_buckets);
68 for (uint32_t j= 0; j < number_buckets; ++j)
70 vector<ScoreboardSlot* > *scoreboard_vector=
new vector<ScoreboardSlot*>;
72 scoreboard_vector->reserve(number_per_bucket);
74 for (uint32_t h= 0; h < number_per_bucket; ++h)
78 vector_of_scoreboard_vectors.push_back(scoreboard_vector);
81 vector_of_scoreboard_locks.reserve(number_buckets);
83 for (uint32_t k= 0; k < number_buckets; ++k)
84 vector_of_scoreboard_locks.push_back(
new boost::shared_mutex);
88 size_t userCommandsSize=
sizeof(
UserCommands) +
sizeof(uint64_t) * SQLCOM_END;
90 scoreboard_size_bytes= (statusVarsSize + userCommandsSize) * number_per_bucket * number_buckets;
93 Scoreboard::~Scoreboard()
95 BOOST_FOREACH(std::vector<ScoreboardSlot*>* it0, vector_of_scoreboard_vectors)
101 BOOST_FOREACH(boost::shared_mutex* it, vector_of_scoreboard_locks)
107 return session->getSessionId() % number_buckets;
113 uint32_t bucket_number= getBucketNumber(session);
116 vector<ScoreboardSlot* > *scoreboard_vector= vector_of_scoreboard_vectors.at(bucket_number);
119 int32_t session_scoreboard_slot= session->getScoreboardIndex();
121 if (session_scoreboard_slot != -1)
122 return scoreboard_vector->at(session_scoreboard_slot);
124 boost::shared_mutex* LOCK_scoreboard_vector= vector_of_scoreboard_locks.at(bucket_number);
125 LOCK_scoreboard_vector->lock();
127 int32_t slot_index= 0;
128 for (vector<ScoreboardSlot*>::iterator it= scoreboard_vector->begin(); it != scoreboard_vector->end(); ++it, ++slot_index)
135 slot.setUser(session->user()->username());
136 slot.setIp(session->user()->address());
137 session->setScoreboardIndex(slot_index);
138 LOCK_scoreboard_vector->unlock();
142 LOCK_scoreboard_vector->unlock();
152 int32_t session_scoreboard_slot= session->getScoreboardIndex();
153 if (session_scoreboard_slot == -1)
155 return vector_of_scoreboard_vectors.at(getBucketNumber(session))->at(session_scoreboard_slot);