Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
W
wendelin.core
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Joshua
wendelin.core
Commits
60dacc49
Commit
60dacc49
authored
Jan 15, 2020
by
Kirill Smelkov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
.
parent
f3985859
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
36 additions
and
33 deletions
+36
-33
wcfs/internal/wcfs_misc.cpp
wcfs/internal/wcfs_misc.cpp
+1
-1
wcfs/internal/wcfs_misc.h
wcfs/internal/wcfs_misc.h
+1
-0
wcfs/internal/wcfs_watchlink.cpp
wcfs/internal/wcfs_watchlink.cpp
+34
-32
No files found.
wcfs/internal/wcfs_misc.cpp
View file @
60dacc49
...
@@ -239,7 +239,7 @@ error Contextf::operator() (error err) const {
...
@@ -239,7 +239,7 @@ error Contextf::operator() (error err) const {
if
(
err
==
nil
)
if
(
err
==
nil
)
return
nil
;
return
nil
;
return
fmt
::
errorf
(
"%s: %s"
,
c
.
errctx
.
c_str
(
),
v
(
err
));
return
fmt
::
errorf
(
"%s: %s"
,
v
(
c
.
errctx
),
v
(
err
));
}
}
}
// xerr::
}
// xerr::
...
...
wcfs/internal/wcfs_misc.h
View file @
60dacc49
...
@@ -200,6 +200,7 @@ template<typename T> string v_(T obj) {
...
@@ -200,6 +200,7 @@ template<typename T> string v_(T obj) {
return
obj
.
String
();
return
obj
.
String
();
}
}
template
<
>
inline
string
v_
(
string
s
)
{
return
s
;
}
// XXX -> const string& ?
template
<
>
string
v_
(
error
);
template
<
>
string
v_
(
error
);
template
<
>
string
v_
(
zodb
::
Tid
);
template
<
>
string
v_
(
zodb
::
Tid
);
template
<
>
string
v_
(
zodb
::
Oid
);
template
<
>
string
v_
(
zodb
::
Oid
);
...
...
wcfs/internal/wcfs_watchlink.cpp
View file @
60dacc49
...
@@ -40,14 +40,14 @@ void _WatchLink::decref() {
...
@@ -40,14 +40,14 @@ void _WatchLink::decref() {
// _openwatch opens new watch link on wcfs.
// _openwatch opens new watch link on wcfs.
pair
<
WatchLink
,
error
>
WCFS
::
_openwatch
()
{
pair
<
WatchLink
,
error
>
WCFS
::
_openwatch
()
{
WCFS
*
wc
=
this
;
WCFS
*
wc
=
this
;
// XXX errctx += "wcfs %s: openwatch", wc.mountpoint ?
xerr
::
Contextf
E
(
"wcfs %s: openwatch"
,
v
(
wc
->
mountpoint
));
// head/watch handle.
// head/watch handle.
os
::
File
f
;
os
::
File
f
;
error
err
;
error
err
;
tie
(
f
,
err
)
=
wc
->
_open
(
"head/watch"
,
O_RDWR
);
tie
(
f
,
err
)
=
wc
->
_open
(
"head/watch"
,
O_RDWR
);
if
(
err
!=
nil
)
if
(
err
!=
nil
)
return
make_pair
(
nil
,
err
);
return
make_pair
(
nil
,
E
(
err
)
);
WatchLink
wlink
=
adoptref
(
new
(
_WatchLink
));
WatchLink
wlink
=
adoptref
(
new
(
_WatchLink
));
wlink
->
_wc
=
wc
;
wlink
->
_wc
=
wc
;
...
@@ -110,14 +110,13 @@ error _WatchLink::close() {
...
@@ -110,14 +110,13 @@ error _WatchLink::close() {
if
(
err
==
nil
)
if
(
err
==
nil
)
err
=
err3
;
err
=
err3
;
//return errctx(err);
//return E(errctx, err);
return
E
(
err
);
return
E
(
err
);
}
}
// _serveRX receives messages from ._f and dispatches them according to streamID.
// _serveRX receives messages from ._f and dispatches them according to streamID.
error
_WatchLink
::
_serveRX
(
context
::
Context
ctx
)
{
// XXX error -> where ?
error
_WatchLink
::
_serveRX
(
context
::
Context
ctx
)
{
// XXX error -> where ?
_WatchLink
&
wlink
=
*
this
;
_WatchLink
&
wlink
=
*
this
;
xerr
::
Contextf
E
(
"wlink X: serve rx"
);
// XXX +wlink details
// when finishing - wakeup everyone waiting for rx
// when finishing - wakeup everyone waiting for rx
defer
([
&
]()
{
defer
([
&
]()
{
...
@@ -149,14 +148,14 @@ error _WatchLink::_serveRX(context::Context ctx) { // XXX error -> where ?
...
@@ -149,14 +148,14 @@ error _WatchLink::_serveRX(context::Context ctx) { // XXX error -> where ?
// XXX place=ok?
// XXX place=ok?
if
(
err
==
io
::
EOF_
)
if
(
err
==
io
::
EOF_
)
err
=
nil
;
err
=
nil
;
return
err
;
return
E
(
err
)
;
}
}
printf
(
"C: watch : rx:
\"
%s
\"
"
,
l
.
c_str
());
printf
(
"C: watch : rx:
\"
%s
\"
"
,
l
.
c_str
());
err
=
pkt
.
from_string
(
l
);
err
=
pkt
.
from_string
(
l
);
//printf("line -> pkt: err='%s'\n", v(err));
//printf("line -> pkt: err='%s'\n", v(err));
if
(
err
!=
nil
)
if
(
err
!=
nil
)
return
err
;
return
E
(
err
)
;
//printf("pkt.stream: %lu\n", pkt.stream);
//printf("pkt.stream: %lu\n", pkt.stream);
//printf("pkt.datalen: %u\n", pkt.datalen);
//printf("pkt.datalen: %u\n", pkt.datalen);
...
@@ -188,7 +187,7 @@ error _WatchLink::_serveRX(context::Context ctx) { // XXX error -> where ?
...
@@ -188,7 +187,7 @@ error _WatchLink::_serveRX(context::Context ctx) { // XXX error -> where ?
});
});
//printf("rxq <- pkt: -> sel #%d\n", _);
//printf("rxq <- pkt: -> sel #%d\n", _);
if
(
_
==
0
)
if
(
_
==
0
)
return
ctx
->
err
(
);
return
E
(
ctx
->
err
()
);
}
}
else
{
else
{
wlink
.
_rxmu
.
lock
();
wlink
.
_rxmu
.
lock
();
...
@@ -206,7 +205,7 @@ error _WatchLink::_serveRX(context::Context ctx) { // XXX error -> where ?
...
@@ -206,7 +205,7 @@ error _WatchLink::_serveRX(context::Context ctx) { // XXX error -> where ?
wlink
.
_acceptq
.
sends
(
&
pkt
),
// 1
wlink
.
_acceptq
.
sends
(
&
pkt
),
// 1
});
});
if
(
_
==
0
)
if
(
_
==
0
)
return
ctx
->
err
(
);
return
E
(
ctx
->
err
()
);
}
}
}
}
}
}
...
@@ -217,6 +216,7 @@ error _WatchLink::_serveRX(context::Context ctx) { // XXX error -> where ?
...
@@ -217,6 +216,7 @@ error _WatchLink::_serveRX(context::Context ctx) { // XXX error -> where ?
// XXX +ctx?
// XXX +ctx?
error
_WatchLink
::
_send
(
StreamID
stream
,
const
string
&
msg
)
{
error
_WatchLink
::
_send
(
StreamID
stream
,
const
string
&
msg
)
{
_WatchLink
*
wlink
=
this
;
_WatchLink
*
wlink
=
this
;
// XXX +errctx ?
if
(
msg
.
find
(
'\n'
)
!=
string
::
npos
)
if
(
msg
.
find
(
'\n'
)
!=
string
::
npos
)
panic
(
"msg has
\\
n"
);
panic
(
"msg has
\\
n"
);
string
pkt
=
fmt
::
sprintf
(
"%lu %s
\n
"
,
stream
,
msg
.
c_str
());
string
pkt
=
fmt
::
sprintf
(
"%lu %s
\n
"
,
stream
,
msg
.
c_str
());
...
@@ -228,6 +228,7 @@ error _twlinkwrite(WatchLink wlink, const string &pkt) {
...
@@ -228,6 +228,7 @@ error _twlinkwrite(WatchLink wlink, const string &pkt) {
}
}
error
_WatchLink
::
_write
(
const
string
&
pkt
)
{
error
_WatchLink
::
_write
(
const
string
&
pkt
)
{
_WatchLink
*
wlink
=
this
;
_WatchLink
*
wlink
=
this
;
// XXX +errctx ?
wlink
->
_txmu
.
lock
();
wlink
->
_txmu
.
lock
();
defer
([
&
]()
{
defer
([
&
]()
{
...
@@ -245,7 +246,7 @@ error _WatchLink::_write(const string &pkt) {
...
@@ -245,7 +246,7 @@ error _WatchLink::_write(const string &pkt) {
// XXX -> reply | None when EOF
// XXX -> reply | None when EOF
pair
<
string
,
error
>
_WatchLink
::
sendReq
(
context
::
Context
ctx
,
const
string
&
req
)
{
pair
<
string
,
error
>
_WatchLink
::
sendReq
(
context
::
Context
ctx
,
const
string
&
req
)
{
_WatchLink
*
wlink
=
this
;
_WatchLink
*
wlink
=
this
;
// XXX errctx
xerr
::
Contextf
E
(
"wlink X: sendReq"
);
// XXX wlink details
//printf("wlink sendReq '%s'\n", req.c_str());
//printf("wlink sendReq '%s'\n", req.c_str());
...
@@ -254,7 +255,7 @@ pair<string, error> _WatchLink::sendReq(context::Context ctx, const string &req)
...
@@ -254,7 +255,7 @@ pair<string, error> _WatchLink::sendReq(context::Context ctx, const string &req)
error
err
;
error
err
;
tie
(
rxq
,
err
)
=
wlink
->
_sendReq
(
ctx
,
req
);
tie
(
rxq
,
err
)
=
wlink
->
_sendReq
(
ctx
,
req
);
if
(
err
!=
nil
)
if
(
err
!=
nil
)
return
make_pair
(
""
,
err
);
return
make_pair
(
""
,
E
(
err
)
);
//printf("sendReq: wait ...\n");
//printf("sendReq: wait ...\n");
int
_
=
select
({
int
_
=
select
({
...
@@ -263,10 +264,10 @@ pair<string, error> _WatchLink::sendReq(context::Context ctx, const string &req)
...
@@ -263,10 +264,10 @@ pair<string, error> _WatchLink::sendReq(context::Context ctx, const string &req)
});
});
//printf("sendReq: woken up #%d\n", _);
//printf("sendReq: woken up #%d\n", _);
if
(
_
==
0
)
if
(
_
==
0
)
return
make_pair
(
""
,
ctx
->
err
(
));
return
make_pair
(
""
,
E
(
ctx
->
err
()
));
if
(
!
ok
)
if
(
!
ok
)
return
make_pair
(
""
,
io
::
ErrUnexpectedEOF
);
// XXX error ok?
return
make_pair
(
""
,
E
(
io
::
ErrUnexpectedEOF
)
);
// XXX error ok?
string
reply
=
rx
.
to_string
();
string
reply
=
rx
.
to_string
();
//printf("sendReq: reply='%s'\n", reply.c_str());
//printf("sendReq: reply='%s'\n", reply.c_str());
return
make_pair
(
reply
,
nil
);
return
make_pair
(
reply
,
nil
);
...
@@ -313,7 +314,7 @@ tuple</*rxq*/chan<rxPkt>, error> _WatchLink::_sendReq(context::Context ctx, cons
...
@@ -313,7 +314,7 @@ tuple</*rxq*/chan<rxPkt>, error> _WatchLink::_sendReq(context::Context ctx, cons
// XXX document EOF.
// XXX document EOF.
error
_WatchLink
::
replyReq
(
context
::
Context
ctx
,
const
PinReq
*
req
,
const
string
&
answer
)
{
error
_WatchLink
::
replyReq
(
context
::
Context
ctx
,
const
PinReq
*
req
,
const
string
&
answer
)
{
_WatchLink
*
wlink
=
this
;
_WatchLink
*
wlink
=
this
;
// XXX errctx?
xerr
::
Contextf
E
(
"wlink X: replyReq"
);
// XXX +wlink details
//print('C: reply %s <- %r ...' % (req, answer))
//print('C: reply %s <- %r ...' % (req, answer))
wlink
->
_rxmu
.
lock
();
wlink
->
_rxmu
.
lock
();
...
@@ -334,14 +335,14 @@ error _WatchLink::replyReq(context::Context ctx, const PinReq *req, const string
...
@@ -334,14 +335,14 @@ error _WatchLink::replyReq(context::Context ctx, const PinReq *req, const string
panic
(
"BUG: stream vanished from wlink._accepted while reply was in progress"
);
panic
(
"BUG: stream vanished from wlink._accepted while reply was in progress"
);
// XXX also track as answered? (and don't accept with the same ID ?)
// XXX also track as answered? (and don't accept with the same ID ?)
return
err
;
return
E
(
err
)
;
}
}
// recvReq receives client <- server request.
// recvReq receives client <- server request.
static
error
_parsePinReq
(
PinReq
*
pin
,
const
rxPkt
*
pkt
);
static
error
_parsePinReq
(
PinReq
*
pin
,
const
rxPkt
*
pkt
);
error
_WatchLink
::
recvReq
(
context
::
Context
ctx
,
PinReq
*
prx
)
{
error
_WatchLink
::
recvReq
(
context
::
Context
ctx
,
PinReq
*
prx
)
{
_WatchLink
&
wlink
=
*
this
;
_WatchLink
&
wlink
=
*
this
;
// XXX errctx?
xerr
::
Contextf
E
(
"wlink X: recvReq"
);
// XXX +wlink details
rxPkt
pkt
;
rxPkt
pkt
;
bool
ok
;
bool
ok
;
...
@@ -350,17 +351,16 @@ error _WatchLink::recvReq(context::Context ctx, PinReq *prx) {
...
@@ -350,17 +351,16 @@ error _WatchLink::recvReq(context::Context ctx, PinReq *prx) {
wlink
.
_acceptq
.
recvs
(
&
pkt
,
&
ok
),
// 1
wlink
.
_acceptq
.
recvs
(
&
pkt
,
&
ok
),
// 1
});
});
if
(
_
==
0
)
if
(
_
==
0
)
return
ctx
->
err
(
);
return
E
(
ctx
->
err
()
);
if
(
!
ok
)
if
(
!
ok
)
return
io
::
EOF_
;
return
io
::
EOF_
;
// NOTE EOF goes without E
return
_parsePinReq
(
prx
,
&
pkt
);
return
E
(
_parsePinReq
(
prx
,
&
pkt
)
);
}
}
// _parsePinReq parses message into PinReq according to wcfs invalidation protocol.
// _parsePinReq parses message into PinReq according to wcfs invalidation protocol.
static
error
_parsePinReq
(
PinReq
*
pin
,
const
rxPkt
*
pkt
)
{
static
error
_parsePinReq
(
PinReq
*
pin
,
const
rxPkt
*
pkt
)
{
// XXX errctx "bad pin"
//printf("parse pinreq: stream=%lu msg='%s'\n", pkt->stream, &pkt->data[0]);
//printf("parse pinreq: stream=%lu msg='%s'\n", pkt->stream, &pkt->data[0]);
pin
->
stream
=
pkt
->
stream
;
pin
->
stream
=
pkt
->
stream
;
string
msg
=
pkt
->
to_string
();
string
msg
=
pkt
->
to_string
();
...
@@ -368,37 +368,37 @@ static error _parsePinReq(PinReq *pin, const rxPkt *pkt) {
...
@@ -368,37 +368,37 @@ static error _parsePinReq(PinReq *pin, const rxPkt *pkt) {
//printf("'%s'\n", msg.c_str());
//printf("'%s'\n", msg.c_str());
//printf("has_prefix: %i\n", strings::has_prefix(msg, "pin "));
//printf("has_prefix: %i\n", strings::has_prefix(msg, "pin "));
xerr
::
Contextf
E
(
"bad pin: '%s'"
,
v
(
msg
));
// pin <foid>) #<blk> @<at>
// pin <foid>) #<blk> @<at>
if
(
!
strings
::
has_prefix
(
msg
,
"pin "
))
{
if
(
!
strings
::
has_prefix
(
msg
,
"pin "
))
{
//printf("\n\n\nnot a pin request: '%s'\n", msg.c_str()); // XXX temp
return
E
(
fmt
::
errorf
(
"not a pin request"
));
//abort();
return
fmt
::
errorf
(
"not a pin request: '%s'"
,
msg
.
c_str
());
// XXX msg -> errctx ?
}
}
auto
argv
=
strings
::
split
(
msg
.
substr
(
4
),
' '
);
auto
argv
=
strings
::
split
(
msg
.
substr
(
4
),
' '
);
if
(
argv
.
size
()
!=
3
)
if
(
argv
.
size
()
!=
3
)
return
fmt
::
errorf
(
"expected 3 arguments, got %zd"
,
argv
.
size
(
));
return
E
(
fmt
::
errorf
(
"expected 3 arguments, got %zd"
,
argv
.
size
()
));
error
err
;
error
err
;
tie
(
pin
->
foid
,
err
)
=
xstrconv
::
parseHex64
(
argv
[
0
]);
tie
(
pin
->
foid
,
err
)
=
xstrconv
::
parseHex64
(
argv
[
0
]);
if
(
err
!=
nil
)
if
(
err
!=
nil
)
return
fmt
::
errorf
(
"invalid foid"
);
return
E
(
fmt
::
errorf
(
"invalid foid"
)
);
if
(
!
strings
::
has_prefix
(
argv
[
1
],
'#'
))
if
(
!
strings
::
has_prefix
(
argv
[
1
],
'#'
))
return
fmt
::
errorf
(
"invalid blk"
);
return
E
(
fmt
::
errorf
(
"invalid blk"
)
);
tie
(
pin
->
blk
,
err
)
=
xstrconv
::
parseInt
(
argv
[
1
].
substr
(
1
));
tie
(
pin
->
blk
,
err
)
=
xstrconv
::
parseInt
(
argv
[
1
].
substr
(
1
));
if
(
err
!=
nil
)
if
(
err
!=
nil
)
return
fmt
::
errorf
(
"invalid blk"
);
return
E
(
fmt
::
errorf
(
"invalid blk"
)
);
if
(
!
strings
::
has_prefix
(
argv
[
2
],
'@'
))
if
(
!
strings
::
has_prefix
(
argv
[
2
],
'@'
))
return
fmt
::
errorf
(
"invalid at"
);
return
E
(
fmt
::
errorf
(
"invalid at"
)
);
auto
at
=
argv
[
2
].
substr
(
1
);
auto
at
=
argv
[
2
].
substr
(
1
);
if
(
at
==
"head"
)
{
if
(
at
==
"head"
)
{
pin
->
at
=
TidHead
;
pin
->
at
=
TidHead
;
}
else
{
}
else
{
tie
(
pin
->
at
,
err
)
=
xstrconv
::
parseHex64
(
at
);
tie
(
pin
->
at
,
err
)
=
xstrconv
::
parseHex64
(
at
);
if
(
err
!=
nil
)
if
(
err
!=
nil
)
return
fmt
::
errorf
(
"invalid at"
);
return
E
(
fmt
::
errorf
(
"invalid at"
)
);
}
}
return
nil
;
return
nil
;
...
@@ -407,6 +407,7 @@ static error _parsePinReq(PinReq *pin, const rxPkt *pkt) {
...
@@ -407,6 +407,7 @@ static error _parsePinReq(PinReq *pin, const rxPkt *pkt) {
// _readline reads next raw line sent from wcfs.
// _readline reads next raw line sent from wcfs.
tuple
<
string
,
error
>
_WatchLink
::
_readline
()
{
tuple
<
string
,
error
>
_WatchLink
::
_readline
()
{
_WatchLink
&
wlink
=
*
this
;
_WatchLink
&
wlink
=
*
this
;
// XXX errctx ?
char
buf
[
128
];
char
buf
[
128
];
size_t
nl_searchfrom
=
0
;
size_t
nl_searchfrom
=
0
;
...
@@ -441,24 +442,25 @@ tuple<string, error> _WatchLink::_readline() {
...
@@ -441,24 +442,25 @@ tuple<string, error> _WatchLink::_readline() {
// from_string parses string into rxPkt.
// from_string parses string into rxPkt.
error
rxPkt
::
from_string
(
const
string
&
rx
)
{
error
rxPkt
::
from_string
(
const
string
&
rx
)
{
rxPkt
&
pkt
=
*
this
;
rxPkt
&
pkt
=
*
this
;
xerr
::
Contextf
E
(
"invalid pkt"
);
// <stream> ... \n
// <stream> ... \n
auto
sp
=
rx
.
find
(
' '
);
auto
sp
=
rx
.
find
(
' '
);
if
(
sp
==
string
::
npos
)
if
(
sp
==
string
::
npos
)
return
fmt
::
errorf
(
"invalid pkt: no SP"
);
return
E
(
fmt
::
errorf
(
"no SP"
)
);
if
(
!
strings
::
has_suffix
(
rx
,
'\n'
))
if
(
!
strings
::
has_suffix
(
rx
,
'\n'
))
return
fmt
::
errorf
(
"invalid pkt: no LF"
);
return
E
(
fmt
::
errorf
(
"no LF"
)
);
string
sid
=
rx
.
substr
(
0
,
sp
);
string
sid
=
rx
.
substr
(
0
,
sp
);
string
smsg
=
strings
::
trim_suffix
(
rx
.
substr
(
sp
+
1
),
'\n'
);
string
smsg
=
strings
::
trim_suffix
(
rx
.
substr
(
sp
+
1
),
'\n'
);
error
err
;
error
err
;
tie
(
pkt
.
stream
,
err
)
=
xstrconv
::
parseUint
(
sid
);
tie
(
pkt
.
stream
,
err
)
=
xstrconv
::
parseUint
(
sid
);
if
(
err
!=
nil
)
if
(
err
!=
nil
)
return
fmt
::
errorf
(
"invalid pkt: invalid stream ID"
);
return
E
(
fmt
::
errorf
(
"invalid stream ID"
)
);
auto
msglen
=
smsg
.
length
();
auto
msglen
=
smsg
.
length
();
if
(
msglen
>
ARRAY_SIZE
(
pkt
.
data
))
if
(
msglen
>
ARRAY_SIZE
(
pkt
.
data
))
return
fmt
::
errorf
(
"invalid pkt: len(msg) > %zu"
,
ARRAY_SIZE
(
pkt
.
data
));
return
E
(
fmt
::
errorf
(
"len(msg) > %zu"
,
ARRAY_SIZE
(
pkt
.
data
)
));
memcpy
(
pkt
.
data
,
smsg
.
c_str
(),
msglen
);
memcpy
(
pkt
.
data
,
smsg
.
c_str
(),
msglen
);
pkt
.
datalen
=
msglen
;
pkt
.
datalen
=
msglen
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment