// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Defines platform-specific threading and synchronization primitive types and
// initializers. We hide but pass-through the platform's primitives to avoid
// doing a lot of work to replicate initialization-less synchronization
// primitives.

// TODO: Implement a cross-platform initless synchronization model, and
// then properly hide thread primitives. This could look like implementing our
// own high-performance init-less lock (e.g. MCS or CLH) using the Atomics
// abstraction, and use that on all platforms and hope really hard that we
// didn't mess it up and then use that to auto-init uninitialized static
// objects.

#ifndef STARBOARD_THREAD_TYPES_H_
#define STARBOARD_THREAD_TYPES_H_

#include "starboard/configuration.h"

// This platform-specific include file must define:
//
//   SbConditionVariable
//   SB_CONDITION_VARIABLE_INITIALIZER
//
//   SbMutex
//   SB_MUTEX_INITIALIZER
//
//   SbThread
//   SbThreadIsValid()
//   kSbThreadInvalid
//
//   SbOnce
//   SB_ONCE_INITIALIIER

#include STARBOARD_THREAD_TYPES_INCLUDE

#ifndef SB_CONDITION_VARIABLE_INITIALIZER
#error "SB_CONDITION_VARIABLE_INITIALIZER not defined by platform."
#endif

#ifndef SB_MUTEX_INITIALIZER
#error "SB_MUTEX_INITIALIZER not defined by platform."
#endif

#ifndef SB_ONCE_INITIALIZER
#error "SB_ONCE_INITIALIZER not defined by platform."
#endif

#endif  // STARBOARD_THREAD_TYPES_H_
