thread.h revision 0406ce1417f76f2034833414dcecc9f56253640c
1a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Copyright 2011 Google Inc. All Rights Reserved. 2a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// 30406ce1417f76f2034833414dcecc9f56253640cVikas Arora// Use of this source code is governed by a BSD-style license 40406ce1417f76f2034833414dcecc9f56253640cVikas Arora// that can be found in the COPYING file in the root of the source 50406ce1417f76f2034833414dcecc9f56253640cVikas Arora// tree. An additional intellectual property rights grant can be found 60406ce1417f76f2034833414dcecc9f56253640cVikas Arora// in the file PATENTS. All contributing project authors may 70406ce1417f76f2034833414dcecc9f56253640cVikas Arora// be found in the AUTHORS file in the root of the source tree. 8a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// ----------------------------------------------------------------------------- 9a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// 10a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Multi-threaded worker 11a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// 12a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Author: Skal (pascal.massimino@gmail.com) 13a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 14a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#ifndef WEBP_UTILS_THREAD_H_ 15a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#define WEBP_UTILS_THREAD_H_ 16a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 171e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora#ifdef HAVE_CONFIG_H 181e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora#include "config.h" 191e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora#endif 201e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora 21a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#if defined(__cplusplus) || defined(c_plusplus) 22a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern "C" { 23a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif 24a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 25a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#if WEBP_USE_THREAD 26a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 27a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#if defined(_WIN32) 28a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 29a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#include <windows.h> 30a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef HANDLE pthread_t; 31a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef CRITICAL_SECTION pthread_mutex_t; 32a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef struct { 33a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora HANDLE waiting_sem_; 34a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora HANDLE received_sem_; 35a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora HANDLE signal_event_; 36a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora} pthread_cond_t; 37a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 38a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#else 39a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 40a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#include <pthread.h> 41a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 42a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif /* _WIN32 */ 43a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif /* WEBP_USE_THREAD */ 44a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 45a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// State of the worker thread object 46a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef enum { 47a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora NOT_OK = 0, // object is unusable 48a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora OK, // ready to work 49a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora WORK // busy finishing the current task 50a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora} WebPWorkerStatus; 51a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 52a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Function to be called by the worker thread. Takes two opaque pointers as 53a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// arguments (data1 and data2), and should return false in case of error. 54a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef int (*WebPWorkerHook)(void*, void*); 55a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 56a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Synchronize object used to launch job in the worker thread 57a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef struct { 58a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#if WEBP_USE_THREAD 59a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora pthread_mutex_t mutex_; 60a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora pthread_cond_t condition_; 61a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora pthread_t thread_; 62a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif 63a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora WebPWorkerStatus status_; 64a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora WebPWorkerHook hook; // hook to call 65a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora void* data1; // first argument passed to 'hook' 66a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora void* data2; // second argument passed to 'hook' 67a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora int had_error; // return value of the last call to 'hook' 68a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora} WebPWorker; 69a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 70a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Must be called first, before any other method. 71a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid WebPWorkerInit(WebPWorker* const worker); 721e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora// Must be called to initialize the object and spawn the thread. Re-entrant. 73a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Will potentially launch the thread. Returns false in case of error. 74a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraint WebPWorkerReset(WebPWorker* const worker); 751e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora// Makes sure the previous work is finished. Returns true if worker->had_error 761e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora// was not set and no error condition was triggered by the working thread. 77a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraint WebPWorkerSync(WebPWorker* const worker); 781e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora// Triggers the thread to call hook() with data1 and data2 argument. These 79a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// hook/data1/data2 can be changed at any time before calling this function, 80a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// but not be changed afterward until the next call to WebPWorkerSync(). 81a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid WebPWorkerLaunch(WebPWorker* const worker); 82a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Kill the thread and terminate the object. To use the object again, one 83a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// must call WebPWorkerReset() again. 84a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid WebPWorkerEnd(WebPWorker* const worker); 85a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 86a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------ 87a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 88a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#if defined(__cplusplus) || defined(c_plusplus) 89a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora} // extern "C" 90a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif 91a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 92a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif /* WEBP_UTILS_THREAD_H_ */ 93