#include "flist.h"
#include "filelock.h"
#include "smalloc.h"
-#include "mutex.h"
+#include "fio_sem.h"
#include "hash.h"
#include "log.h"
struct fio_filelock {
uint32_t hash;
- struct fio_mutex lock;
+ struct fio_sem lock;
struct flist_head list;
unsigned int references;
};
-#define MAX_FILELOCKS 128
+#define MAX_FILELOCKS 1024
static struct filelock_data {
struct flist_head list;
- struct fio_mutex lock;
+ struct fio_sem lock;
struct flist_head free_list;
struct fio_filelock ffs[MAX_FILELOCKS];
if (ff || trylock)
break;
- fio_mutex_up(&fld->lock);
+ fio_sem_up(&fld->lock);
usleep(1000);
- fio_mutex_down(&fld->lock);
+ fio_sem_down(&fld->lock);
*retry = 1;
} while (1);
INIT_FLIST_HEAD(&fld->list);
INIT_FLIST_HEAD(&fld->free_list);
- if (__fio_mutex_init(&fld->lock, FIO_MUTEX_UNLOCKED))
+ if (__fio_sem_init(&fld->lock, FIO_SEM_UNLOCKED))
goto err;
for (i = 0; i < MAX_FILELOCKS; i++) {
struct fio_filelock *ff = &fld->ffs[i];
- if (__fio_mutex_init(&ff->lock, FIO_MUTEX_UNLOCKED))
+ if (__fio_sem_init(&ff->lock, FIO_SEM_UNLOCKED))
goto err;
flist_add_tail(&ff->list, &fld->free_list);
}
return;
assert(flist_empty(&fld->list));
- __fio_mutex_remove(&fld->lock);
+ __fio_sem_remove(&fld->lock);
while (!flist_empty(&fld->free_list)) {
struct fio_filelock *ff;
ff = flist_first_entry(&fld->free_list, struct fio_filelock, list);
flist_del_init(&ff->list);
- __fio_mutex_remove(&ff->lock);
+ __fio_sem_remove(&ff->lock);
}
sfree(fld);
hash = jhash(fname, strlen(fname), 0);
- fio_mutex_down(&fld->lock);
+ fio_sem_down(&fld->lock);
ff = fio_hash_get(hash, trylock);
if (ff)
ff->references++;
- fio_mutex_up(&fld->lock);
+ fio_sem_up(&fld->lock);
if (!ff) {
assert(!trylock);
}
if (!trylock) {
- fio_mutex_down(&ff->lock);
+ fio_sem_down(&ff->lock);
return false;
}
- if (!fio_mutex_down_trylock(&ff->lock))
+ if (!fio_sem_down_trylock(&ff->lock))
return false;
- fio_mutex_down(&fld->lock);
+ fio_sem_down(&fld->lock);
/*
* If we raced and the only reference to the lock is us, we can
ff = NULL;
}
- fio_mutex_up(&fld->lock);
+ fio_sem_up(&fld->lock);
if (ff) {
- fio_mutex_down(&ff->lock);
+ fio_sem_down(&ff->lock);
return false;
}
hash = jhash(fname, strlen(fname), 0);
- fio_mutex_down(&fld->lock);
+ fio_sem_down(&fld->lock);
ff = fio_hash_find(hash);
if (ff) {
int refs = --ff->references;
- fio_mutex_up(&ff->lock);
+ fio_sem_up(&ff->lock);
if (!refs) {
flist_del_init(&ff->list);
put_filelock(ff);
} else
log_err("fio: file not found for unlocking\n");
- fio_mutex_up(&fld->lock);
+ fio_sem_up(&fld->lock);
}