mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 12:48:22 +00:00
advlock: general fixes
This commit is contained in:
+8
-2
@@ -80,7 +80,10 @@ advlock_t *advlock_allocate(void) {
|
||||
}
|
||||
|
||||
void advlock_free(advlock_t *advlock) {
|
||||
advlock->type = ADVLOCK_UNLOCK;
|
||||
advlock->shared_count = 0;
|
||||
advlock->refcount = 1;
|
||||
EVENT_INITHEADER(&advlock->unlock_event);
|
||||
slab_free(advlock_cache, advlock);
|
||||
}
|
||||
|
||||
@@ -270,8 +273,6 @@ static int adv_lock(vnode_t *vnode, int op, advlock_t *lock, bool non_blocking)
|
||||
}
|
||||
|
||||
// can take the lock!
|
||||
lock->type = op;
|
||||
|
||||
if (vnode->advlock == NULL) {
|
||||
// unlocked advlock
|
||||
if (op == ADVLOCK_SHARED) {
|
||||
@@ -281,6 +282,9 @@ static int adv_lock(vnode_t *vnode, int op, advlock_t *lock, bool non_blocking)
|
||||
error = ENOMEM;
|
||||
goto leave;
|
||||
}
|
||||
|
||||
vnode->advlock->type = ADVLOCK_SHARED;
|
||||
vnode->advlock->shared_count = 1;
|
||||
} else {
|
||||
// exclusive lock
|
||||
vnode->advlock = lock;
|
||||
@@ -291,6 +295,8 @@ static int adv_lock(vnode_t *vnode, int op, advlock_t *lock, bool non_blocking)
|
||||
++vnode->advlock->shared_count;
|
||||
}
|
||||
|
||||
lock->type = op;
|
||||
|
||||
leave:
|
||||
MUTEX_RELEASE(&vnode->adv_mutex);
|
||||
return error;
|
||||
|
||||
@@ -7,7 +7,7 @@ syscallret_t syscall_flock(context_t *, int fd, int op_flag) {
|
||||
.ret = -1
|
||||
};
|
||||
|
||||
int op = op_flag &= ~ADVLOCK_NON_BLOCKING;
|
||||
int op = op_flag & ~ADVLOCK_NON_BLOCKING;
|
||||
switch (op) {
|
||||
case ADVLOCK_UNLOCK:
|
||||
case ADVLOCK_SHARED:
|
||||
|
||||
Reference in New Issue
Block a user