107739b57f09886b41323c605b0dbda7d2c12522bJens Axboe#ifndef FIO_MUTEX_H
207739b57f09886b41323c605b0dbda7d2c12522bJens Axboe#define FIO_MUTEX_H
307739b57f09886b41323c605b0dbda7d2c12522bJens Axboe
407739b57f09886b41323c605b0dbda7d2c12522bJens Axboe#include <pthread.h>
507739b57f09886b41323c605b0dbda7d2c12522bJens Axboe
68b4e954ca8cf671c25e6df1d675caa34b64f7678Jens Axboe#define FIO_MUTEX_MAGIC		0x4d555445U
78b4e954ca8cf671c25e6df1d675caa34b64f7678Jens Axboe#define FIO_RWLOCK_MAGIC	0x52574c4fU
88b4e954ca8cf671c25e6df1d675caa34b64f7678Jens Axboe
9cdd18ad87ed9a3639b76c41cfc9682ad7cce652eJens Axboestruct fio_mutex {
1007739b57f09886b41323c605b0dbda7d2c12522bJens Axboe	pthread_mutex_t lock;
1107739b57f09886b41323c605b0dbda7d2c12522bJens Axboe	pthread_cond_t cond;
1264d4d313ef4f537408d28fac863cf2a2b0f00175Jens Axboe	int value;
134d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	int waiters;
148b4e954ca8cf671c25e6df1d675caa34b64f7678Jens Axboe	int magic;
1507739b57f09886b41323c605b0dbda7d2c12522bJens Axboe};
1607739b57f09886b41323c605b0dbda7d2c12522bJens Axboe
17d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboestruct fio_rwlock {
18d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	pthread_rwlock_t lock;
198b4e954ca8cf671c25e6df1d675caa34b64f7678Jens Axboe	int magic;
20d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe};
21d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe
22521da527743088a9bd2ab882f8b64799d49d5848Jens Axboeenum {
23521da527743088a9bd2ab882f8b64799d49d5848Jens Axboe	FIO_MUTEX_LOCKED	= 0,
24521da527743088a9bd2ab882f8b64799d49d5848Jens Axboe	FIO_MUTEX_UNLOCKED	= 1,
25521da527743088a9bd2ab882f8b64799d49d5848Jens Axboe};
26521da527743088a9bd2ab882f8b64799d49d5848Jens Axboe
2772242057a25b59d01b3d4e1343c94cc7ac354950Jens Axboeextern int __fio_mutex_init(struct fio_mutex *, int);
28cdd18ad87ed9a3639b76c41cfc9682ad7cce652eJens Axboeextern struct fio_mutex *fio_mutex_init(int);
29c180342e1293259ca8d23ed0298aa6c32815fee5Jens Axboeextern void __fio_mutex_remove(struct fio_mutex *);
30cdd18ad87ed9a3639b76c41cfc9682ad7cce652eJens Axboeextern void fio_mutex_remove(struct fio_mutex *);
31d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboeextern void fio_mutex_up(struct fio_mutex *);
32af4bab56db4f87410c491c356954bbb65171f94dJens Axboeextern void fio_mutex_down(struct fio_mutex *);
3372242057a25b59d01b3d4e1343c94cc7ac354950Jens Axboeextern int fio_mutex_down_trylock(struct fio_mutex *);
34656b1393d43f9f22738404582ea14dec956aea83Jens Axboeextern int fio_mutex_down_timeout(struct fio_mutex *, unsigned int);
359c5b52907227f8f50dc472d11601869f75b8d663Jens Axboe
36d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboeextern void fio_rwlock_read(struct fio_rwlock *);
37d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboeextern void fio_rwlock_write(struct fio_rwlock *);
38d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboeextern void fio_rwlock_unlock(struct fio_rwlock *);
39d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboeextern struct fio_rwlock *fio_rwlock_init(void);
40d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboeextern void fio_rwlock_remove(struct fio_rwlock *);
414d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
4207739b57f09886b41323c605b0dbda7d2c12522bJens Axboe#endif
43