Skip to content

Commit da6f6cc

Browse files
author
dlg
committed
revert switching the malloc locks to __cmtx
phessler hits a problem where an unowned lock is released, which fails an assert in __cmtx. it's not clear to me why the pthread_mutex type this rolls back to doesnt abort either, but i can back it out until i figure it out.
1 parent 46cd934 commit da6f6cc

File tree

1 file changed

+64
-8
lines changed

1 file changed

+64
-8
lines changed

lib/libc/thread/rthread_libc.c

Lines changed: 64 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $OpenBSD: rthread_libc.c,v 1.6 2025/07/14 06:48:10 dlg Exp $ */
1+
/* $OpenBSD: rthread_libc.c,v 1.7 2025/08/02 11:17:00 dlg Exp $ */
22

33
/* PUBLIC DOMAIN: No Rights Reserved. Marco S Hyman <[email protected]> */
44

@@ -152,9 +152,24 @@ _thread_mutex_destroy(void **mutex)
152152
/*
153153
* the malloc lock
154154
*/
155-
#define MALLOC_LOCK_INITIALIZER(n) __CMTX_INITIALIZER()
156-
157-
static struct __cmtx malloc_lock[_MALLOC_MUTEXES] = {
155+
#ifndef FUTEX
156+
#define MALLOC_LOCK_INITIALIZER(n) { \
157+
_SPINLOCK_UNLOCKED, \
158+
TAILQ_HEAD_INITIALIZER(malloc_lock[n].lockers), \
159+
PTHREAD_MUTEX_DEFAULT, \
160+
NULL, \
161+
0, \
162+
-1 }
163+
#else
164+
#define MALLOC_LOCK_INITIALIZER(n) { \
165+
_SPINLOCK_UNLOCKED, \
166+
PTHREAD_MUTEX_DEFAULT, \
167+
NULL, \
168+
0, \
169+
-1 }
170+
#endif
171+
172+
static struct pthread_mutex malloc_lock[_MALLOC_MUTEXES] = {
158173
MALLOC_LOCK_INITIALIZER(0),
159174
MALLOC_LOCK_INITIALIZER(1),
160175
MALLOC_LOCK_INITIALIZER(2),
@@ -189,25 +204,66 @@ static struct __cmtx malloc_lock[_MALLOC_MUTEXES] = {
189204
MALLOC_LOCK_INITIALIZER(31)
190205
};
191206

207+
static pthread_mutex_t malloc_mutex[_MALLOC_MUTEXES] = {
208+
&malloc_lock[0],
209+
&malloc_lock[1],
210+
&malloc_lock[2],
211+
&malloc_lock[3],
212+
&malloc_lock[4],
213+
&malloc_lock[5],
214+
&malloc_lock[6],
215+
&malloc_lock[7],
216+
&malloc_lock[8],
217+
&malloc_lock[9],
218+
&malloc_lock[10],
219+
&malloc_lock[11],
220+
&malloc_lock[12],
221+
&malloc_lock[13],
222+
&malloc_lock[14],
223+
&malloc_lock[15],
224+
&malloc_lock[16],
225+
&malloc_lock[17],
226+
&malloc_lock[18],
227+
&malloc_lock[19],
228+
&malloc_lock[20],
229+
&malloc_lock[21],
230+
&malloc_lock[22],
231+
&malloc_lock[23],
232+
&malloc_lock[24],
233+
&malloc_lock[25],
234+
&malloc_lock[26],
235+
&malloc_lock[27],
236+
&malloc_lock[28],
237+
&malloc_lock[29],
238+
&malloc_lock[30],
239+
&malloc_lock[31]
240+
};
241+
192242
void
193243
_thread_malloc_lock(int i)
194244
{
195-
__cmtx_enter(&malloc_lock[i]);
245+
pthread_mutex_lock(&malloc_mutex[i]);
196246
}
197247

198248
void
199249
_thread_malloc_unlock(int i)
200250
{
201-
__cmtx_leave(&malloc_lock[i]);
251+
pthread_mutex_unlock(&malloc_mutex[i]);
202252
}
203253

204254
static void
205255
_thread_malloc_reinit(void)
206256
{
207257
int i;
208258

209-
for (i = 0; i < _MALLOC_MUTEXES; i++)
210-
__cmtx_init(&malloc_lock[i]);
259+
for (i = 0; i < _MALLOC_MUTEXES; i++) {
260+
malloc_lock[i].lock = _SPINLOCK_UNLOCKED;
261+
#ifndef FUTEX
262+
TAILQ_INIT(&malloc_lock[i].lockers);
263+
#endif
264+
malloc_lock[i].owner = NULL;
265+
malloc_lock[i].count = 0;
266+
}
211267
}
212268

213269
/*

0 commit comments

Comments
 (0)