129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju/*
229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * Copyright (C) 2016 The Android Open Source Project
329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju *
429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * Licensed under the Apache License, Version 2.0 (the "License");
529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * you may not use this file except in compliance with the License.
629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * You may obtain a copy of the License at
729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju *
829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju *      http://www.apache.org/licenses/LICENSE-2.0
929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju *
1029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * Unless required by applicable law or agreed to in writing, software
1129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * distributed under the License is distributed on an "AS IS" BASIS,
1229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * See the License for the specific language governing permissions and
1429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * limitations under the License.
1529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju */
1629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
1729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju#include <ThreadCreationWrapper.h>
1829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
1929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajuvoid* threadFunc(void* arg) {
2029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    ThreadFuncArgs* threadArgs = reinterpret_cast<ThreadFuncArgs*>(arg);
2129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    threadArgs->fptr(threadArgs->args);
2229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    return nullptr;
2329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}
2429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
2529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajupthread_t createPthread(const char* name,
2629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju                        void (*start)(void*),
2729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju                        void* arg, std::vector<std::unique_ptr<ThreadFuncArgs>> * listArgs) {
2829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    pthread_t threadId;
2929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    auto threadArgs = new ThreadFuncArgs(start, arg);
3029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    auto argPtr = std::unique_ptr<ThreadFuncArgs>(threadArgs);
3129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
3229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    listArgs->push_back(std::move(argPtr));
3329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
3429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    int ret = pthread_create(&threadId, nullptr, threadFunc, reinterpret_cast<void*>(
3529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju            threadArgs));
3629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    if (ret != 0) {
3729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        ALOGE("pthread creation unsuccessful");
3829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    } else {
3929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        pthread_setname_np(threadId, name);
4029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    }
4129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    return threadId;
4229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}
43