fixed null-pointer reference in network code...
...(merged 2008-05-09T22:54:20Z!paniemin@cc.hut.fi/3 from trunk)
This commit is contained in:
parent
d614789fe5
commit
29453c961f
2 changed files with 16 additions and 15 deletions
|
@ -10,6 +10,7 @@ Version 1.4.2+svn:
|
|||
(debian bug #426318)
|
||||
* added some includes to fix compilation problems with Sun Studio 12
|
||||
(patch #1066)
|
||||
* fixed null-pointer reference in network code
|
||||
|
||||
Version 1.4.2:
|
||||
* campaigns
|
||||
|
|
|
@ -101,7 +101,7 @@ unsigned int waiting_threads[NUM_SHARDS];
|
|||
size_t min_threads = 0;
|
||||
size_t max_threads = 0;
|
||||
|
||||
int get_shard(TCPsocket sock) { return intptr_t(sock)%NUM_SHARDS; }
|
||||
size_t get_shard(TCPsocket sock) { return reinterpret_cast<uintptr_t>(sock)%NUM_SHARDS; }
|
||||
|
||||
struct buffer {
|
||||
explicit buffer(TCPsocket sock) :
|
||||
|
@ -295,7 +295,7 @@ static SOCKET_STATE send_buffer(TCPsocket sock, std::vector<char>& buf)
|
|||
while(true) {
|
||||
#endif
|
||||
{
|
||||
const int shard = get_shard(sock);
|
||||
const size_t shard = get_shard(sock);
|
||||
// check if the socket is still locked
|
||||
const threading::lock lock(*shard_mutexes[shard]);
|
||||
if(sockets_locked[shard][sock] != SOCKET_LOCKED)
|
||||
|
@ -406,7 +406,7 @@ static SOCKET_STATE receive_buf(TCPsocket sock, std::vector<char>& buf)
|
|||
|
||||
inline void check_socket_result(TCPsocket& sock, SOCKET_STATE& result)
|
||||
{
|
||||
const int shard = get_shard(sock);
|
||||
const size_t shard = get_shard(sock);
|
||||
const threading::lock lock(*shard_mutexes[shard]);
|
||||
socket_state_map::iterator lock_it = sockets_locked[shard].find(sock);
|
||||
assert(lock_it != sockets_locked[shard].end());
|
||||
|
@ -418,7 +418,7 @@ inline void check_socket_result(TCPsocket& sock, SOCKET_STATE& result)
|
|||
|
||||
static int process_queue(void* shard_num)
|
||||
{
|
||||
int shard = static_cast<int>(reinterpret_cast<intptr_t>(shard_num));
|
||||
size_t shard = static_cast<size_t>(reinterpret_cast<uintptr_t>(shard_num));
|
||||
DBG_NW << "thread started...\n";
|
||||
for(;;) {
|
||||
|
||||
|
@ -579,10 +579,10 @@ manager::manager(size_t p_min_threads,size_t p_max_threads) : active_(!managed)
|
|||
min_threads = p_min_threads;
|
||||
max_threads = p_max_threads;
|
||||
|
||||
for(int shard = 0; shard != NUM_SHARDS; ++shard) {
|
||||
for(size_t shard = 0; shard != NUM_SHARDS; ++shard) {
|
||||
const threading::lock lock(*shard_mutexes[shard]);
|
||||
for(size_t n = 0; n != min_threads; ++n) {
|
||||
threading::thread * tmp = new threading::thread(process_queue,(void*)intptr_t(shard));
|
||||
threading::thread * tmp = new threading::thread(process_queue,(void*)uintptr_t(shard));
|
||||
threads[shard][tmp->get_id()] = tmp;
|
||||
}
|
||||
}
|
||||
|
@ -595,7 +595,7 @@ manager::~manager()
|
|||
|
||||
managed = false;
|
||||
|
||||
for(int shard = 0; shard != NUM_SHARDS; ++shard) {
|
||||
for(size_t shard = 0; shard != NUM_SHARDS; ++shard) {
|
||||
{
|
||||
const threading::lock lock(*shard_mutexes[shard]);
|
||||
socket_errors[shard] = 0;
|
||||
|
@ -637,7 +637,7 @@ network::pending_statistics get_pending_stats()
|
|||
network::pending_statistics stats;
|
||||
stats.npending_sends = 0;
|
||||
stats.nbytes_pending_sends = 0;
|
||||
for(int shard = 0; shard != NUM_SHARDS; ++shard) {
|
||||
for(size_t shard = 0; shard != NUM_SHARDS; ++shard) {
|
||||
const threading::lock lock(*shard_mutexes[shard]);
|
||||
stats.npending_sends += outgoing_bufs[shard].size();
|
||||
for(buffer_set::const_iterator i = outgoing_bufs[shard].begin(); i != outgoing_bufs[shard].end(); ++i) {
|
||||
|
@ -656,7 +656,7 @@ void set_raw_data_only()
|
|||
void receive_data(TCPsocket sock)
|
||||
{
|
||||
{
|
||||
const int shard = get_shard(sock);
|
||||
const size_t shard = get_shard(sock);
|
||||
const threading::lock lock(*shard_mutexes[shard]);
|
||||
pending_receives[shard].push_back(sock);
|
||||
|
||||
|
@ -719,7 +719,7 @@ void queue_raw_data(TCPsocket sock, const char* buf, int len)
|
|||
buffer* queued_buf = new buffer(sock);
|
||||
assert(*buf == 31);
|
||||
make_network_buffer(buf, len, queued_buf->raw_buffer);
|
||||
const int shard = get_shard(sock);
|
||||
const size_t shard = get_shard(sock);
|
||||
const threading::lock lock(*shard_mutexes[shard]);
|
||||
outgoing_bufs[shard].push_back(queued_buf);
|
||||
socket_state_map::const_iterator i = sockets_locked[shard].insert(std::pair<TCPsocket,SOCKET_STATE>(sock,SOCKET_READY)).first;
|
||||
|
@ -737,7 +737,7 @@ void queue_data(TCPsocket sock,const config& buf, const bool gzipped)
|
|||
output_to_buffer(sock, buf, queued_buf->stream, gzipped);
|
||||
queued_buf->gzipped = gzipped;
|
||||
{
|
||||
const int shard = get_shard(sock);
|
||||
const size_t shard = get_shard(sock);
|
||||
const threading::lock lock(*shard_mutexes[shard]);
|
||||
|
||||
outgoing_bufs[shard].push_back(queued_buf);
|
||||
|
@ -757,7 +757,7 @@ namespace
|
|||
void remove_buffers(TCPsocket sock)
|
||||
{
|
||||
{
|
||||
const int shard = get_shard(sock);
|
||||
const size_t shard = get_shard(sock);
|
||||
for(buffer_set::iterator i = outgoing_bufs[shard].begin(); i != outgoing_bufs[shard].end();) {
|
||||
if ((*i)->sock == sock)
|
||||
{
|
||||
|
@ -790,7 +790,7 @@ void remove_buffers(TCPsocket sock)
|
|||
} // anonymous namespace
|
||||
|
||||
bool is_locked(const TCPsocket sock) {
|
||||
const int shard = get_shard(sock);
|
||||
const size_t shard = get_shard(sock);
|
||||
const threading::lock lock(*shard_mutexes[shard]);
|
||||
const socket_state_map::iterator lock_it = sockets_locked[shard].find(sock);
|
||||
if (lock_it == sockets_locked[shard].end()) return false;
|
||||
|
@ -800,7 +800,7 @@ bool is_locked(const TCPsocket sock) {
|
|||
bool close_socket(TCPsocket sock, bool force)
|
||||
{
|
||||
{
|
||||
const int shard = get_shard(sock);
|
||||
const size_t shard = get_shard(sock);
|
||||
const threading::lock lock(*shard_mutexes[shard]);
|
||||
|
||||
pending_receives[shard].erase(std::remove(pending_receives[shard].begin(),pending_receives[shard].end(),sock),pending_receives[shard].end());
|
||||
|
@ -830,7 +830,7 @@ bool close_socket(TCPsocket sock, bool force)
|
|||
|
||||
TCPsocket detect_error()
|
||||
{
|
||||
for(int shard = 0; shard != NUM_SHARDS; ++shard) {
|
||||
for(size_t shard = 0; shard != NUM_SHARDS; ++shard) {
|
||||
const threading::lock lock(*shard_mutexes[shard]);
|
||||
if(socket_errors[shard] > 0) {
|
||||
for(socket_state_map::iterator i = sockets_locked[shard].begin(); i != sockets_locked[shard].end();) {
|
||||
|
|
Loading…
Add table
Reference in a new issue