mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-02 07:28:21 +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) {
|
void advlock_free(advlock_t *advlock) {
|
||||||
|
advlock->type = ADVLOCK_UNLOCK;
|
||||||
|
advlock->shared_count = 0;
|
||||||
advlock->refcount = 1;
|
advlock->refcount = 1;
|
||||||
|
EVENT_INITHEADER(&advlock->unlock_event);
|
||||||
slab_free(advlock_cache, advlock);
|
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!
|
// can take the lock!
|
||||||
lock->type = op;
|
|
||||||
|
|
||||||
if (vnode->advlock == NULL) {
|
if (vnode->advlock == NULL) {
|
||||||
// unlocked advlock
|
// unlocked advlock
|
||||||
if (op == ADVLOCK_SHARED) {
|
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;
|
error = ENOMEM;
|
||||||
goto leave;
|
goto leave;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vnode->advlock->type = ADVLOCK_SHARED;
|
||||||
|
vnode->advlock->shared_count = 1;
|
||||||
} else {
|
} else {
|
||||||
// exclusive lock
|
// exclusive lock
|
||||||
vnode->advlock = 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;
|
++vnode->advlock->shared_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lock->type = op;
|
||||||
|
|
||||||
leave:
|
leave:
|
||||||
MUTEX_RELEASE(&vnode->adv_mutex);
|
MUTEX_RELEASE(&vnode->adv_mutex);
|
||||||
return error;
|
return error;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ syscallret_t syscall_flock(context_t *, int fd, int op_flag) {
|
|||||||
.ret = -1
|
.ret = -1
|
||||||
};
|
};
|
||||||
|
|
||||||
int op = op_flag &= ~ADVLOCK_NON_BLOCKING;
|
int op = op_flag & ~ADVLOCK_NON_BLOCKING;
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case ADVLOCK_UNLOCK:
|
case ADVLOCK_UNLOCK:
|
||||||
case ADVLOCK_SHARED:
|
case ADVLOCK_SHARED:
|
||||||
|
|||||||
Reference in New Issue
Block a user