blob: 3191890b7686d119b3254265a097f75a6b832c28 [file] [log] [blame]
Vikas Aroraa2415722012-08-09 16:18:58 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2//
3// This code is licensed under the same terms as WebM:
4// Software License Agreement: http://www.webmproject.org/license/software/
5// Additional IP Rights Grant: http://www.webmproject.org/license/additional/
6// -----------------------------------------------------------------------------
7//
8// Multi-threaded worker
9//
10// Author: Skal (pascal.massimino@gmail.com)
11
12#ifndef WEBP_UTILS_THREAD_H_
13#define WEBP_UTILS_THREAD_H_
14
15#if defined(__cplusplus) || defined(c_plusplus)
16extern "C" {
17#endif
18
19#if WEBP_USE_THREAD
20
21#if defined(_WIN32)
22
23#include <windows.h>
24typedef HANDLE pthread_t;
25typedef CRITICAL_SECTION pthread_mutex_t;
26typedef struct {
27 HANDLE waiting_sem_;
28 HANDLE received_sem_;
29 HANDLE signal_event_;
30} pthread_cond_t;
31
32#else
33
34#include <pthread.h>
35
36#endif /* _WIN32 */
37#endif /* WEBP_USE_THREAD */
38
39// State of the worker thread object
40typedef enum {
41 NOT_OK = 0, // object is unusable
42 OK, // ready to work
43 WORK // busy finishing the current task
44} WebPWorkerStatus;
45
46// Function to be called by the worker thread. Takes two opaque pointers as
47// arguments (data1 and data2), and should return false in case of error.
48typedef int (*WebPWorkerHook)(void*, void*);
49
50// Synchronize object used to launch job in the worker thread
51typedef struct {
52#if WEBP_USE_THREAD
53 pthread_mutex_t mutex_;
54 pthread_cond_t condition_;
55 pthread_t thread_;
56#endif
57 WebPWorkerStatus status_;
58 WebPWorkerHook hook; // hook to call
59 void* data1; // first argument passed to 'hook'
60 void* data2; // second argument passed to 'hook'
61 int had_error; // return value of the last call to 'hook'
62} WebPWorker;
63
64// Must be called first, before any other method.
65void WebPWorkerInit(WebPWorker* const worker);
66// Must be called initialize the object and spawn the thread. Re-entrant.
67// Will potentially launch the thread. Returns false in case of error.
68int WebPWorkerReset(WebPWorker* const worker);
69// Make sure the previous work is finished. Returns true if worker->had_error
70// was not set and not error condition was triggered by the working thread.
71int WebPWorkerSync(WebPWorker* const worker);
72// Trigger the thread to call hook() with data1 and data2 argument. These
73// hook/data1/data2 can be changed at any time before calling this function,
74// but not be changed afterward until the next call to WebPWorkerSync().
75void WebPWorkerLaunch(WebPWorker* const worker);
76// Kill the thread and terminate the object. To use the object again, one
77// must call WebPWorkerReset() again.
78void WebPWorkerEnd(WebPWorker* const worker);
79
80//------------------------------------------------------------------------------
81
82#if defined(__cplusplus) || defined(c_plusplus)
83} // extern "C"
84#endif
85
86#endif /* WEBP_UTILS_THREAD_H_ */