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#ifndef ANDROID_HARDWARE_GNSS_THREADCREATIONWRAPPER_H
1829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju#define ANDROID_HARDWARE_GNSS_THREADCREATIONWRAPPER_H
1929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
2029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju#include <pthread.h>
2129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju#include <vector>
2229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju#include <cutils/log.h>
2329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
2429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajutypedef void (*threadEntryFunc)(void* ret);
2529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
2629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju/*
2729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * This class facilitates createThreadCb methods in various GNSS interfaces to wrap
2829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * pthread_create() from libc since its function signature differs from what is required by the
2929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * conventional GNSS HAL. The arguments passed to pthread_create() need to be on heap and not on
3029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * the stack of createThreadCb.
3129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju */
3229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajustruct ThreadFuncArgs {
3329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    ThreadFuncArgs(void (*start)(void*), void* arg) : fptr(start), args(arg) {}
3429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
3529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    /* pointer to the function of type void()(void*) that needs to be wrapped */
3629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    threadEntryFunc fptr;
3729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    /* argument for fptr to be called with */
3829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    void* args;
3929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju};
4029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
4129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju/*
4229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * This method is simply a wrapper. It is required since pthread_create() requires an entry
4329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * function pointer of type void*()(void*) and the GNSS hal requires as input a function pointer of
4429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * type void()(void*).
4529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju */
4629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajuvoid* threadFunc(void* arg);
4729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
4829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju/*
4929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * This method is called by createThreadCb with a pointer to the vector that
5029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * holds the pointers to the thread arguments. The arg and start parameters are
5129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * first used to create a ThreadFuncArgs object which is then saved in the
5229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * listArgs parameters. The created ThreadFuncArgs object is then used to invoke
5329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * threadFunc() method which in-turn invokes pthread_create.
5429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju */
5529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajupthread_t createPthread(const char* name, void (*start)(void*), void* arg,
5629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju                        std::vector<std::unique_ptr<ThreadFuncArgs>> * listArgs);
5729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
5829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju#endif
59