2 Unix SMB/CIFS implementation.
3 SMB client library implementation (thread interface functions).
4 Copyright (C) Jeremy Allison, 2009.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 * This code is based in the ideas in openssl
22 * but somewhat simpler and expended to include
23 * thread local storage.
28 /*********************************************************
29 Functions to vector the locking primitives used internally
31 *********************************************************/
33 const struct smb_thread_functions
*global_tfp
;
35 /*********************************************************
37 *********************************************************/
39 void **global_lock_array
;
41 /*********************************************************
42 Function to set the locking primitives used by libsmbclient.
43 *********************************************************/
45 int smb_thread_set_functions(const struct smb_thread_functions
*tf
)
51 #if defined(PARANOID_MALLOC_CHECKER)
57 /* Here we initialize any static locks we're using. */
58 global_lock_array
= (void **)malloc(sizeof(void *) *NUM_GLOBAL_LOCKS
);
60 #if defined(PARANOID_MALLOC_CHECKER)
61 #define malloc(s) __ERROR_DONT_USE_MALLOC_DIRECTLY
64 if (global_lock_array
== NULL
) {
68 for (i
= 0; i
< NUM_GLOBAL_LOCKS
; i
++) {
70 if (asprintf(&name
, "global_lock_%d", i
) == -1) {
71 SAFE_FREE(global_lock_array
);
74 if (global_tfp
->create_mutex(name
,
75 &global_lock_array
[i
],
77 smb_panic("smb_thread_set_functions: create mutexes failed");
86 /* Test. - pthread implementations. */
93 SMB_THREADS_DEF_PTHREAD_IMPLEMENTATION(tf
);
98 int test_threads(void)
102 smb_thread_set_functions(&tf
);
104 if ((ret
= SMB_THREAD_CREATE_TLS_ONCE("test_tls", pkey
)) != 0) {
105 printf("Create tls once error: %d\n", ret
);
107 if ((ret
= SMB_THREAD_CREATE_MUTEX("test", plock
)) != 0) {
108 printf("Create lock error: %d\n", ret
);
110 if ((ret
= SMB_THREAD_LOCK(plock
, SMB_THREAD_LOCK
)) != 0) {
111 printf("lock error: %d\n", ret
);
113 if ((SMB_THREAD_LOCK(plock
, SMB_THREAD_UNLOCK
)) != 0) {
114 printf("unlock error: %d\n", ret
);
116 SMB_THREAD_DESTROY_MUTEX(plock
);
117 SMB_THREAD_DESTROY_TLS_ONCE(pkey
);