annotate net.rhope @ 145:357f4ce3ca6d

Add incredibly ugly implementation of Read Delim to TCP Connection
author Mike Pavone <pavone@retrodev.com>
date Sun, 21 Nov 2010 22:08:17 -0500
parents 65ebd1ce2611
children f3686f60985d
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 }{
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
436 err <- [Fold[_Add Len[?], 0, buflist]]+[Length[[con]Buffer >>]]
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
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
444 data,out con,err <-[[con]Buffer <<[
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
445 _Merge Buffers[[[buflist]Append[[con]Buffer >>]]Append[outbuf]]
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 }{
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
449 ,checknew <- _Check Split[[con]Buffer >>, outbuf, delim ,poffset]
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]]
357f4ce3ca6d Add incredibly ugly implementation of Read Delim to TCP Connection
Mike Pavone <pavone@retrodev.com>
parents: 144
diff changeset
455 after off <- [[delim]Length]- [[[[con]Buffer >>]Length]-[~]]
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