// Copyright 2016 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.

#include "starboard/shared/starboard/thread_local_storage_external_access_hack_public.h"

#include "starboard/shared/starboard/thread_local_storage_internal.h"

void StarboardSharedTLSKeyManagerInitializeTLSForThread() {
  starboard::shared::TLSKeyManager::Get()->InitializeTLSForThread();
}

void StarboardSharedTLSKeyManagerShutdownTLSForThread() {
  starboard::shared::TLSKeyManager::Get()->ShutdownTLSForThread();
}
