Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(184)

Side by Side Diff: base/stats_table.cc

Issue 126100: Fix StatsTable::RegisterThread so that it doesn't crash if shared memory... (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 11 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | base/stats_table_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/stats_table.h" 5 #include "base/stats_table.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/platform_thread.h" 8 #include "base/platform_thread.h"
9 #include "base/process_util.h" 9 #include "base/process_util.h"
10 #include "base/scoped_ptr.h" 10 #include "base/scoped_ptr.h"
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 // Cleanup our shared memory. 280 // Cleanup our shared memory.
281 delete impl_; 281 delete impl_;
282 282
283 // If we are the global table, unregister ourselves. 283 // If we are the global table, unregister ourselves.
284 if (global_table_ == this) 284 if (global_table_ == this)
285 global_table_ = NULL; 285 global_table_ = NULL;
286 } 286 }
287 287
288 int StatsTable::RegisterThread(const std::string& name) { 288 int StatsTable::RegisterThread(const std::string& name) {
289 int slot = 0; 289 int slot = 0;
290 if (!impl_)
291 return 0;
290 292
291 // Registering a thread requires that we lock the shared memory 293 // Registering a thread requires that we lock the shared memory
292 // so that two threads don't grab the same slot. Fortunately, 294 // so that two threads don't grab the same slot. Fortunately,
293 // thread creation shouldn't happen in inner loops. 295 // thread creation shouldn't happen in inner loops.
294 { 296 {
295 base::SharedMemoryAutoLock lock(impl_->shared_memory()); 297 base::SharedMemoryAutoLock lock(impl_->shared_memory());
296 slot = FindEmptyThread(); 298 slot = FindEmptyThread();
297 if (!slot) { 299 if (!slot) {
298 return 0; 300 return 0;
299 } 301 }
300 302
301 DCHECK(impl_);
302
303 // We have space, so consume a column in the table. 303 // We have space, so consume a column in the table.
304 std::string thread_name = name; 304 std::string thread_name = name;
305 if (name.empty()) 305 if (name.empty())
306 thread_name = kUnknownName; 306 thread_name = kUnknownName;
307 base::strlcpy(impl_->thread_name(slot), thread_name.c_str(), 307 base::strlcpy(impl_->thread_name(slot), thread_name.c_str(),
308 kMaxThreadNameLength); 308 kMaxThreadNameLength);
309 *(impl_->thread_tid(slot)) = PlatformThread::CurrentId(); 309 *(impl_->thread_tid(slot)) = PlatformThread::CurrentId();
310 *(impl_->thread_pid(slot)) = base::GetCurrentProcId(); 310 *(impl_->thread_pid(slot)) = base::GetCurrentProcId();
311 } 311 }
312 312
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
441 iter = counters_.find(name); 441 iter = counters_.find(name);
442 if (iter != counters_.end()) 442 if (iter != counters_.end())
443 return iter->second; 443 return iter->second;
444 } 444 }
445 445
446 // Counter does not exist, so add it. 446 // Counter does not exist, so add it.
447 return AddCounter(name); 447 return AddCounter(name);
448 } 448 }
449 449
450 int StatsTable::AddCounter(const std::string& name) { 450 int StatsTable::AddCounter(const std::string& name) {
451 DCHECK(impl_);
452
453 if (!impl_) 451 if (!impl_)
454 return 0; 452 return 0;
455 453
456 int counter_id = 0; 454 int counter_id = 0;
457 { 455 {
458 // To add a counter to the shared memory, we need the 456 // To add a counter to the shared memory, we need the
459 // shared memory lock. 457 // shared memory lock.
460 base::SharedMemoryAutoLock lock(impl_->shared_memory()); 458 base::SharedMemoryAutoLock lock(impl_->shared_memory());
461 459
462 // We have space, so create a new counter. 460 // We have space, so create a new counter.
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 if (!slot && !(slot = table->RegisterThread(""))) 549 if (!slot && !(slot = table->RegisterThread("")))
552 return NULL; 550 return NULL;
553 551
554 // Find the counter id for the counter. 552 // Find the counter id for the counter.
555 std::string str_name(name); 553 std::string str_name(name);
556 int counter = table->FindCounter(str_name); 554 int counter = table->FindCounter(str_name);
557 555
558 // Now we can find the location in the table. 556 // Now we can find the location in the table.
559 return table->GetLocation(counter, slot); 557 return table->GetLocation(counter, slot);
560 } 558 }
OLDNEW
« no previous file with comments | « no previous file | base/stats_table_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698