Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
redox
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Pirson Bethancourt
redox
Commits
d329f7c7
Commit
d329f7c7
authored
8 years ago
by
Jeremy Soller
Browse files
Options
Downloads
Patches
Plain Diff
Fix deadlock
parent
791dbfa7
No related branches found
No related tags found
No related merge requests found
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
kernel/scheme/root.rs
+3
-4
3 additions, 4 deletions
kernel/scheme/root.rs
kernel/scheme/user.rs
+5
-3
5 additions, 3 deletions
kernel/scheme/user.rs
kernel/syscall/mod.rs
+2
-0
2 additions, 0 deletions
kernel/syscall/mod.rs
kernel/syscall/process.rs
+27
-22
27 additions, 22 deletions
kernel/syscall/process.rs
with
37 additions
and
29 deletions
kernel/scheme/root.rs
+
3
−
4
View file @
d329f7c7
...
...
@@ -2,7 +2,6 @@ use alloc::arc::Arc;
use
alloc
::
boxed
::
Box
;
use
collections
::
BTreeMap
;
use
core
::
sync
::
atomic
::{
AtomicUsize
,
Ordering
};
use
core
::
str
;
use
spin
::
RwLock
;
use
syscall
::{
Error
,
Result
};
...
...
@@ -24,7 +23,7 @@ impl RootScheme {
}
impl
Scheme
for
RootScheme
{
fn
open
(
&
self
,
path
:
&
[
u8
],
flags
:
usize
)
->
Result
<
usize
>
{
fn
open
(
&
self
,
path
:
&
[
u8
],
_
flags
:
usize
)
->
Result
<
usize
>
{
let
inner
=
{
let
mut
schemes
=
scheme
::
schemes_mut
();
if
schemes
.get_name
(
path
)
.is_some
()
{
...
...
@@ -42,14 +41,14 @@ impl Scheme for RootScheme {
}
fn
dup
(
&
self
,
file
:
usize
)
->
Result
<
usize
>
{
let
mut
handles
=
self
.handles
.write
();
let
inner
=
{
let
handles
=
self
.handles
.read
();
let
inner
=
handles
.get
(
&
file
)
.ok_or
(
Error
::
BadFile
)
?
;
inner
.clone
()
};
let
id
=
self
.next_id
.fetch_add
(
1
,
Ordering
::
SeqCst
);
self
.
handles
.
write
()
.
insert
(
id
,
inner
);
handles
.insert
(
id
,
inner
);
Ok
(
id
)
}
...
...
This diff is collapsed.
Click to expand it.
kernel/scheme/user.rs
+
5
−
3
View file @
d329f7c7
...
...
@@ -48,8 +48,11 @@ impl UserInner {
self
.todo
.lock
()
.push_back
(
packet
);
loop
{
if
let
Some
(
a
)
=
self
.done
.lock
()
.remove
(
&
id
)
{
return
convert_to_result
(
a
);
{
let
mut
done
=
self
.done
.lock
();
if
let
Some
(
a
)
=
done
.remove
(
&
id
)
{
return
convert_to_result
(
a
);
}
}
unsafe
{
context
::
switch
();
}
...
...
@@ -89,7 +92,6 @@ impl UserInner {
while
i
<
len
{
let
packet
=
unsafe
{
*
(
buf
.as_ptr
()
as
*
const
Packet
)
.offset
(
i
as
isize
)
};
self
.done
.lock
()
.insert
(
packet
.id
,
packet
.a
);
i
+=
1
;
}
...
...
This diff is collapsed.
Click to expand it.
kernel/syscall/mod.rs
+
2
−
0
View file @
d329f7c7
...
...
@@ -25,6 +25,8 @@ mod validate;
pub
extern
fn
syscall
(
a
:
usize
,
b
:
usize
,
c
:
usize
,
d
:
usize
,
e
:
usize
,
f
:
usize
,
stack
:
usize
)
->
usize
{
#[inline(always)]
fn
inner
(
a
:
usize
,
b
:
usize
,
c
:
usize
,
d
:
usize
,
e
:
usize
,
_f
:
usize
,
stack
:
usize
)
->
Result
<
usize
>
{
//println!("{}: {:?}: {} {} {} {}", ::context::context_id(), Call::from(a), a, b, c, d);
match
Call
::
from
(
a
)
{
Some
(
call
)
=>
match
call
{
Call
::
Exit
=>
exit
(
b
),
...
...
This diff is collapsed.
Click to expand it.
kernel/syscall/process.rs
+
27
−
22
View file @
d329f7c7
...
...
@@ -174,31 +174,36 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<usize> {
if
flags
&
CLONE_FILES
==
CLONE_FILES
{
files
=
context
.files
.clone
();
}
else
{
let
mut
files_vec
=
Vec
::
new
();
for
(
fd
,
file_option
)
in
context
.files
.lock
()
.iter
()
.enumerate
()
{
if
let
Some
(
file
)
=
*
file_option
{
let
result
=
{
let
scheme
=
{
let
schemes
=
scheme
::
schemes
();
let
scheme
=
schemes
.get
(
file
.scheme
)
.ok_or
(
Error
::
BadFile
)
?
;
scheme
.clone
()
};
let
result
=
scheme
.dup
(
file
.number
);
result
files
=
Arc
::
new
(
Mutex
::
new
(
context
.files
.lock
()
.clone
()));
}
}
if
flags
&
CLONE_FILES
==
0
{
for
(
fd
,
mut
file_option
)
in
files
.lock
()
.iter_mut
()
.enumerate
()
{
let
new_file_option
=
if
let
Some
(
file
)
=
*
file_option
{
let
result
=
{
let
scheme
=
{
let
schemes
=
scheme
::
schemes
();
let
scheme
=
schemes
.get
(
file
.scheme
)
.ok_or
(
Error
::
BadFile
)
?
;
scheme
.clone
()
};
match
result
{
Ok
(
new_number
)
=>
{
files_vec
.push
(
Some
(
context
::
file
::
File
{
scheme
:
file
.scheme
,
number
:
new_number
}));
},
Err
(
err
)
=>
{
println!
(
"clone: failed to dup {}: {:?}"
,
fd
,
err
);
}
let
result
=
scheme
.dup
(
file
.number
);
result
};
match
result
{
Ok
(
new_number
)
=>
{
Some
(
context
::
file
::
File
{
scheme
:
file
.scheme
,
number
:
new_number
})
},
Err
(
err
)
=>
{
println!
(
"clone: failed to dup {}: {:?}"
,
fd
,
err
);
None
}
}
else
{
files_vec
.push
(
None
);
}
}
files
=
Arc
::
new
(
Mutex
::
new
(
files_vec
));
}
else
{
None
};
*
file_option
=
new_file_option
;
}
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment