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