12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/common/mailbox.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string.h> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/logging.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/rand_util.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gpu { 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Mailbox::Mailbox() { 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memset(name, 0, sizeof(name)); 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Mailbox::IsZero() const { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < arraysize(name); ++i) { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (name[i]) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void Mailbox::SetZero() { 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) memset(name, 0, sizeof(name)); 28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Mailbox::SetName(const int8* n) { 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(IsZero() || !memcmp(name, n, sizeof(name))); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memcpy(name, n, sizeof(name)); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Mailbox Mailbox::Generate() { 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Mailbox result; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Generates cryptographically-secure bytes. 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RandBytes(result.name, sizeof(result.name)); 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(NDEBUG) 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int8 value = 1; 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 1; i < sizeof(result.name); ++i) 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) value ^= result.name[i]; 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result.name[0] = value; 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return result; 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Mailbox::Verify() const { 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(NDEBUG) 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int8 value = 1; 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < sizeof(name); ++i) 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) value ^= name[i]; 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return value == 0; 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace gpu 60