annotate net.rhope @ 147:f3686f60985d

Sort of working port of framework. Transaction bug seems to be getting in the way. Going to work around, but want the old version in the repo so I can test later.
author Mike Pavone <pavone@retrodev.com>
date Mon, 22 Nov 2010 01:15:02 -0500
parents 357f4ce3ca6d
children e9a8269384bb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
142
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
2 Foreign C:libc
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
3 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
4 setsockopt[sockfd(Int32,Naked),level(Int32,Naked),optname(Int32,Naked),optval(Int32,Raw Pointer),optlen(Int32,Naked):out(Int32,Naked)]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5 listen[sockfd(Int32,Naked),backlog(Int32,Naked):out(Int32,Naked)]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
6 send[sockfd(Int32,Naked),data(Array,Raw Pointer),datalen(Int64,Naked):out(Int32,Naked)]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
7 recv[sockfd(Int32,Naked),data(Array,Raw Pointer,Mutable),maxlen(Int64,Naked):out(Int32,Naked),data]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
8 fcntl[fd(Int32,Naked),command(Int32,Naked),value(Int64,Naked):out(Int32,Naked)]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
9 pipe[descriptors(Array,Raw Pointer,Mutable):out(Int32,Naked),descriptors]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
10 epoll_create[size(Int32,Naked):status(Int32,Naked)]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
11 epoll_ctl[epfd(Int32,Naked),operation(Int32,Naked),fd(Int32,Naked),event(epoll_event,Raw Pointer):status(Int32,Naked)]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
12 epoll_wait[epfd(Int32,Naked),events(Array,Raw Pointer,Mutable),maxevents(Int32,Naked),timeout(Int32,Naked):out(Int32,Naked),events]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
13 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
14
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
15
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
16 //Note: port numbers would more properly be UInt16, think about changing later
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
17 Foreign C:runtime
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
18 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
19 _internal_bindnewsocket[port(Int32,Naked),setreuse(Int32,Naked):socket(Int32,Naked)]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
20 _internal_accept[sockfd(Int32,Naked),addrbuf(Array,Raw Pointer,Mutable),buflen(Int32,Naked):consock(Int32,Naked),addrbuf]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
21 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
22
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
23 Blueprint epoll_event
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
24 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
25 events(UInt32,Naked)
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
26 data(Int64,Naked)
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
27 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
28
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
29 //EPOLLIN 1
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
30 //EPOLLOUT 4
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
31 //EPOLLPRI 2
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
32 //EPOLL_CTL_ADD 1
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
33 //EPOLL_CTL_DEL 2
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
34 //EPOLL_CTL_MOD 3
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
35
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
36 _Add New FDs[epfd,pipefd:out]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
37 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
38 count,rdata <- read[pipefd, _internal_array_allocnaked[2,Int32()], 8i64]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
39 ,out <- If[[count]=[8i64]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
40 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
41 data <- [rdata]Length <<[2]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
42 epoll_ctl[epfd, 1i32, [data]Index[0], [[Build[epoll_event()]]events <<[Abs UInt[[data]Index[1]]]]data <<[Int64[[data]Index[0]]]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
43 { out <- _Add New FDs[epfd,pipefd] }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
44 }{
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
45 //TODO: Properly deal with the case when count > 0 but < 8
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
46 If[[count]>[0i64]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
47 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
48 Print[["read of listener pipe returned unexpected number of bytes: "]Append[String[count]]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
49 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
50 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
51 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
52
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
53 _Get IO Context[fd:out,notfound] uses socklisten
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
54 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
55 out,notfound <- [socklisten::fdlookup]Index[fd]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
56 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
57
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
58 _Handle Events[epfd,pipefd,buf,cur:out]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
59 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
60 event,out <- [buf]Index[cur]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
61 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
62 If[[event]data >>]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
63 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
64 activefd <- Trunc Int32[[event]data >>]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
65 epoll_ctl[epfd, 2, activefd, Build[epoll_event()]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
66 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
67 If[[[event]events >>]&[8216u32]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
68 { res <- No }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
69 { res <- Yes }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
70 ct,cont <- _Get IO Context[activefd]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
71 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
72 }{ Print["Could not find context for IO event"] }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
73 ,cont <- Resume[ct,res]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
74 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
75 cont <- Yield[]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
76 }{
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
77 Print["could not resume context for IO event"]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
78 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
79 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
80 }{
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
81 cont <- _Add New FDs[epfd,pipefd]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
82 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
83 Val[cont]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
84 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
85 out <- _Handle Events[epfd,pipefd,buf,[cur]+[1]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
86 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
87 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
88 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
89
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
90 _Wait Active[epfd,pipefd,buf]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
91 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
92 workaround <- Yield[]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
93 Val[workaround]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
94 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
95 count,newbuf <- epoll_wait[epfd,buf,[buf]Storage >>,-1]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
96 If[[count]=[-1]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
97 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
98 Print["epoll_wait returned error"]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
99 }{
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
100 If[[count]=[0]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
101 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
102 //Shouldn't happen normally, but perhaps if there was a signal
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
103 _Wait Active[epfd,pipefd,buf]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
104 }{
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
105 _Handle Events[epfd,pipefd,[newbuf]Length <<[count],0]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
106 { _Wait Active[epfd,pipefd,buf] }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
107 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
108 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
109 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
110 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
111
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
112 _Sock Listener[pipefd]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
113 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
114 epfd <- epoll_create[16]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
115 If[[epfd]=[-1]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
116 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
117 Print["Error creating epoll file descriptor"]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
118 }{
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
119 If[[epoll_ctl[epfd,1i32,pipefd,[[Build[epoll_event()]]events <<[1u32]]data <<[0i64]]]=[-1]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
120 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
121 Print["Error adding pipe to epoll fd"]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
122 }{
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
123 _Wait Active[epfd, pipefd, _internal_array_allocnaked[8,epoll_event()]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
124 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
125 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
126 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
127
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
128 Globals socklisten
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
129 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
130 listener started <- No
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
131 fdlookup <- ()
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
132 pipefd <- -1
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
133 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
134
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
135 _Add FD to Listener[fd,context:pipefd,err] uses socklisten
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
136 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
137 If[socklisten::listener started]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
138 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
139 pipefd <- socklisten::pipefd
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
140 do add <- Yes
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
141 }{
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
142 //Calling a function with side effects inside a transaction is BAD
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
143 //Need to do something about this
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
144 ret,des <- pipe[[Array[]]Set[1, 0i32]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
145 If[[ret]=[-1]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
146 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
147 err <- "Error creating pipe for waking up socket listener"
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
148 }{
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
149 socklisten::pipefd <- [des]Index[1]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
150 pipefd <- [des]Index[1]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
151 //fcntl[fd, F_SETFL, O_NONBLOCK]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
152 //Set both ends of the pipe to non blocking
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
153 fcntl[[des]Index[0], 4i32, 2048i64]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
154 fcntl[[des]Index[1], 4i32, 2048i64]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
155 socklisten::listener started <- Yes
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
156 Call Async[_Sock Listener[[des]Index[0],?]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
157 do add <- Yes
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
158 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
159 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
160 Val[do add]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
161 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
162 socklisten::fdlookup <- [socklisten::fdlookup]Set[fd, context]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
163 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
164 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
165
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
166 _Write to Listener Pipe[pipefd,data]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
167 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
168 res <- write[pipefd, data, 8i64]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
169 If[[res]!=[8i32]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
170 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
171 workaround <- Yield[]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
172 Val[workaround]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
173 { _Write to Listener Pipe[pipefd,data] }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
174 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
175 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
176
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
177 _Wait for IO[fd,type,context]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
178 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
179 _Add FD to Listener[fd,context]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
180 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
181 _Write to Listener Pipe[~,[[Array[]]Append[fd]]Append[type]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
182 }{
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
183 Print[~]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
184 { Resume[context,No] }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
185 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
186 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
187
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
188 Wait for IO[fd,type:out]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
189 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
190 out <- Pause[_Wait for IO[fd,type,?]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
191 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
192
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
193 _Do Con Call[newfd,address,tocall]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
194 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
195 [tocall]Call[newfd,address]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
196 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
197
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
198 _Null Term[raw str,cur:out]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
199 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
200 [raw str]Index[cur]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
201 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
202 If[[~]=[0u8]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
203 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
204 out <- String[[raw str]Length <<[cur]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
205 }{
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
206 out <- _Null Term[raw str, [cur]+[1]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
207 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
208 }{
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
209 out <- String[raw str]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
210 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
211 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
212
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
213 _Port Wait[fd,tocall:out]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
214 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
215 con <- _internal_accept[fd,_internal_array_allocnaked[40,UInt8()],40] {}
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
216 { address <- _Null Term[[~]Length <<[40], 0i32] }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
217 If[[con]=[-1]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
218 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
219 If[Wait for IO[fd, 1i32]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
220 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
221 out <- _Port Wait[fd,tocall]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
222 }{
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
223 Print["Error waiting for connection"]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
224 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
225 }{
143
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
226 fcntl[con, 4i32, 2048i64]
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
227 { Call Async[_Do Con Call[TCP Connection[con],address,tocall,?]]
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
228 { out <- _Port Wait[fd,tocall] }}
142
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
229 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
230 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
231
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
232 Listen on Port[port(Int32),tocall:out]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
233 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
234 fd <- _internal_bindnewsocket[port,1]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
235 //fcntl[fd, F_SETFL, O_NONBLOCK]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
236 //Set listen socket to non blocking
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
237 If[[fd]=[-1]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
238 { out <- No }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
239 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
240 fcntl[fd, 4i32, 2048i64]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
241 { listen[fd,8]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
242 { out <- Call Async[_Port Wait[fd,tocall,?]] }}
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
243 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
244 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
245
143
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
246 Blueprint TCP Connection
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
247 {
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
248 Filedes
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
249 Read Buffer
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
250 }
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
251
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
252 TCP Connection[fd:out]
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
253 {
144
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
254 out <- [[Build[TCP Connection()]
143
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
255 ]Filedes <<[fd]
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
256 ]Read Buffer <<[Array[]]
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
257 }
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
258
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
259 _Write@TCP Connection[con,buffer,wrote:out,err]
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
260 {
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
261
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
262 new wrote <- write[[con]Filedes >>, buffer, Int64[[buffer]Length]]
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
263 If[[new wrote]=[-1]]
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
264 {
144
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
265 If[Wait for IO[[con]Filedes >>, 4]]
143
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
266 {
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
267 out,err <- [con]_Write[buffer,wrote]
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
268 }{
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
269 err <- wrote
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
270 }
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
271 }{
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
272 If[[new wrote]=[[buffer]Length]]
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
273 {
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
274 out <- con
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
275 }{
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
276 remaining <- [[buffer]Length]-[new wrote]
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
277 next buf <- [_internal_array_copychunk[buffer, new wrote, _internal_array_allocnaked[remaining,UInt8()], 0, remaining]]Length <<[remaining]
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
278 out,err <- [con]_Write[next buf,[wrote]+[new wrote]]
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
279 }
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
280 }
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
281 }
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
282
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
283 Write@TCP Connection[con,buffer(Array):out,err]
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
284 {
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
285 If[[buffer]Length]
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
286 {
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
287 out,err <- [con]_Write[buffer,0]
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
288 }{
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
289 out <- con
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
290 }
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
291 }
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
292
144
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
293 _Read@TCP Connection[con,toread,buflist:data,out con,err]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
294 {
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
295 read[[con]Filedes >>, _internal_array_allocnaked[toread, UInt8()], Int64[toread]]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
296 { numread <- Trunc Int32[~] }
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
297 { outbuf <- [~]Length <<[numread] }
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
298 If[[numread]=[-1]]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
299 {
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
300 If[Wait for IO[[con]Filedes >>, 1]]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
301 {
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
302 data,out con,err <- [con]_Read[toread,buflist]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
303 }{
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
304 err <- Fold[_Add Len[?], 0, buflist]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
305 }
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
306 }{
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
307 If[[numread]=[toread]]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
308 {
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
309 data <- [buflist]Append[outbuf]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
310 out con <- con
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
311 }{
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
312 data,out con,err <- [con]_Read[[toread]-[numread], [buflist]Append[outbuf]]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
313 }
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
314 }
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
315 }
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
316
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
317 _Add Len[len,buf:out]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
318 {
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
319 out <- [len]+[[buf]Length]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
320 }
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
321
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
322 _Merge One Buf[inprog,src:out]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
323 {
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
324 oldlen <- [inprog]Length
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
325 srclen <- [src]Length
145
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
326 If[srclen]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
327 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
328 out <- [_internal_array_copychunk[src, 0, inprog, oldlen, srclen]]Length <<[[oldlen]+[srclen]]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
329 }{
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
330 out <- inprog
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
331 }
144
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
332 }
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
333
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
334 _Merge Buffers[buflist:out]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
335 {
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
336 If[[[buflist]Length]=[1]]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
337 {
145
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
338 out <- [buflist]Index[0]{}
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
339 { Print["This shouldn't happen!!!!"] }
144
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
340 }{
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
341 len <- Fold[_Add Len[?], 0, buflist]
145
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
342 out <- Fold[_Merge One Buf[?], _internal_array_allocnaked[len, UInt8()], buflist]
144
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
343 }
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
344 }
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
345
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
346 Read@TCP Connection[con,toread(Int32):data,out con,err]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
347 {
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
348 buflen <- [[con]Read Buffer >>]Length
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
349 If[[toread]=[buflen]]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
350 {
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
351 data <- [con]Read Buffer >>
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
352 out con <- [con]Read Buffer <<[Array[]]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
353 }{
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
354 If[[toread]<[buflen]]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
355 {
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
356 data <- [[con]Read Buffer >>]Slice[toread] {}
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
357 { out con <- [con]Read Buffer <<[~] }
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
358 }{
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
359 If[buflen]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
360 {
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
361 buflist <- [()]Append[[con]Read Buffer >>]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
362 ntoread <- [toread]-[[[con]Read Buffer >>]Length]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
363 }{
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
364 ntoread <- Val[toread]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
365 buflist <- ()
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
366 }
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
367 ,out con,err <- [[con]Read Buffer <<[Array[]]]_Read[ntoread,buflist]
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
368 { data <- _Merge Buffers[~] }
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
369 }
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
370 }
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
371 }
65ebd1ce2611 Add Read method to TCP connection
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
372
145
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
373 _Check Partial[buffer,delim,offset:partial,none]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
374 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
375 none <- If[[offset]=[[buffer]Length]] {}
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
376 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
377 left <- [[buffer]Length]-[offset]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
378 If[_internal_memcmp_offset[buffer, offset, delim, 0, left]]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
379 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
380 partial,none <- _Check Partial[buffer,delim,[offset]+[1]]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
381 }{
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
382 partial <- offset
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
383 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
384 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
385 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
386
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
387 _Check Buffer[buffer,delim,offset:out,partial,none]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
388 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
389 dlen <- [delim]Length
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
390 blen <- [buffer]Length
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
391 If[[[offset]+[dlen]]<=[blen]]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
392 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
393 If[_internal_memcmp_offset[buffer, offset, delim, 0, dlen]]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
394 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
395 out,partial,none <- _Check Buffer[buffer,delim,[offset]+[1]]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
396 }{
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
397 out <- offset
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
398 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
399 }{
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
400 partial,none <- _Check Partial[buffer,delim,offset]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
401 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
402 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
403
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
404 _Check Split[old,new,delim,offset:out,not split]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
405 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
406 ,not split <- If[[offset]<[[old]Length]]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
407 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
408 left <- [[old]Length]-[offset]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
409 If[_internal_memcmp_offset[old, offset, delim, 0, left]]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
410 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
411 next <- [offset]+[1]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
412 }{
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
413 If[_internal_memcmp_offset[new, 0, delim, left, [[delim]Length]-[left]]]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
414 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
415 next <- [offset]+[1]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
416 }{
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
417 out <- offset
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
418 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
419 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
420 out,not split <- _Check Split[old,new,delim,next]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
421 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
422 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
423
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
424 _Read Delim@TCP Connection[con,delim,poffset,buflist:data,out con,err]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
425 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
426 read[[con]Filedes >>, _internal_array_allocnaked[512i32, UInt8()], 512i64]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
427 { numread <- Trunc Int32[~] }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
428 { outbuf <- [~]Length <<[numread] }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
429
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
430 If[[numread]=[-1]]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
431 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
432 If[Wait for IO[[con]Filedes >>, 1]]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
433 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
434 data,out con,err <- [con]_Read Delim[delim,poffset,buflist]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
435 }{
147
f3686f60985d Sort of working port of framework. Transaction bug seems to be getting in the way. Going to work around, but want the old version in the repo so I can test later.
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
436 err <- [Fold[_Add Len[?], 0, buflist]]+[Length[[con]Read Buffer >>]]
145
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
437 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
438 }{
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
439 ,checknew <- If[[poffset]>=[0]]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
440 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
441 If[[[delim]Length]>[[outbuf]Length]]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
442 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
443 //Avoid possibility of having to check across more than 2 buffers
147
f3686f60985d Sort of working port of framework. Transaction bug seems to be getting in the way. Going to work around, but want the old version in the repo so I can test later.
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
444 data,out con,err <-[[con]Read Buffer <<[
f3686f60985d Sort of working port of framework. Transaction bug seems to be getting in the way. Going to work around, but want the old version in the repo so I can test later.
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
445 _Merge Buffers[[[buflist]Append[[con]Read Buffer >>]]Append[outbuf]]
145
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
446 ]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
447 ]Read Delim[delim]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
448 }{
147
f3686f60985d Sort of working port of framework. Transaction bug seems to be getting in the way. Going to work around, but want the old version in the repo so I can test later.
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
449 ,checknew <- _Check Split[[con]Read Buffer >>, outbuf, delim ,poffset]
145
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
450 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
451 before <- [_internal_array_copychunk[[con]Read Buffer >>, 0, _internal_array_allocnaked[~, UInt8()], 0, ~]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
452 ]Length <<[~]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
453
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
454 data <- _Merge Buffers[[buflist]Append[before]]
147
f3686f60985d Sort of working port of framework. Transaction bug seems to be getting in the way. Going to work around, but want the old version in the repo so I can test later.
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
455 after off <- [[delim]Length]- [[[[con]Read Buffer >>]Length]-[~]]
145
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
456 rbufferlen <- [[outbuf]Length]-[after off]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
457 out con <- [con]Read Buffer <<[
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
458 [_internal_array_copychunk[outbuf, after off,
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
459 _internal_array_allocnaked[rbufferlen, UInt8()], 0, rbufferlen]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
460 ]Length <<[rbufferlen]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
461 ]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
462 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
463 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
464 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
465 Val[checknew]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
466 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
467 ,npoffset <- _Check Buffer[outbuf,delim,0]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
468 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
469 before <- [_internal_array_copychunk[outbuf, 0, _internal_array_allocnaked[~, UInt8()], 0, ~]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
470 ]Length <<[~]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
471 If[[[con]Read Buffer >>]Length]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
472 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
473
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
474 tomerge <- [[buflist]Append[[con]Read Buffer >>]]Append[before]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
475 }{
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
476 tomerge <- [buflist]Append[before]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
477 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
478 data <- _Merge Buffers[tomerge]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
479 rbufferlen <- [[outbuf]Length]-[[~]+[[delim]Length]]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
480 out con <- [con]Read Buffer <<[
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
481 [_internal_array_copychunk[outbuf, [~]+[[delim]Length],
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
482 _internal_array_allocnaked[rbufferlen, UInt8()], 0, rbufferlen]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
483 ]Length <<[rbufferlen]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
484 ]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
485 }{
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
486
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
487 If[[[con]Read Buffer >>]Length]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
488 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
489 nbuflist <- [buflist]Append[[con]Read Buffer >>]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
490 }{
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
491 nbuflist <- Val[buflist]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
492 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
493 ncon <- [con]Read Buffer <<[outbuf]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
494 }{
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
495 If[[[con]Read Buffer >>]Length]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
496 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
497 nbuflist <- [[buflist]Append[[con]Read Buffer >>]]Append[outbuf]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
498 ncon <- [con]Read Buffer <<[Array[]]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
499 }{
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
500 nbuflist <- [buflist]Append[outbuf]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
501 ncon <- Val[con]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
502 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
503 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
504 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
505 data,out con,err <- [ncon]_Read Delim[delim,npoffset,nbuflist]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
506 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
507 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
508
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
509 Read Delim@TCP Connection[con,delim(Array):data,out con,err]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
510 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
511 ,poffset <-_Check Buffer[[con]Read Buffer >>, delim,0]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
512 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
513 data <- [_internal_array_copychunk[[con]Read Buffer >>, 0, _internal_array_allocnaked[~, UInt8()], 0, ~]]Length <<[~]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
514 rbufferlen <- [[[con]Read Buffer >>]Length]-[[~]+[[delim]Length]]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
515 out con <- [con]Read Buffer <<[
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
516 [_internal_array_copychunk[[con]Read Buffer >>, [~]+[[delim]Length],
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
517 _internal_array_allocnaked[rbufferlen, UInt8()], 0, rbufferlen]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
518 ]Length <<[rbufferlen]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
519 ]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
520 }{
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
521 buflist <- ()
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
522 ncon <- Val[con]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
523 }{
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
524 If[[[con]Read Buffer >>]Length]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
525 {
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
526 ncon <- [con]Read Buffer <<[Array[]]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
527 buflist <- [()]Append[[con]Read Buffer >>]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
528 }{
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
529 ncon <- Val[con]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
530 buflist <- ()
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
531 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
532 poffset <- -1
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
533
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
534 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
535 data,out con,err <- [ncon]_Read Delim[delim,poffset,buflist]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
536 }
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
537
143
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
538 Close@TCP Connection[con:out]
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
539 {
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
540 out <- close[[con]Filedes >>]
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
541 }
ff00538cd818 Add TCP Connection type and implement Write and Close methods
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
542
142
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
543 //This effectively leaks a context and thus any data on the stack of that context
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
544 //Need either handle cleanup of contexts or find a better way to accomplish this
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
545 Wait Forever[]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
546 {
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
547 Pause[Val[?]]
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
548 }
7bbdc034e347 Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
549