Qore Programming Language 1.19.5
Loading...
Searching...
No Matches
qore_thread.h
Go to the documentation of this file.
1/* -*- mode: c++; indent-tabs-mode: nil -*- */
2/*
3 qore_thread.h
4
5 POSIX thread library for Qore
6
7 Qore Programming Language
8
9 Copyright (C) 2003 - 2023 Qore Technologies, s.r.o.
10
11 Permission is hereby granted, free of charge, to any person obtaining a
12 copy of this software and associated documentation files (the "Software"),
13 to deal in the Software without restriction, including without limitation
14 the rights to use, copy, modify, merge, publish, distribute, sublicense,
15 and/or sell copies of the Software, and to permit persons to whom the
16 Software is furnished to do so, subject to the following conditions:
17
18 The above copyright notice and this permission notice shall be included in
19 all copies or substantial portions of the Software.
20
21 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27 DEALINGS IN THE SOFTWARE.
28
29 Note that the Qore library is released under a choice of three open-source
30 licenses: MIT (as above), LGPL 2+, or GPL 2+; see README-LICENSE for more
31 information.
32*/
33
34#ifndef _QORE_QORE_THREAD_H
35#define _QORE_QORE_THREAD_H
36
41#include <cstdio>
42#include <pthread.h>
43
44#include <functional>
45
46class QoreProgram;
47class AbstractQoreZoneInfo;
48class ThreadCleanupNode;
50
52typedef void (*qtdest_t)(void *);
53
55typedef void (*qtrdest_t)(void *, ExceptionSink *);
56
58typedef void (*q_thread_t)(ExceptionSink* xsink, void* arg);
59
61
67DLLEXPORT bool is_valid_qore_thread();
68
70
72DLLEXPORT int q_gettid() noexcept;
73
76
78DLLEXPORT const AbstractQoreZoneInfo* currentTZ();
79
81
84
86
90
92
96
98
101DLLEXPORT void set_thread_resource(const ResolvedCallReferenceNode* rcr, const QoreValue arg);
102
104
110
112
114DLLEXPORT QoreHashNode* qore_get_parent_caller_location(size_t offset = 1);
115
116#if 0
118
124DLLEXPORT void set_thread_resource_id(q_trid_t trid, AbstractThreadResource *atr);
125
127
132DLLEXPORT int remove_thread_resource_id(q_trid_t trid);
133
135
138DLLEXPORT bool check_thread_resource_id(q_trid_t trid);
139#endif
140
143
145
153private:
154 static ThreadCleanupNode *head;
155
156public:
157 DLLLOCAL ThreadCleanupList();
158 DLLLOCAL ~ThreadCleanupList();
159 DLLLOCAL void exec();
160
162
165 DLLEXPORT void push(qtdest_t func, void *arg);
166
168
170 DLLEXPORT void pop(bool exec = true);
171};
172
174DLLEXPORT extern ThreadCleanupList tclist;
175
179#define QFT_OK 0
180#define QFT_ERROR -1
181#define QFT_REGISTERED -2
183
185
201
203
213
215
220
222
229
231
238
240
245
247
255int q_start_thread(ExceptionSink* xsink, q_thread_t f, void* arg = nullptr);
256
258
261public:
263
269
271
274 DLLEXPORT explicit QoreForeignThreadHelper(int tid);
275
277
282
284 DLLEXPORT operator bool() const;
285
286protected:
287 class qore_foreign_thread_priv* priv;
288
289private:
290 DLLLOCAL QoreForeignThreadHelper& operator=(const QoreForeignThreadHelper&) = delete;
291 DLLLOCAL QoreForeignThreadHelper(const QoreForeignThreadHelper&) = delete;
292 DLLLOCAL void* operator new(size_t) = delete;
293};
294
295typedef std::function<void(void*)> q_thread_local_destructor;
296
298
300hashdecl q_user_tld {
301 void* data;
302 q_thread_local_destructor destructor;
303
304 DLLLOCAL q_user_tld(void* data, q_thread_local_destructor destructor);
305 DLLLOCAL q_user_tld(q_user_tld&& old) = default;
306 DLLLOCAL q_user_tld(const q_user_tld& old) = default;
307 DLLLOCAL q_user_tld& operator=(const q_user_tld& other) = default;
308};
309
311
314
316
320DLLEXPORT void q_save_thread_local_data(int key, void* data, q_thread_local_destructor destructor = nullptr);
321
323
327DLLEXPORT void* q_swap_thread_local_data(int key, void* new_data, q_thread_local_destructor destructor = nullptr, bool run_destructor = true);
328
330
334DLLEXPORT void* q_get_thread_local_data(int key);
335
337
346
348
358DLLEXPORT int q_remove_thread_local_data(int key, q_user_tld& data, bool run_destructor = true);
359
360#endif // ifndef _QORE_THREAD_H
base class for saving data using Qore's thread resource management system
Definition: AbstractThreadResource.h:51
container for holding Qore-language exception information and also for registering a "thread_exit" ca...
Definition: ExceptionSink.h:50
use this class to temporarily register and deregister a foreign thread to allow Qore code to be execu...
Definition: qore_thread.h:260
DLLEXPORT QoreForeignThreadHelper(int tid)
registers the current thread as a foreign thread
DLLEXPORT ~QoreForeignThreadHelper()
deregisters the current thread
DLLEXPORT QoreForeignThreadHelper()
registers the current thread as a foreign thread
This is the hash or associative list container type in Qore, dynamically allocated only,...
Definition: QoreHashNode.h:52
supports parsing and executing Qore-language code, reference counted, dynamically-allocated only
Definition: QoreProgram.h:128
base class for resolved call references
Definition: CallReferenceNode.h:109
list of functions to be run when a thread ends; required for some external libraries that require exp...
Definition: qore_thread.h:152
DLLEXPORT void push(qtdest_t func, void *arg)
must only be called in the module initialization function
DLLEXPORT void pop(bool exec=true)
must only be called in the module destructor/deletion function
unsigned q_trid_t
type for thread resource IDs (unique within a single running qore library process)
Definition: common.h:463
DLLEXPORT int q_register_reserved_foreign_thread(int tid)
registers a foreign qore thread as a Qore thread with a reserved TID
DLLEXPORT bool check_thread_resource(AbstractThreadResource *atr)
check if a thread resouce has been saved
DLLEXPORT int q_release_reserved_foreign_thread_id(int tid)
releases a TID reserved with q_reserve_foreign_thread_id()
DLLEXPORT q_trid_t qore_get_trid()
get a thread resource ID
DLLEXPORT int q_reserve_foreign_thread_id()
reserves a thread ID for later registration and returns the TID reserved; use q_release_reserved_fore...
DLLEXPORT QoreProgram * getProgram()
returns the current QoreProgram
DLLEXPORT void * q_swap_thread_local_data(int key, void *new_data, q_thread_local_destructor destructor=nullptr, bool run_destructor=true)
swaps thread-local data
DLLEXPORT const AbstractQoreZoneInfo * currentTZ()
returns the current local time zone, note that if 0 = UTC
DLLEXPORT int q_get_unique_thread_local_data_key()
returns a unique ID to use with thread_local_data APIs
void(* q_thread_t)(ExceptionSink *xsink, void *arg)
pointer to a function that can be started with q_start_thread()
Definition: qore_thread.h:58
DLLEXPORT int q_remove_thread_local_data(int key, q_user_tld &data, bool run_destructor=true)
returns and removes thread-local data
DLLEXPORT void q_save_thread_local_data(int key, void *data, q_thread_local_destructor destructor=nullptr)
saves thread-local data
DLLEXPORT int q_deregister_foreign_thread()
deregisters the current thread as a foreign thread
DLLEXPORT q_user_tld * q_get_thread_local_data_all(int key)
returns thread-local data
DLLEXPORT void * q_get_thread_local_data(int key)
returns thread-local data
DLLEXPORT bool is_valid_qore_thread()
returns true if the current thread is a valid qore thread; it is not safe to call most Qore functions...
DLLEXPORT QoreHashNode * qore_get_parent_caller_location(size_t offset=1)
Returns a CallStackInfo hash for the caller's location, if available, otherwise returns nullptr.
DLLEXPORT int q_register_foreign_thread()
registers the current thread as a Qore thread
int q_start_thread(ExceptionSink *xsink, q_thread_t f, void *arg=nullptr)
starts a new thread with the given arguments, when the thread terminates, it deregisters itself
void(* qtrdest_t)(void *, ExceptionSink *)
pointer to a qore thread resource destructor function
Definition: qore_thread.h:55
DLLEXPORT int q_deregister_reserved_foreign_thread()
deregisters a foreign qore thread but retains the TID as reserved
DLLEXPORT ThreadCleanupList tclist
the interface to the thread cleanup list
DLLEXPORT void set_thread_resource(AbstractThreadResource *atr)
save a resource against a thread for thread resource handling
DLLEXPORT int remove_thread_resource(AbstractThreadResource *atr)
remove the resource from the thread resource list for the current thread
DLLEXPORT int q_gettid() noexcept
returns the current TID number
void(* qtdest_t)(void *)
pointer to a qore thread destructor function
Definition: qore_thread.h:52
The main value class in Qore, designed to be passed by value.
Definition: QoreValue.h:279
data structure for user thread-local data
Definition: qore_thread.h:300