blob: f34e187521550edfa5a46ff76d53cd85990499bc [file] [log] [blame]
// Copyright 2016 The Cobalt Authors. 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/thread.h"
#include <Eina.h>
#include "starboard/log.h"
#include "starboard/string.h"
#define THREAD_LOG_ON 0
namespace {
struct ThreadParams {
SbThreadEntryPoint entry_point;
char name[128];
void* context;
};
void* ThreadFunc(void* context, Eina_Thread thread) {
ThreadParams* thread_params = static_cast<ThreadParams*>(context);
SbThreadEntryPoint entry_point = thread_params->entry_point;
void* real_context = thread_params->context;
if (thread_params->name[0] != '\0') {
SbThreadSetName(thread_params->name);
}
#if THREAD_LOG_ON
SB_DLOG(INFO) << "SbThreadCreate enter ============= " << thread;
#endif
delete thread_params;
return entry_point(real_context);
}
Eina_Thread_Priority StarboardThreadPriorityToEina(SbThreadPriority priority) {
switch (priority) {
case kSbThreadPriorityLowest:
case kSbThreadPriorityLow:
return EINA_THREAD_IDLE;
case kSbThreadNoPriority:
case kSbThreadPriorityNormal:
return EINA_THREAD_BACKGROUND;
case kSbThreadPriorityHigh:
case kSbThreadPriorityHighest:
case kSbThreadPriorityRealTime:
return EINA_THREAD_URGENT;
default:
SB_NOTREACHED();
break;
}
}
} // namespace
SbThread SbThreadCreate(int64_t stack_size,
SbThreadPriority priority,
SbThreadAffinity /*affinity*/,
bool joinable,
const char* name,
SbThreadEntryPoint entry_point,
void* context) {
if (stack_size < 0 || !entry_point) {
return kSbThreadInvalid;
}
ThreadParams* params = new ThreadParams();
params->entry_point = entry_point;
params->context = context;
if (name) {
SbStringCopy(params->name, name, sizeof(params->name));
} else {
params->name[0] = '\0';
}
Eina_Thread thread = kSbThreadInvalid;
if (eina_thread_create(&thread, StarboardThreadPriorityToEina(priority), -1,
&ThreadFunc, params)) {
// Fix nplb SbThreadCreateTest.SunnyDayDetached
// We can not pass |joinable| info when call eina_thread_create
// If |joinable| is false, we need to detach thread immediately
if (!joinable)
SbThreadDetach(thread);
return thread;
}
return kSbThreadInvalid;
}