diff options
Diffstat (limited to 'src/lib/libc/include/thread_private.h')
| -rw-r--r-- | src/lib/libc/include/thread_private.h | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/src/lib/libc/include/thread_private.h b/src/lib/libc/include/thread_private.h index 1ec1071161..3e1dbcdf6e 100644 --- a/src/lib/libc/include/thread_private.h +++ b/src/lib/libc/include/thread_private.h | |||
| @@ -1,10 +1,13 @@ | |||
| 1 | /* $OpenBSD: thread_private.h,v 1.37 2024/08/18 02:25:51 guenther Exp $ */ | 1 | /* $OpenBSD: thread_private.h,v 1.40 2025/08/04 01:44:33 dlg Exp $ */ |
| 2 | 2 | ||
| 3 | /* PUBLIC DOMAIN: No Rights Reserved. Marco S Hyman <marc@snafu.org> */ | 3 | /* PUBLIC DOMAIN: No Rights Reserved. Marco S Hyman <marc@snafu.org> */ |
| 4 | 4 | ||
| 5 | #ifndef _THREAD_PRIVATE_H_ | 5 | #ifndef _THREAD_PRIVATE_H_ |
| 6 | #define _THREAD_PRIVATE_H_ | 6 | #define _THREAD_PRIVATE_H_ |
| 7 | 7 | ||
| 8 | #include <sys/types.h> | ||
| 9 | #include <sys/gmon.h> | ||
| 10 | |||
| 8 | extern int __isthreaded; | 11 | extern int __isthreaded; |
| 9 | 12 | ||
| 10 | #define _MALLOC_MUTEXES 32 | 13 | #define _MALLOC_MUTEXES 32 |
| @@ -292,6 +295,12 @@ TAILQ_HEAD(pthread_queue, pthread); | |||
| 292 | 295 | ||
| 293 | #ifdef FUTEX | 296 | #ifdef FUTEX |
| 294 | 297 | ||
| 298 | /* | ||
| 299 | * CAS based implementations | ||
| 300 | */ | ||
| 301 | |||
| 302 | #define __CMTX_CAS | ||
| 303 | |||
| 295 | struct pthread_mutex { | 304 | struct pthread_mutex { |
| 296 | volatile unsigned int lock; | 305 | volatile unsigned int lock; |
| 297 | int type; | 306 | int type; |
| @@ -312,6 +321,10 @@ struct pthread_rwlock { | |||
| 312 | 321 | ||
| 313 | #else | 322 | #else |
| 314 | 323 | ||
| 324 | /* | ||
| 325 | * spinlock based implementations | ||
| 326 | */ | ||
| 327 | |||
| 315 | struct pthread_mutex { | 328 | struct pthread_mutex { |
| 316 | _atomic_lock_t lock; | 329 | _atomic_lock_t lock; |
| 317 | struct pthread_queue lockers; | 330 | struct pthread_queue lockers; |
| @@ -336,6 +349,46 @@ struct pthread_rwlock { | |||
| 336 | }; | 349 | }; |
| 337 | #endif /* FUTEX */ | 350 | #endif /* FUTEX */ |
| 338 | 351 | ||
| 352 | /* libc mutex */ | ||
| 353 | |||
| 354 | #define __CMTX_UNLOCKED 0 | ||
| 355 | #define __CMTX_LOCKED 1 | ||
| 356 | #define __CMTX_CONTENDED 2 | ||
| 357 | |||
| 358 | #ifdef __CMTX_CAS | ||
| 359 | struct __cmtx { | ||
| 360 | volatile unsigned int lock; | ||
| 361 | }; | ||
| 362 | |||
| 363 | #define __CMTX_INITIALIZER() { \ | ||
| 364 | .lock = __CMTX_UNLOCKED, \ | ||
| 365 | } | ||
| 366 | #else /* __CMTX_CAS */ | ||
| 367 | struct __cmtx { | ||
| 368 | _atomic_lock_t spin; | ||
| 369 | volatile unsigned int lock; | ||
| 370 | }; | ||
| 371 | |||
| 372 | #define __CMTX_INITIALIZER() { \ | ||
| 373 | .spin = _SPINLOCK_UNLOCKED, \ | ||
| 374 | .lock = __CMTX_UNLOCKED, \ | ||
| 375 | } | ||
| 376 | #endif /* __CMTX_CAS */ | ||
| 377 | |||
| 378 | /* libc recursive mutex */ | ||
| 379 | |||
| 380 | struct __rcmtx { | ||
| 381 | volatile pthread_t owner; | ||
| 382 | struct __cmtx mtx; | ||
| 383 | unsigned int depth; | ||
| 384 | }; | ||
| 385 | |||
| 386 | #define __RCMTX_INITIALIZER() { \ | ||
| 387 | .owner = NULL, \ | ||
| 388 | .mtx = __CMTX_INITIALIZER(), \ | ||
| 389 | .depth = 0, \ | ||
| 390 | } | ||
| 391 | |||
| 339 | struct pthread_mutex_attr { | 392 | struct pthread_mutex_attr { |
| 340 | int ma_type; | 393 | int ma_type; |
| 341 | int ma_protocol; | 394 | int ma_protocol; |
| @@ -390,6 +443,7 @@ struct pthread { | |||
| 390 | 443 | ||
| 391 | /* cancel received in a delayed cancel block? */ | 444 | /* cancel received in a delayed cancel block? */ |
| 392 | int delayed_cancel; | 445 | int delayed_cancel; |
| 446 | struct gmonparam *gmonparam; | ||
| 393 | }; | 447 | }; |
| 394 | /* flags in pthread->flags */ | 448 | /* flags in pthread->flags */ |
| 395 | #define THREAD_DONE 0x001 | 449 | #define THREAD_DONE 0x001 |
| @@ -410,6 +464,16 @@ void _spinlock(volatile _atomic_lock_t *); | |||
| 410 | int _spinlocktry(volatile _atomic_lock_t *); | 464 | int _spinlocktry(volatile _atomic_lock_t *); |
| 411 | void _spinunlock(volatile _atomic_lock_t *); | 465 | void _spinunlock(volatile _atomic_lock_t *); |
| 412 | 466 | ||
| 467 | void __cmtx_init(struct __cmtx *); | ||
| 468 | int __cmtx_enter_try(struct __cmtx *); | ||
| 469 | void __cmtx_enter(struct __cmtx *); | ||
| 470 | void __cmtx_leave(struct __cmtx *); | ||
| 471 | |||
| 472 | void __rcmtx_init(struct __rcmtx *); | ||
| 473 | int __rcmtx_enter_try(struct __rcmtx *); | ||
| 474 | void __rcmtx_enter(struct __rcmtx *); | ||
| 475 | void __rcmtx_leave(struct __rcmtx *); | ||
| 476 | |||
| 413 | void _rthread_debug(int, const char *, ...) | 477 | void _rthread_debug(int, const char *, ...) |
| 414 | __attribute__((__format__ (printf, 2, 3))); | 478 | __attribute__((__format__ (printf, 2, 3))); |
| 415 | pid_t _thread_dofork(pid_t (*_sys_fork)(void)); | 479 | pid_t _thread_dofork(pid_t (*_sys_fork)(void)); |
