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