From: <no...@fe...> - 2010-10-21 15:05:09
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "An advanced programming language". The branch, master has been updated via f7b6c2bc40d70920bba87539a5e068be995d34b6 (commit) via 9c417e009c004a24f4709874fffe76b454b06bb0 (commit) via ace430cfa9a6260375550e4cc23274173266de52 (commit) via 997860f361af8d15362ca6bb2fc68736dcc41316 (commit) via 1db6b034cbd260191845098648fdb65d597167f3 (commit) via 5f8a60e0040585d9812c2824f4854eb6dbf91647 (commit) via 0afe2ccec025ee6b3411767c6b003cf5ec1c7617 (commit) via 2960d0fcaa8810ebbdb48fd4975ab26e0ceb0e21 (commit) via 2dc112fbe00f65851115609be12549335a60cff5 (commit) via 721748e6fd188340e07207082445b461ef856440 (commit) via ddf70a63ee273efa59c2a3f9b6bc3bec9a83cc6a (commit) via 2b7679f462a2f271271b84688a964537115a806e (commit) via 753016f13e52956ea3f34e6c391c290bdf694cf5 (commit) via 4e78d45f996adcc1083a2516c10c8df7bd4add54 (commit) from fc4f483d20272dbf308e40cb352558b82fc2ca0c (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit f7b6c2bc40d70920bba87539a5e068be995d34b6 Author: Erick Tryzelaar <ida...@us...> Date: Thu Oct 21 07:53:06 2010 -0700 Migrate to latest fbuild. diff --git a/buildsystem/iscr.py b/buildsystem/iscr.py index b0fff82..4c22a07 100644 --- a/buildsystem/iscr.py +++ b/buildsystem/iscr.py @@ -69,7 +69,7 @@ class Iscr(fbuild.db.PersistentObject): if m: dsts.append(Path(m.group(1))) - fbuild.db.add_external_dependencies_to_call(self.ctx, srcs=srcs) + self.ctx.db.add_external_dependencies_to_call(srcs=srcs) return dsts diff --git a/buildsystem/speed.py b/buildsystem/speed.py index 1278e0b..4b4aff6 100644 --- a/buildsystem/speed.py +++ b/buildsystem/speed.py @@ -149,7 +149,7 @@ def run_test(ctx, path, dst, srcs:fbuild.db.SRCS, expect:fbuild.db.OPTIONAL_SRC, # If we failed to compile, just move on return None, None - fbuild.db.add_external_dependencies_to_call(ctx, dsts=[exe]) + ctx.db.add_external_dependencies_to_call(dsts=[exe]) # Run the executable and measure the wall clock time ctx.logger.check('running ' + exe) diff --git a/fbuild b/fbuild index 3fa955e..1f75235 160000 --- a/fbuild +++ b/fbuild @@ -1 +1 @@ -Subproject commit 3fa955e5d8a238125d170923fbbe1c188ad1150a +Subproject commit 1f752353d445f0cd251a5e5191014e55306ee216 commit 9c417e009c004a24f4709874fffe76b454b06bb0 Merge: fc4f483 ace430c Author: Erick Tryzelaar <ida...@us...> Date: Thu Oct 21 07:36:12 2010 -0700 Merge branch 'master' of github.com:erickt/felix commit ace430cfa9a6260375550e4cc23274173266de52 Author: skaller <Max...@gm...> Date: Thu Oct 21 01:55:57 2010 +1100 Add syntax colouring for C/C++ files, and hyperlinking of #include files. As yet you can't jump from a felix header '#include "file.hpp"'; to C++. diff --git a/tools/webserver.flx b/tools/webserver.flx index 5e4e1bc..4b39015 100644 --- a/tools/webserver.flx +++ b/tools/webserver.flx @@ -206,11 +206,238 @@ span.big_keyword {color:#FF1010; } span.small_keyword {color:#802040; } span.qualifier {color:#A02020; } span.hack {color:#00FF00; } +span.preproc {color:#00FF00; } </style> </head> <body> """; +fun inarray[N](s:string, a:array[string,N])=> + mem (fun (x:string) => s == x) a +; + +// C++ and C +val cpp_big_keywords = + "class", + "struct", + "union", + "namespace", + "typedef", + "enum" +; + +val cpp_small_keywords = + "if", "while", "until","do","for","return","goto","std" +; + +val cpp_qualifiers = + "virtual", "inline", "static", + "int","long","unsigned","float","double","char","short","signed","void","size_t", + "const","volatile" +; + +val cpp_preproc = + "define","if","endif","else","include","ifdef","ifndef" +; + +proc write_cpp(k:socket_t, t:string, eof_flag: &bool) +{ + proc write_string(k:socket_t, t:string) + { + if not *eof_flag do Flx_stream::write_string(k,t,eof_flag); + else goto giveup; + done + } + + union state_t = + | sot // start of token + | id // processing identifier + | num // in a number + | sq // processing single quote string + | dq // processing double quote string + | ccomment // a C style comment + | cppcomment // a C++ style comment + ; + fun str(s:state_t) => match s with + | sot => "sot" + | id => "id" + | num => "num" + | sq => "sq" + | dq => "dq" + | ccomment=> "ccomment" + | cppcomment => "cppcomment" + endmatch; + + var i = 0; var s:state_t; + var ch = t.[i]; + proc next() { ch = t.[i]; ++i; } + fun ahead (j:int)=> t.[i+j-1]; + + var b = ""; + var last_id = ""; + var last_op = ""; + proc cp() { b += ch; } + proc ws() { + if last_id == "include" do // hackery + var n = b; + whilst n.[0] == char "'" or n.[0] == char '"' do n = n.[1 to]; done + whilst n.[-1] == char "'" or n.[-1] == char '"' do n = n.[to -1]; done + write_string(k,'<a href="/rtl/'+n+'" >' + b + '</a>') ; + else + write_string(k,'<span class=fstring>'+b+"</span>"); + done + } + proc w() { + //println$ "Token["+str s+"]="+b; + match s with + | dq => { ws; } + | sq => { ws; } + | ccomment=> { write_string(k,'<span class=comment>'+b+"</span>"); } + | cppcomment=> { write_string(k,'<span class=comment>'+b+"</span>"); } + | id => + { + last_id = b; + if inarray(b,cpp_big_keywords) do write_string(k,'<span class=big_keyword>'+b+"</span>"); + elif inarray(b,cpp_small_keywords) do write_string(k,'<span class=small_keyword>'+b+"</span>"); + elif inarray(b,cpp_qualifiers) do write_string(k,'<span class=qualifier>'+b+"</span>"); + elif last_op == "#" and inarray(b,cpp_preproc) do write_string(k,'<span class=preproc>'+b+"</span>"); last_op=""; + else write_string(k,b); done + } + | _ => + { + last_op=b; + if b == "<" do b = "<"; + elif b == ">" do b = ">"; + elif b == "&" do b = "&"; + done; + write_string(k,b); + } + endmatch; + b = ""; + } + + + goto nextt; + +contin:> // copy char and continue + cp(); + goto nextch; + +overrun:> // one past last char of token + w(); + s = sot; + goto thisch; + +lastch:> // last char of token + cp(); + w(); + +nextt:> // new token on next char + s = sot; + +nextch:> // next char + next(); + +thisch:> // same char, reconsider it + //println$ "Considering char " + str(ord(ch)); + if isnull ch goto fin; // out of data + match s with + | sot => + { + if isidstart ch do s = id; goto contin; + elif isdigit ch do s = num; goto contin; + elif issq ch do s = sq; goto contin; + elif isdq ch do s = dq; goto contin; + elif ch == char "/" do + if ahead(1) == char "/" do cp; next; s = cppcomment; goto contin + elif ahead(1) == char "*" do cp; next; s = ccomment; goto contin + else goto lastch + done + else cp; w; goto nextt; + done + } + + | id => + { + if isalphanum ch do goto contin; + else goto overrun; + done + } + | num => + { + if isnumeric ch do goto contin; + else goto overrun; + done + } + // single quoted strings + | sq => + { + if issq ch do goto lastch; + elif ch== char "<" do b+="<"; goto nextch; + elif ch== char ">" do b+=">"; goto nextch; + elif ch== char "&" do b+="&"; goto nextch; + else goto contin; + done + } + | dq => + { + if isdq ch do goto lastch; + elif ch== char "<" do b+="<"; goto nextch; + elif ch== char ">" do b+=">"; goto nextch; + elif ch== char "&" do b+="&"; goto nextch; + else goto contin; + done + } + // comments + | cppcomment => + { + if iseol ch do goto lastch; + else goto contin; + done + } + | ccomment => // doesn't handle nested comments yet + { + if ch == char "*" and ahead(1) == char "/" do + cp; + goto lastch; + else goto contin; + done + } + endmatch + ; // execute selected function + println$ "Unexpected drop thru"; + +fin:> + println "outof data"; + w(); // whatever is left over gets written +giveup:> +} + +proc serve_cpp(s:socket_t, fname:string) +{ + var eof_flag = false; + proc write_string(k:socket_t, t:string) + { + if not eof_flag do Flx_stream::write_string(k,t,&eof_flag); + else goto giveup; + done + } + + var flx = Text_file::load(fname); + if flx == "" do flx = Text_file::load(LIBROOT+"/"+fname); done + if flx == "" do flx = "NO FILE "+fname+" FOUND IN " + LIBROOT; done + println$ "Loaded C/C++file " + fname; + //println$ "Contents=" + flx; + write_string(s, html_header); + write_string(s, flx_head); + write_string(s,"<pre>"); + write_cpp(s, flx, &eof_flag); + write_string(s,"</pre>\n"); + write_string(s,"</body></html>\n"); +giveup:> +} + +// Felix val big_keywords = "module", "fun", @@ -237,7 +464,7 @@ val big_keywords = val small_keywords = "if", "then", "else", "elif", "endif", "do", "done", "in", "forall", "while", "whilst","to", "upto","downto", - "match","endmatch","with","requires" + "match","endmatch","with","requires","return","goto" ; val qualifiers = @@ -245,10 +472,7 @@ val qualifiers = ; val hack = "C_hack","C_hack"; // to make it an array we need 2 components -fun inarray[N](s:string, a:array[string,N])=> - mem (fun (x:string) => s == x) a -; - + proc write_felix(k:socket_t, t:string, eof_flag: &bool) { proc write_string(k:socket_t, t:string) @@ -328,7 +552,15 @@ proc write_felix(k:socket_t, t:string, eof_flag: &bool) elif inarray(b,hack) do write_string(k,'<span class=hack>'+b+"</span>"); else write_string(k,b); done } - | _ => { write_string(k,b); } + | _ => + { + last_op=b; + if b == "<" do b = "<"; + elif b == ">" do b = ">"; + elif b == "&" do b = "&"; + done; + write_string(k,b); + } endmatch; b = ""; } @@ -501,6 +733,9 @@ proc serve_file(infname: string, s: socket_t) print "suffix is "; print suffix; endl; if suffix == "flx" do serve_felix(s:socket_t, fname:string); + elif suffix == "cpp" or suffix == "hpp" + or suffix == "cxx" or suffix == "h" or suffix == "c" + do serve_cpp(s:socket_t, fname:string); else if WIN32 do win32_send_file(s,fname, suffix); commit 997860f361af8d15362ca6bb2fc68736dcc41316 Author: skaller <Max...@gm...> Date: Wed Oct 20 03:17:26 2010 +1100 Finally fix the webserver bug, which turned out to be a gc problem. Now it runs, and the gc is running too. diff --git a/lpsrc/flx_maker.pak b/lpsrc/flx_maker.pak index 39944f2..92430ba 100644 --- a/lpsrc/flx_maker.pak +++ b/lpsrc/flx_maker.pak @@ -733,8 +733,10 @@ if FELIX == 1 do write_include_file(filebase); else dbug?? println "Felix compilation skipped by switch"; + calpackages(); // need to do this here to set linker switches done + if STATIC == 0 do dbug?? println "Dynamic linkage"; CCMD=List::cat ' ' (List::list ( diff --git a/src/compiler/flx_cpp_backend/flx_ogen.ml b/src/compiler/flx_cpp_backend/flx_ogen.ml index acaea58..73928d0 100644 --- a/src/compiler/flx_cpp_backend/flx_ogen.ml +++ b/src/compiler/flx_cpp_backend/flx_ogen.ml @@ -522,7 +522,6 @@ let gen_offset_tables syms bsym_table module_name = if not is_pod then begin bcat s ("static void " ^ name ^ "_finaliser(collector_t *, void *p){\n"); bcat s (" (("^ tname ^ "*)p)->~" ^ tname ^ "();\n"); - bcat s (" p = (void*)((char*)p + sizeof("^tname^"));\n"); bcat s ("}\n") end ; @@ -530,7 +529,7 @@ let gen_offset_tables syms bsym_table module_name = bcat s (" " ^ old_ptr_map ^ ",\n"); bcat s (" \"" ^ name ^ "\",\n"); bcat s (" " ^ si k ^ ",\n"); - bcat s (" sizeof("^name^"),\n"); + bcat s (" sizeof("^tname^"),\n"); (* NOTE: size of ONE element!! *) bcat s ( if not is_pod then (" "^name^"_finaliser,\n") diff --git a/src/faio/faio_posixio.cpp b/src/faio/faio_posixio.cpp index aff1012..17923cb 100644 --- a/src/faio/faio_posixio.cpp +++ b/src/faio/faio_posixio.cpp @@ -94,7 +94,7 @@ socketio_wakeup::wakeup(posix_demuxer& demux) else if(wakeup_flags & PDEMUX_EOF) { connection_closed = true; - fprintf(stderr,"posix faio wakeup PDEMUX_EOF, connection closed = %d\n", connection_closed); + //fprintf(stderr,"posix faio wakeup PDEMUX_EOF, connection closed = %d\n", connection_closed); //pb.bytes_written=0; } @@ -112,8 +112,8 @@ socketio_wakeup::wakeup(posix_demuxer& demux) assert(wakeup_flags == PDEMUX_WRITE); //fprintf(stderr,"posix faio wakeup PDEMUX_WRITE, writing..\n"); connection_closed = posix_demuxer::socket_send(s, &pb); - if(connection_closed) - fprintf(stderr,"posix faio wakeup PDEMUX_WRITE, connection closed = %d\n", connection_closed); + //if(connection_closed) + // fprintf(stderr,"posix faio wakeup PDEMUX_WRITE, connection closed = %d\n", connection_closed); } // fprintf(stderr,"posthandle wakeup, this: %p, read: %i, len: %i, done %i\n", diff --git a/src/faio/flx_stream.flx b/src/faio/flx_stream.flx index 9681adb..cf4e078 100644 --- a/src/faio/flx_stream.flx +++ b/src/faio/flx_stream.flx @@ -263,7 +263,7 @@ module Flx_stream { var st: string=""; var finished = false; - fprintln$ cerr,"Get line from IByteStream "+id; + //fprintln$ cerr,"Get line from IByteStream "+id; whilst not finished do var len = 1; var eof: bool; diff --git a/src/gc/flx_collector.cpp b/src/gc/flx_collector.cpp index 0f0cc64..018873a 100644 --- a/src/gc/flx_collector.cpp +++ b/src/gc/flx_collector.cpp @@ -223,13 +223,17 @@ void *flx_collector_t::create_empty_array( void flx_collector_t::impl_finalise(void *fp) { assert(fp!=NULL); - gc_shape_t *shape = get_shape(fp); + //fprintf(stderr, "Finaliser for %p\n", fp); + gc_shape_t *shape = get_shape(fp); // inefficient, since we already know the shape! + //fprintf(stderr, "Got shape %p=%s\n", shape,shape->cname); void (*finaliser)(collector_t*, void*) = shape->finaliser; + //fprintf(stderr, "Got finaliser %p\n", finaliser); if (finaliser) { unsigned char *cp = (unsigned char*)fp; unsigned long n_used = get_count(fp) * shape->count; unsigned long eltsize = shape->amt; + //fprintf(stderr, "Finalising at %p for type %s %ld objects each size %ld\n", cp, shape->cname, n_used, eltsize); for(unsigned long j = 0; j<n_used; ++j) { (*finaliser)(this,(void*)cp); @@ -244,6 +248,7 @@ void flx_collector_t::unlink(void *fp) assert(fp!=NULL); // call the finaliser if there is one + //fprintf(stderr,"Calling finaliser\n"); impl_finalise(fp); allocation_count--; @@ -251,12 +256,15 @@ void flx_collector_t::unlink(void *fp) unsigned long n_objects = get_count(fp); unsigned long nobj = shape -> count * n_objects; std::size_t size = shape->amt * nobj; + //fprintf(stderr, "Uncounting %ld bytes\n", long(size)); allocation_amt -= size; // unlink the frame from the collectors list + //fprintf(stderr,"Removing address from Judy lists\n"); JudyLDel(&j_shape, (Word_t)fp, &je); JudyLDel(&j_nused, (Word_t)fp, &je); JudyLDel(&j_nalloc, (Word_t)fp, &je); + //fprintf(stderr,"Finished unlinking\n"); } void flx_collector_t::post_delete(void *fp) @@ -350,14 +358,19 @@ unsigned long flx_collector_t::sweep() if(debug) fprintf(stderr,"Garbage %p=%s\n",current,((gc_shape_t*)(*pshape & ~1UL))->cname); ++ sweeped; + //fprintf(stderr,"Unlinking ..\n"); unlink(current); + //fprintf(stderr,"Posting delete ..\n"); post_delete(current); + //fprintf(stderr,"Reaping done\n"); } else if(debug) fprintf(stderr,"Reachable %p=%s\n",current,((gc_shape_t*)(*pshape & ~1UL))->cname); + //fprintf(stderr,"Calling Judy for next object\n"); pshape = (Word_t*)JudyLNext(j_shape,(Word_t*)(void*)¤t,&je); + //fprintf(stderr,"Judy got next object %p\n",pshape); } parity = !parity; diff --git a/src/gc/flx_gc.cpp b/src/gc/flx_gc.cpp index 31c3838..7bdff9f 100644 --- a/src/gc/flx_gc.cpp +++ b/src/gc/flx_gc.cpp @@ -67,7 +67,7 @@ unsigned long gc_profile_t::actually_collect() { void *gc_profile_t::allocate( flx::gc::generic::gc_shape_t *shape, - unsigned long amt, + unsigned long count, bool allow_gc ) { @@ -78,20 +78,27 @@ void *gc_profile_t::allocate( { maybe_collect(); try { - return collector -> allocate(shape,amt); + return collector -> allocate(shape,count); } catch (flx::rtl::flx_out_of_memory_t&) { actually_collect(); - return collector -> allocate(shape,amt); + return collector -> allocate(shape,count); } } else - return collector -> allocate(shape,amt); + return collector -> allocate(shape,count); } }}} // end namespaces // in global namespace now .. +// +// NOTE: Felix arrays are two dimensional. The shape.amt field is the size of +// one element. The shape.count field is the number of elements for a static +// array type. The dynamic length is for varrays, it is stored in a judy array +// associated with the array address. If there is nothing in the judy array, +// the dynamic length is one. C++ operator new allocates arrays of dynamic length 1. +// void *operator new( std::size_t amt, flx::gc::generic::gc_profile_t &gcp, @@ -99,13 +106,13 @@ void *operator new( bool allow_gc ) { - if (amt != shape.amt) + if (amt != shape.amt * shape.count) { fprintf(stderr,"Shape size error: allocator size = %ld\n",amt); - fprintf(stderr,"Shape %s size = %ld\n",shape.cname,shape.amt); + fprintf(stderr,"Shape %s element size = %ld, element count = %;d\n",shape.cname,shape.amt,shape.count); abort(); } - void *p = gcp.allocate(&shape,1,allow_gc); + void *p = gcp.allocate(&shape,1,allow_gc); // dynamic array count = 1 return p; } commit 1db6b034cbd260191845098648fdb65d597167f3 Author: skaller <Max...@gm...> Date: Tue Oct 19 13:04:33 2010 +1100 Fix the webserver so it doesn't write on closed connections. Add some more colours and keywords. diff --git a/lpsrc/flx_maker.pak b/lpsrc/flx_maker.pak index de407f9..39944f2 100644 --- a/lpsrc/flx_maker.pak +++ b/lpsrc/flx_maker.pak @@ -433,7 +433,7 @@ dbug?? println$ "cpps="+cpps; dbug?? println$ "cppos="+cppos; var USER_ARGS = ""; whilst argno < System::argc do USER_ARGS+=" " + System::argv argno; ++argno; done -println$ "USER_ARGS=" + USER_ARGS; +//println$ "USER_ARGS=" + USER_ARGS; if NOOPTIMISE == 0 do dbug?? println "Set C++ compiler optimisation switches"; diff --git a/src/compiler/flx_cpp_backend/flx_gen.ml b/src/compiler/flx_cpp_backend/flx_gen.ml index de282eb..bcf9a23 100644 --- a/src/compiler/flx_cpp_backend/flx_gen.ml +++ b/src/compiler/flx_cpp_backend/flx_gen.ml @@ -996,7 +996,8 @@ let gen_exe filename | Function -> begin match label_kind with - | `Far -> assert false + | `Far -> failwith ("[gen_exe] In function " ^ Flx_bsym.id bsym ^ + ": Non-local going to label " ^s) | `Near -> " " ^ cid_of_flxid s ^ ":;\n" | `Unused -> "" diff --git a/src/demux/demux_demuxer.hpp b/src/demux/demux_demuxer.hpp index 98c65fc..a8df878 100644 --- a/src/demux/demux_demuxer.hpp +++ b/src/demux/demux_demuxer.hpp @@ -6,10 +6,22 @@ namespace flx { namespace demux { struct sel_param { char* buffer; // set on input - long buffer_size; // set on input - long bytes_written; // set on input and output + long buffer_size; // set on input + long bytes_written; // set on input and output + bool eof_detected; // NEW: a proper eof flag + // maybe implemented in Posix, + // not done in Windows yet (since I don't have a Windows development box) - bool finished() { return bytes_written == buffer_size; } + bool error_detected; // NEW: a proper error flag + // maybe implemented on Posix + // not done in Windows yet (since I don't have a Windows development box) + // NOTE: there's no indication of what the error is + // because that is platform dependent + // A normal EOF condition is NOT an error + // However most errors will be associated with an eof! + + sel_param() : buffer(0), buffer_size(0), bytes_written(0), eof_detected(false), error_detected(false) {} + bool finished() { return error_detected || eof_detected || (bytes_written == buffer_size); } }; // rename ... diff --git a/src/demux/posix/demux_posix_demuxer.cpp b/src/demux/posix/demux_posix_demuxer.cpp index 8e155ad..f3b7da4 100644 --- a/src/demux/posix/demux_posix_demuxer.cpp +++ b/src/demux/posix/demux_posix_demuxer.cpp @@ -37,15 +37,18 @@ posix_demuxer::socket_recv(int s, sel_param* pb) s,pb, int(pb->bytes_written), int(pb->buffer_size - pb->bytes_written), int(nbytes) ); */ - if(nbytes <= 0) + if(nbytes <= 0) // so what happens if the client wants to send 0 bytes? { if(nbytes == 0) { + pb->eof_detected = true; return true; // connection closed } else { perror("recv"); // can get reset connection here + pb->eof_detected = true; + pb->error_detected = true; return true; // so say closed, yeah? } } @@ -82,11 +85,22 @@ posix_demuxer::socket_send(int s, sel_param* pb) // what's the story with zero? Is that allowed or does it signal // that the connection closed? + // JS: According to the man page, it can happen on an async socket + // but for us this could be if the notification event lied + // OR a socket connection got closed in between the notification + // and this call: we can tell by looking at errno but that utterly + // sucks .. oh well, unix is a pretty bad OS in some ways + // OR .. it could happen if the client decided to send 0 bytes! + if(-1 == nbytes) { fprintf(stderr,"posix_demuxer: socket send failed, connection closed by client?\n"); perror("send"); fprintf(stderr,"Should have printed the error code above ..\n"); + pb->eof_detected = true; + pb->error_detected = true; // really, trying to write on a connection merely closed + // by the client is NOT an error, since there's no other way + // to tell than try to do a write return true; // I guess the connection closed } else diff --git a/src/demux/win/demux_overlapped.cpp b/src/demux/win/demux_overlapped.cpp index 8ab3dbd..2eee5f1 100644 --- a/src/demux/win/demux_overlapped.cpp +++ b/src/demux/win/demux_overlapped.cpp @@ -347,6 +347,7 @@ wsasocketio_control_block::start_overlapped() } fprintf(stderr,"WSARecv/Send returned SOCKET_ERR: %li\n", err); + ppb->eof_detected=true; return true; // assume it's bad and we won't get a wakeup } break; diff --git a/src/faio/faio_asyncio.cpp b/src/faio/faio_asyncio.cpp index bd7febd..529e74b 100644 --- a/src/faio/faio_asyncio.cpp +++ b/src/faio/faio_asyncio.cpp @@ -21,7 +21,7 @@ void flx_driver_request_base:: start_async_op(finote_t *fn_a) void flx_driver_request_base:: notify_finished() { - //fprintf(stderr, "faio_req=%p, Notify %p\n", this,fn); + //fprintf(stderr, "faio_req=%p, Notify finished %p\n", this,fn); assert(fn!=0); finote_t *fin = fn; fn=0; diff --git a/src/faio/faio_posixio.cpp b/src/faio/faio_posixio.cpp index 2913375..aff1012 100644 --- a/src/faio/faio_posixio.cpp +++ b/src/faio/faio_posixio.cpp @@ -88,11 +88,13 @@ socketio_wakeup::wakeup(posix_demuxer& demux) { connection_closed = true; //pb.bytes_written=0; + fprintf(stderr,"posix faio wakeup PDEMUX_ERROR, connection closed = %d\n", connection_closed); } else if(wakeup_flags & PDEMUX_EOF) { connection_closed = true; + fprintf(stderr,"posix faio wakeup PDEMUX_EOF, connection closed = %d\n", connection_closed); //pb.bytes_written=0; } @@ -110,7 +112,8 @@ socketio_wakeup::wakeup(posix_demuxer& demux) assert(wakeup_flags == PDEMUX_WRITE); //fprintf(stderr,"posix faio wakeup PDEMUX_WRITE, writing..\n"); connection_closed = posix_demuxer::socket_send(s, &pb); - //fprintf(stderr,"posix faio wakeup PDEMUX_WRITE, connection closed = %d\n", connection_closed); + if(connection_closed) + fprintf(stderr,"posix faio wakeup PDEMUX_WRITE, connection closed = %d\n", connection_closed); } // fprintf(stderr,"posthandle wakeup, this: %p, read: %i, len: %i, done %i\n", @@ -121,6 +124,10 @@ socketio_wakeup::wakeup(posix_demuxer& demux) if(connection_closed || pb.bytes_written == pb.buffer_size) { // fprintf(stderr,"schedding %p, drv: %p, f: %p\n", this, drv, f); + // if the connection closed, this notify should tell the caller + // not to keep trying to write, but it doesn't .. why not? + // who called it anyhow? + // I think the writing code ignores error returns .. request->notify_finished(); return; } diff --git a/src/faio/flx_faio.flx b/src/faio/flx_faio.flx index 01e7f33..3f5c827 100644 --- a/src/faio/flx_faio.flx +++ b/src/faio/flx_faio.flx @@ -26,9 +26,14 @@ module Faio { proc calc_eof(pb: sel_param_ptr, len: &int, eof: &bool) { + //println "Calc_eof .."; var bytes_done = pb.bytes_done; + //println$ "Bytes done = "+ str bytes_done; + //println$ "Req len= "+ str (*len); *eof = (bytes_done != *len); + //println$ "Eof = " + str (*eof); *len = bytes_done; + //println$ "Reset len to bytes done .."; } type sleep_request = 'flx::faio::sleep_request' requires faio_timer_h; diff --git a/src/faio/flx_faio_posix.flx b/src/faio/flx_faio_posix.flx index 3d51b26..d61f6e2 100644 --- a/src/faio/flx_faio_posix.flx +++ b/src/faio/flx_faio_posix.flx @@ -103,9 +103,13 @@ fun get_pb: socketio_request -> sel_param_ptr = '&$1.sv.pb'; // read & write differ only by a flag proc async_rw(fd: socket_t, len: &int, buf: address, eof: &bool, read_flag: bool) { + //println$ "faio/flx_faoi_posix.flx: async_rw (s,"+str (*len)+",buf,"+str(*eof)+", "+str read_flag+") calling mk_socketio_req .."; var asyncb = mk_socketio_request(sys_demux,fd, buf, *len, read_flag); faio_req$ &asyncb; + //println$ "faio/flx_faoi_posix.flx: async_rw ("+ str fd+", "+str (*len)+",buf,"+str(*eof)+", "+str read_flag+") calculating eof .."; + calc_eof(asyncb.pb, len, eof); + //println$ "faio/flx_faoi_posix.flx: async_rw (s,"+str (*len)+",buf,"+str(*eof)+", "+str read_flag+") called mk_socketio_req .."; } proc async_read(fd: socket_t, len: &int, buf: address, @@ -116,7 +120,9 @@ proc async_read(fd: socket_t, len: &int, buf: address, proc async_write(fd: socket_t, len: &int, buf: address, eof: &bool) { + //println$ "faio/flx_faoi_posix.flx: async_write(s,"+str (*len)+",buf,"+str(*eof)+" calling async_rw .."; async_rw(fd, len, buf, eof, false); // write + //println$ "faio/flx_faoi_posix.flx: async_write(s,"+str (*len)+",buf,"+str(*eof)+" call async_rw .."; } type flxfileio_request = "flx::faio::flxfileio_request"; diff --git a/src/faio/flx_socket.flx b/src/faio/flx_socket.flx index 9463593..e2f1845 100644 --- a/src/faio/flx_socket.flx +++ b/src/faio/flx_socket.flx @@ -77,7 +77,11 @@ module Flx_socket { { if POSIX do proc write(s: socket_t, len: &int, buf: address, eof: &bool) - { Faio_posix::async_write(s, len, buf, eof); } + { + //println$ "faio/flx_socket.flx: Flx_stream::OByteStream[socket_t]: write(s,"+str (*len)+",buf,"+str(*eof)+") calling async_write .."; + Faio_posix::async_write(s, len, buf, eof); + //println$ "faio/flx_socket.flx: Flx_stream::OByteStream[socket_t]: write(s,"+str (*len)+",buf,"+str(*eof)+") called async_write .."; + } else proc write(s: socket_t, len: &int, buf: address, eof: &bool) { Faio_win32::WSASend(s, len, buf, eof); } diff --git a/src/faio/flx_stream.flx b/src/faio/flx_stream.flx index a6a9279..9681adb 100644 --- a/src/faio/flx_stream.flx +++ b/src/faio/flx_stream.flx @@ -302,11 +302,10 @@ module Flx_stream { proc write_string[ostr with OByteStream[ostr]] - (sk: ostr, var s: string) + (sk: ostr, var s: string, eof: &bool) { var slen = len s; var a = C_hack::cast[address]$ cstr s; - var eof: bool; - write(sk, &slen, a, &eof); + write(sk, &slen, a, eof); } } // module Flx_stream diff --git a/src/pthread/pthread_condv.cpp b/src/pthread/pthread_condv.cpp index d6f190c..b4200b8 100644 --- a/src/pthread/pthread_condv.cpp +++ b/src/pthread/pthread_condv.cpp @@ -4,15 +4,59 @@ namespace flx { namespace pthread { -flx_condv_t::flx_condv_t() { pthread_cond_init(&cv, NULL); } -flx_condv_t::~flx_condv_t() { pthread_cond_destroy(&cv); } -void flx_condv_t::wait(flx_mutex_t *m) { pthread_cond_wait(&cv,&(m->m)); } -void flx_condv_t::signal() { pthread_cond_signal(&cv);} -void flx_condv_t::broadcast() { pthread_cond_broadcast(&cv); } +flx_condv_t::flx_condv_t() { + int res = pthread_cond_init(&cv, NULL); + #if !FLX_WIN32 + if(res==EINVAL) { + // I suspect this is an error .. perhaps something got deleted + fprintf(stderr,"pthred_cond_init returned EINVAL!"); + } + #endif +} +flx_condv_t::~flx_condv_t() { + int res = pthread_cond_destroy(&cv); + #if !FLX_WIN32 + if(res==EINVAL) { + // I suspect this is an error .. perhaps something got deleted + fprintf(stderr,"pthred_cond_destroy returned EINVAL!"); + } + #endif +} +void flx_condv_t::wait(flx_mutex_t *m) { + int res = pthread_cond_wait(&cv,&(m->m)); + #if !FLX_WIN32 + if(res==EINVAL) { + // I suspect this is an error .. perhaps something got deleted + fprintf(stderr,"pthred_cond_wait returned EINVAL!"); + } + #endif +} +void flx_condv_t::signal() { + int res = pthread_cond_signal(&cv); + #if !FLX_WIN32 + if(res==EINVAL) { + // I suspect this is an error .. perhaps something got deleted + fprintf(stderr,"pthred_cond_signal returned EINVAL!"); + } + #endif +} +void flx_condv_t::broadcast() { + int res = pthread_cond_broadcast(&cv); + #if !FLX_WIN32 + if(res==EINVAL) { + // I suspect this is an error .. perhaps something got deleted + fprintf(stderr,"pthred_cond_broadcast returned EINVAL!"); + } + #endif +} int flx_condv_t::timedwait(flx_mutex_t *m, timespec *t) { int res = pthread_cond_timedwait(&cv,&(m->m),t); #if !FLX_WIN32 - if(res==EINVAL) return 0; // this is NOT an error! + if(res==EINVAL) { + // I suspect this is an error .. perhaps something got deleted + fprintf(stderr,"pthred_cond_timedwait returned EINVAL!"); + return 0; // this is NOT an error! + } #endif return res; } diff --git a/test/faio/faio-1.01.01-0.flx b/test/faio/faio-1.01.01-0.flx index 20ef86e..a585338 100644 --- a/test/faio/faio-1.01.01-0.flx +++ b/test/faio/faio-1.01.01-0.flx @@ -23,6 +23,7 @@ print "spawning connector\n"; spawn_fthread { { + var eof = false; // print "Connector dude\n"; // get rid of, hard to test var c: socket_t; connect(&c, c"127.0.0.1", port); // connect to localhost @@ -31,7 +32,7 @@ spawn_fthread get_line(c, &st,"fthread"); print "connector got "; print st; endl; - write_string(c, "thanks\n"); // newline important + write_string(c, "thanks\n", &eof); // newline important ioclose(c); // finished with this //println$ "fthread closed " + str c; @@ -43,8 +44,9 @@ accept(listener, &s); //println$ "Mainline accepted connection on socket " + str s; ioclose(listener); // not needed anymore +var eof = false; print "got connection\n"; -write_string(s, "server says hi\n"); // newline important here +write_string(s, "server says hi\n", &eof); // newline important here var st: string; get_line(s, &st,"mainline"); diff --git a/tools/webserver.flx b/tools/webserver.flx index 58d78dd..5e4e1bc 100644 --- a/tools/webserver.flx +++ b/tools/webserver.flx @@ -113,12 +113,12 @@ Content-Type: text/html\r PAGE NOT FOUND: """; -proc write_http_header(s:socket_t, suffix:string) +proc write_http_header(s:socket_t, suffix:string, eof: &bool) { // mime type mapping from suffix. make better here. - if("gif" == suffix) then { write_string(s, gif_header); } - elif("css" == suffix) then { write_string(s, css_header); } - else { write_string(s, html_header); } endif; + if("gif" == suffix) then { write_string(s, gif_header, eof); } + elif("css" == suffix) then { write_string(s, css_header, eof); } + else { write_string(s, html_header, eof); } endif; } if WIN32 do @@ -143,7 +143,7 @@ if WIN32 do done } elif POSIX do - proc posix_send_file(s:socket_t,fname:string,suffix:string) + proc posix_send_file(s:socket_t,fname:string,suffix:string, eof: &bool) { // this fn sets the O_NONBLOCK flag which is completely unnecessary // as read goes via the preading worker fifo. don't know if @@ -153,14 +153,14 @@ elif POSIX do if Faio_posix::invalid fd do { print ("BUGGER, posix open of "+fname+" failed\n"); - write_string(s, notfound_header); - write_string(s, fname+"\r\n\n"); + write_string(s, notfound_header, eof); + write_string(s, fname+"\r\n\n", eof); } else { print ("got fd "+str fd +" for read file of "+fname+"\n"); - write_http_header(s,suffix); + write_http_header(s,suffix, eof); var from_strm: Faio_posix::fd_t = fd; var to_strm: socket_t = s; Flx_stream::cat(from_strm, to_strm); @@ -202,8 +202,10 @@ flx_head := """ <style type="text/css"> span.fstring {color:darkblue; font-style:italic; } span.comment {font-family:arial; color:blue; font-style:italic; } -span.big_keyword {color:red; } -span.small_keyword {color:darkred; } +span.big_keyword {color:#FF1010; } +span.small_keyword {color:#802040; } +span.qualifier {color:#A02020; } +span.hack {color:#00FF00; } </style> </head> <body> @@ -212,8 +214,11 @@ span.small_keyword {color:darkred; } val big_keywords = "module", "fun", + "gen", "proc", "type", + "union", + "struct", "typedef", "var", "val", @@ -225,7 +230,9 @@ val big_keywords = "include", "open", "spawn_fthread", - "spawn_pthread" + "spawn_pthread", + "reduce", "axiom", + "open", "inherit" ; val small_keywords = "if", "then", "else", "elif", "endif", "do", "done", @@ -233,12 +240,24 @@ val small_keywords = "match","endmatch","with","requires" ; +val qualifiers = + "virtual", "inline", "noinline", "private", "incomplete" +; +val hack = "C_hack","C_hack"; // to make it an array we need 2 components + fun inarray[N](s:string, a:array[string,N])=> mem (fun (x:string) => s == x) a ; -proc write_felix(k:socket_t, t:string) +proc write_felix(k:socket_t, t:string, eof_flag: &bool) { + proc write_string(k:socket_t, t:string) + { + if not *eof_flag do Flx_stream::write_string(k,t,eof_flag); + else goto giveup; + done + } + union state_t = | sot // start of token | id // processing identifier @@ -305,6 +324,8 @@ proc write_felix(k:socket_t, t:string) last_id = b; if inarray(b,big_keywords) do write_string(k,'<span class=big_keyword>'+b+"</span>"); elif inarray(b,small_keywords) do write_string(k,'<span class=small_keyword>'+b+"</span>"); + elif inarray(b,qualifiers) do write_string(k,'<span class=qualifier>'+b+"</span>"); + elif inarray(b,hack) do write_string(k,'<span class=hack>'+b+"</span>"); else write_string(k,b); done } | _ => { write_string(k,b); } @@ -427,25 +448,36 @@ thisch:> // same char, reconsider it fin:> println "outof data"; w(); // whatever is left over gets written +giveup:> } proc serve_felix(s:socket_t, fname:string) { - var flx = Text_file::load(fname); - if flx == "" do flx = Text_file::load(LIBROOT+"/"+fname); done - if flx == "" do flx = "NO FILE "+fname+" FOUND IN " + LIBROOT; done - println$ "Loaded felix file " + fname; - //println$ "Contents=" + flx; - write_string(s, html_header); - write_string(s, flx_head); - write_string(s,"<pre>"); - write_felix(s, flx); - write_string(s,"</pre>\n"); - write_string(s,"</body></html>\n"); + var eof_flag = false; + proc write_string(k:socket_t, t:string) + { + if not eof_flag do Flx_stream::write_string(k,t,&eof_flag); + else goto giveup; + done + } + + var flx = Text_file::load(fname); + if flx == "" do flx = Text_file::load(LIBROOT+"/"+fname); done + if flx == "" do flx = "NO FILE "+fname+" FOUND IN " + LIBROOT; done + println$ "Loaded felix file " + fname; + //println$ "Contents=" + flx; + write_string(s, html_header); + write_string(s, flx_head); + write_string(s,"<pre>"); + write_felix(s, flx, &eof_flag); + write_string(s,"</pre>\n"); + write_string(s,"</body></html>\n"); +giveup:> } proc serve_file(infname: string, s: socket_t) { + var eof_flag = false; // if empty string, serve index.html // not quite right - needs to handle directories too, so // not only foo.com/ -> index.html, but foo.com/images/ -> images/index.html @@ -472,7 +504,7 @@ proc serve_file(infname: string, s: socket_t) else if WIN32 do win32_send_file(s,fname, suffix); - elif POSIX do posix_send_file(s,fname, suffix); + elif POSIX do posix_send_file(s,fname, suffix,&eof_flag); done done } @@ -524,7 +556,7 @@ noinline proc handler (var k:socket_t) () //cat(s, DEVNULL); fprint$ cerr,"fthread closing socket "+str k+"\n"; - Faio::sleep(clock,1.0); // give OS time to empty its buffers + Faio::sleep(clock,0.1); // give OS time to empty its buffers ioclose(k); fprint$ cerr,"fthread "+str k+" terminating!\n"; }; commit 5f8a60e0040585d9812c2824f4854eb6dbf91647 Author: skaller <Max...@gm...> Date: Mon Oct 18 04:15:42 2010 +1100 Hyperlinks in webserver, use --root=FLX_INSTALL_DIR to set the root for include statements to do their lookup. diff --git a/lpsrc/flx_maker.pak b/lpsrc/flx_maker.pak index 5b82247..de407f9 100644 --- a/lpsrc/flx_maker.pak +++ b/lpsrc/flx_maker.pak @@ -432,6 +432,9 @@ dbug?? println$ "path="+path+": dir="+dir+",base="+base", ext="+ext; dbug?? println$ "cpps="+cpps; dbug?? println$ "cppos="+cppos; +var USER_ARGS = ""; whilst argno < System::argc do USER_ARGS+=" " + System::argv argno; ++argno; done +println$ "USER_ARGS=" + USER_ARGS; + if NOOPTIMISE == 0 do dbug?? println "Set C++ compiler optimisation switches"; CCFLAGS=CCFLAGS+" " + OPTIMISE; @@ -607,17 +610,7 @@ proc write_include_file(path:string) { Text_file::fclose f; } - -// grab program arguments -grab=1; -fun pop (x:List::list[string], n:int) => - if n == 0 then x - else match x with | Cons(_,?t) => pop(t,n-1) | Empty[string] => List::Empty[string] endmatch - endif -; - -var tail = pop (System::args(), argno); -var args= List::cat " " tail; +val args = USER_ARGS; dbug?? println$ "Target program args = "+args; var INCLUDE_DIR="-I"+Filename::join(FLX_INSTALL_DIR,"lib","rtl") + " -I"+Filename::join(FLX_INSTALL_DIR,"config","target"); diff --git a/tools/webserver.flx b/tools/webserver.flx index 492d105..58d78dd 100644 --- a/tools/webserver.flx +++ b/tools/webserver.flx @@ -24,6 +24,22 @@ macro fun dbg(x) = { fprint (cerr,x); }; // read new sockets off it .. open TerminalIByteStream[socket_t]; +var arg = ""; +var argno = 1; +fun prefix(arg:string,key:string)=> + arg.[to len key]==key +; +var LIBROOT = ""; +whilst argno<System::argc do + arg = System::argv argno; + println$ "ARG=" + arg; + if prefix(arg,"--root=") do + LIBROOT=arg.[7 to]+"/lib"; + done + ++argno; +done +println$ "LIBROOT="+LIBROOT; + fun getline_to_url (get:string) => if not startswith get "GET " then "" @@ -262,18 +278,31 @@ proc write_felix(k:socket_t, t:string) ; var b = ""; + var last_id = ""; proc cp() { b += ch; } + proc ws() { + if last_id == "include" do // hackery + var n = b; + whilst n.[0] == char "'" or n.[0] == char '"' do n = n.[1 to]; done + whilst n.[-1] == char "'" or n.[-1] == char '"' do n = n.[to -1]; done + if n.[-4 to] != ".flx" do n+= ".flx"; done // hack, fixme + write_string(k,'<a href="/'+n+'" >' + b + '</a>') ; + else + write_string(k,'<span class=fstring>'+b+"</span>"); + done + } proc w() { //println$ "Token["+str s+"]="+b; match s with - | dq => { write_string(k,'<span class=fstring>'+b+"</span>"); } - | sq => { write_string(k,'<span class=fstring>'+b+"</span>"); } - | sq3 => { write_string(k,'<span class=fstring>'+b+"</span>"); } - | dq3 => { write_string(k,'<span class=fstring>'+b+"</span>"); } + | dq => { ws; } + | sq => { ws; } + | sq3 => { ws; } + | dq3 => { ws; } | ccomment=> { write_string(k,'<span class=comment>'+b+"</span>"); } | cppcomment=> { write_string(k,'<span class=comment>'+b+"</span>"); } | id => { + last_id = b; if inarray(b,big_keywords) do write_string(k,'<span class=big_keyword>'+b+"</span>"); elif inarray(b,small_keywords) do write_string(k,'<span class=small_keyword>'+b+"</span>"); else write_string(k,b); done @@ -318,11 +347,11 @@ thisch:> // same char, reconsider it elif issq ch do s = sq; goto contin; elif isdq ch do s = dq; goto contin; elif ch == char "/" do - if ahead(1) == char "/" do cp(); next(); s = cppcomment; goto contin - elif ahead(1) == char "*" do cp(); next(); s = ccomment; goto contin + if ahead(1) == char "/" do cp; next; s = cppcomment; goto contin + elif ahead(1) == char "*" do cp; next; s = ccomment; goto contin else goto lastch done - else cp(); w(); goto nextt; + else cp; w; goto nextt; done } @@ -360,7 +389,7 @@ thisch:> // same char, reconsider it // triple quoted strings | sq3 => { - if issq3() do cp(); next(); cp(); next(); cp(); w(); goto nextt; + if issq3() do cp; next; cp; next; cp; w; goto nextt; elif ch== char "<" do b+="<"; goto nextch; elif ch== char ">" do b+=">"; goto nextch; elif ch== char "&" do b+="&"; goto nextch; @@ -369,7 +398,7 @@ thisch:> // same char, reconsider it } | dq3 => { - if isdq3() do cp(); next(); cp(); next(); cp(); w(); goto nextt; + if isdq3() do cp; next; cp; next; cp; w; goto nextt; elif ch== char "<" do b+="<"; goto nextch; elif ch== char ">" do b+=">"; goto nextch; elif ch== char "&" do b+="&"; goto nextch; @@ -386,7 +415,7 @@ thisch:> // same char, reconsider it | ccomment => // doesn't handle nested comments yet { if ch == char "*" and ahead(1) == char "/" do - cp(); + cp; goto lastch; else goto contin; done @@ -402,15 +431,17 @@ fin:> proc serve_felix(s:socket_t, fname:string) { - val flx = Text_file::load(fname); + var flx = Text_file::load(fname); + if flx == "" do flx = Text_file::load(LIBROOT+"/"+fname); done + if flx == "" do flx = "NO FILE "+fname+" FOUND IN " + LIBROOT; done println$ "Loaded felix file " + fname; //println$ "Contents=" + flx; write_string(s, html_header); write_string(s, flx_head); write_string(s,"<pre>"); write_felix(s, flx); - write_string(s,"</pre>"); - write_string(s,"</body></html>"); + write_string(s,"</pre>\n"); + write_string(s,"</body></html>\n"); } proc serve_file(infname: string, s: socket_t) @@ -493,7 +524,7 @@ noinline proc handler (var k:socket_t) () //cat(s, DEVNULL); fprint$ cerr,"fthread closing socket "+str k+"\n"; - Faio::sleep(clock,0.1); // give OS time to empty its buffers + Faio::sleep(clock,1.0); // give OS time to empty its buffers ioclose(k); fprint$ cerr,"fthread "+str k+" terminating!\n"; }; commit 0afe2ccec025ee6b3411767c6b003cf5ec1c7617 Author: skaller <Max...@gm...> Date: Mon Oct 18 02:37:14 2010 +1100 Add --options flag to flx to list current values of variant options. A bit of a hack. diff --git a/lpsrc/flx_maker.pak b/lpsrc/flx_maker.pak index 8db770d..5b82247 100644 --- a/lpsrc/flx_maker.pak +++ b/lpsrc/flx_maker.pak @@ -133,7 +133,6 @@ var FLX_INSTALL_DIR = Env::getenv("FLX_INSTALL_DIR", INSTALL_ROOT); // check for test mode: this argument must come first -var TESTMODE=0; var RECOMPILE=0; var DEBUG=0; var DEBUG_COMPILER=0; @@ -227,12 +226,10 @@ whilst grab == 1 and argno<System::argc do elif prefix(arg,"--test=") do dbug?? println "Set test directory"; - TESTMODE=1; FLX_INSTALL_DIR=arg.[7 to]; elif arg=="--test" do dbug?? println "Set test directory"; - TESTMODE=1; FLX_INSTALL_DIR="."; elif arg=="--install" do @@ -347,6 +344,27 @@ whilst grab == 1 and argno<System::argc do println$ "DEBUG_FLAGS = "+str DEBUG_FLAGS; System::exit(0); + elif arg == "--options" do + println$ "NOOPTIMISE = "+str NOOPTIMISE; + println$ "STATIC = "+str STATIC; + println$ "ECHO = "+str ECHO; + println$ "NOSTDLIB = "+str NOSTDLIB; + println$ "DEBUG = "+str DEBUG; + println$ "DEBUG_COMPILER = "+str DEBUG_COMPILER; + println$ "STDIMPORT = "+str STDIMPORT; + println$ "IMPORTS = "+str IMPORTS; + println$ "RECOMPILE = "+str RECOMPILE; + println$ "cpps = "+str cpps; + println$ "cppos = "+str cppos; + println$ "TIME = "+str TIME; + println$ "OUTPUT_DIR = "+str OUTPUT_DIR; + println$ "RUNIT = "+str RUNIT; + println$ "INCLUDE_DIRS = "+str INCLUDE_DIRS; + println$ "FELIX = "+str FELIX; + println$ "LINKER_SWITCHES = "+str LINKER_SWITCHES; + println$ "MACROS = "+str MACROS; + System::exit(0) + elif arg == "--where" do dbug?? println "Print location of install directory and exit"; println(FLX_INSTALL_DIR); @@ -928,7 +946,6 @@ FLX_INSTALL_DIR = os.getenv("FLX_INSTALL_DIR", INSTALL_ROOT) # check for test mode: this argument must come first -TESTMODE=0 RECOMPILE=0 DEBUG=0 DEBUG_COMPILER=0 @@ -1002,11 +1019,9 @@ while grab == 1 and argno<len(sys.argv): IMPORTS=IMPORTS + " " + arg[9:] elif prefix(arg,"--test="): - TESTMODE=1 FLX_INSTALL_DIR=arg[7:] elif arg=="--test": - TESTMODE=1 FLX_INSTALL_DIR="." elif prefix(arg,"--stdout="): @@ -1410,7 +1425,6 @@ sys.exit(0!=result) # check for test mode: this argument must come first -TESTMODE=0 RECOMPILE=0 DEBUG=0 INLINE=100 @@ -1454,13 +1468,11 @@ do ;; x--test=*) - TESTMODE=1 FLX_INSTALL_DIR=${1:7} shift ;; x--test) - TESTMODE=1 FLX_INSTALL_DIR=. shift ;; @@ -1986,132 +1998,6 @@ echo "---------" exit $bad -@head(1,'Package Manager Meta Info') -@head(2,'GODI') -This is the Godiva file originally used to -create the GODI data. At the moment this is -the authoritative meta data. However, -godiva may not handle all the options -we need -- so the generated makefile -is included as well. - -@select(tangler('meta/godiva/flx.godiva','data')) -Package: apps-felix -@tangle('Version: '+config.flx_version) -Revision: 0 -Depends: -Build-Depends: godi-ocaml (> 3.08) -@tangle('Sources: http://felix.sf.net/flx_'+config.flx_version+'_src.tgz') -@tangle('Unpacks-To: flx_'+config.flx_version) -Bytecode-Target: all -Opt-Target: all -Homepage: http://felix.sf.net -Maintainer: John Skaller <sk...@us...> -Options: configure -Description: Felix Compiler -Felix Compiler -. - -@select(tangler('meta/godiva/flx.godiva_camlsyntax','data')) -name = "felix"; -@tangle('version = "'+config.flx_version+'";') -revision = 0; -category = `apps; -depends = []; -build_depends = [`godi,"ocaml", Some (`gt, "3.08")]; -sources_site ="http://felix.sf.net/"; -@tangle('sources_basename= "flx_'+config.flx_version+'_src";') -sources_extension = ".tgz"; -@tangle('sources_unpacksto = "flx_'+config.flx_version+'";') -all_target= "all"; -opt_target= "all"; -homepage= "http://felix.sf.net"; -maintainer = "John Skaller <sk...@us...>"; -options= [`configure]; -short_desc = "Felix Compiler"; -long_desc = "Felix Compiler"; -confopts = [ - { - name = "SUPPORT_DYNAMIC_LOADING"; - default = "1"; - description = "Whether to support dlopen loading"; - implementation = `configarg "--SUPPORT_DYNAMIC_LOADING" - } -]; -specfile = "meta/godiva/flx.godiva_camlsyntax"; -patches = []; -filesdir = None; - -@select(tangler('meta/godi/DESCR','data')) -Felix Compiler and tools. - -@doc() -This makefile only here for reference (don't use it, -it should be generated). - -@select(tangler('meta/godi/Makefile','data')) -# This file was automatically generated by GODIVA -.include "../../mk/bsd.prefs.mk" -.include "../../mk/godi.pkg.mk" - -@tangle('VERSION= '+config.flx_version) -PKGNAME= apps-felix-${VERSION} -@tangle('PKGREVISION= '+config.godi_revision) -@tangle('DISTNAME= flx_'+config.flx_version) -@tangle('DISTFILES= flx_'+config.flx_version+'_src.tgz') -CATEGORIES= apps -MASTER_SITES= http://felix.sf.net/ -MAINTAINER= John Skaller <sk...@us...> -HOMEPAGE= http://felix.sf.net -COMMENT= Felix Compiler - -# confopt defaults: - - -AUTOGENERATE_PLIST = yes -PKG = apps-felix -MAKE_FLAGS= PREFIX=${PREFIX} - - - -PATH:= ${LOCALBASE}/bin:"${PATH}" -HAS_CONFIGURE = yes -CONFIGURE_ARGS+= --prefix ${PREFIX} -CONFIGURE_ENV+= ${BUILD_OCAMLFIND_ENV} -USE_GMAKE = yes - -MAKE_ENV+= ${BUILD_OCAMLFIND_ENV} PKGBASE=${PKGBASE:Q} - -pre-configure-copy: -. if exists(files) - cd files && ${PAX} -rw -pp . ${WRKSRC} -. endif - -pre-configure: pre-configure-copy - -pre-install-mkdirs: -. for d in bin lib/ocaml/pkg-lib doc share man etc info sbin include - ${_PKG_SILENT}${_PKG_DEBUG}mkdir -p ${PREFIX}/${d} -. endfor -. for n in 1 2 3 4 5 6 7 8 9 - ${_PKG_SILENT}${_PKG_DEBUG}mkdir -p ${PREFIX}/man/man${n} -. endfor - -pre-install: pre-install-mkdirs - -ALL_TARGET= all -.if ${GODI_HAVE_OCAMLOPT} == "yes" -# ALL_TARGET+= all -.endif - -post-install: - mkdir -p ${PREFIX}/doc/${PKG} -. for DOC in - install -m 0644 ${WRKSRC}/${DOC} ${PREFIX}/doc/${PKG} -. endfor - -.include "../../mk/bsd.pkg.mk" - @head(1,'Finish up') Just cleaning up script now. @make_executable(os.path.join('bin', 'flx.sh')) commit 2960d0fcaa8810ebbdb48fd4975ab26e0ceb0e21 Author: skaller <Max...@gm...> Date: Mon Oct 18 00:19:48 2010 +1100 Install option to retain file time stamps is "cp -Rp b src/ dst" diff --git a/lpsrc/flx_maker.pak b/lpsrc/flx_maker.pak index 3d3c967..8db770d 100644 --- a/lpsrc/flx_maker.pak +++ b/lpsrc/flx_maker.pak @@ -252,7 +252,7 @@ whilst grab == 1 and argno<System::argc do println$ "Cannot create directory " + INSTALL_ROOT_TOPDIR; System::exit 1; done - result=system("cp -ra "+FLX_INSTALL_DIR+" "+INSTALL_ROOT); + result=system("cp -Rp "+FLX_INSTALL_DIR+" "+INSTALL_ROOT); if result == 0 do println "Install succeeded" else println$ "Install failed, code = " + str(result); done commit 2dc112fbe00f65851115609be12549335a60cff5 Author: skaller <Max...@gm...> Date: Mon Oct 18 00:12:48 2010 +1100 Remove all the spkg stuff cause it isn't used now. Gets rid of some files too. diff --git a/lpsrc/flx_demux.pak b/lpsrc/flx_demux.pak index 38c763d..7d844e1 100644 --- a/lpsrc/flx_demux.pak +++ b/lpsrc/flx_demux.pak @@ -1,129 +1,6 @@ @import config @head(1,'demux') -@h = tangler('spkgs/demux.py') -@select(h) -import os - -import config - -DEMUXRTL_INTERFACES = [ - 'config/target/flx_demux_config.hpp', # portable - - # portable - 'src/demux/flx_demux.hpp', - 'src/demux/demux_demuxer.hpp', - 'src/demux/demux_timer_queue.hpp', - 'src/demux/demux_quitter.hpp', - - # windows (monolithic) - 'src/demux/win/demux_iocp_demuxer.hpp', - 'src/demux/win/demux_overlapped.hpp', - 'src/demux/win/demux_win_timer_queue.hpp', - 'src/demux/win/demux_wself_piper.hpp', - - # posix - 'src/demux/posix/demux_posix_demuxer.hpp', - 'src/demux/posix/demux_posix_timer_queue.hpp', - 'src/demux/posix/demux_pfileio.hpp', - 'src/demux/posix/demux_select_demuxer.hpp', - 'src/demux/posix/demux_sockety.hpp', - 'src/demux/posix/demux_self_piper.hpp', - 'src/demux/posix/demux_ts_select_demuxer.hpp', - - # linux, 10.3 (select impl), 10.4 real. - 'src/demux/poll/demux_poll_demuxer.hpp', - 'src/demux/poll/demux_ts_poll_demuxer.hpp', - - 'src/demux/epoll/demux_epoll_demuxer.hpp', # linux (>= 2.6) - 'src/demux/kqueue/demux_kqueue_demuxer.hpp', # osx(10.3 onwards)/bsd - 'src/demux/evtport/demux_evtport_demuxer.hpp', # solaris (9 onwards?) -] - -DEMUX_CPPS = [ - 'src/demux/flx_demux', - 'src/demux/demux_quitter', -] - -POSIX_DEMUX_CPPS = [ - 'src/demux/posix/demux_posix_demuxer', # posix - 'src/demux/posix/demux_select_demuxer', # posix - 'src/demux/posix/demux_posix_timer_queue', # posix - 'src/demux/posix/demux_sockety', # posix - 'src/demux/posix/demux_self_piper', # posix - 'src/demux/posix/demux_pfileio', # posix - 'src/demux/posix/demux_ts_select_demuxer', # posix -] - -POLL_DEMUX_CPPS = [ - # I've seen poll on linux and osx10.4 systems. - # conditionally compiled and used. - 'src/demux/poll/demux_poll_demuxer', # I've seen this on linux and osx10.4 - 'src/demux/poll/demux_ts_poll_demuxer', # ditto -] - -WINDOWS_DEMUX_CPPS = [ - 'src/demux/win/demux_iocp_demuxer', # windows - 'src/demux/win/demux_overlapped', # windows - 'src/demux/win/demux_wself_piper', # windows - 'src/demux/win/demux_win_timer_queue', # windows -] - -EXTRA_SYS_LIBS = '' -if config.WIN32: - DEMUX_CPPS = DEMUX_CPPS + WINDOWS_DEMUX_CPPS - if config.HAVE_MSVC: - EXTRA_SYS_LIBS = '/DEFAULTLIB:ws2_32 /DEFAULTLIB:mswsock ' - else: - # mingw - EXTRA_SYS_LIBS = '-lws2_32 -lmswsock ' - - -if config.POSIX: - DEMUX_CPPS = DEMUX_CPPS + POSIX_DEMUX_CPPS - -if config.TARGET_CXX.options.HAVE_KQUEUE_DEMUXER: - DEMUX_CPPS = DEMUX_CPPS + [ 'src/demux/kqueue/demux_kqueue_demuxer' ] - -if config.TARGET_CXX.options.HAVE_POLL: - DEMUX_CPPS = DEMUX_CPPS + POLL_DEMUX_CPPS - -if config.TARGET_CXX.options.HAVE_EPOLL: - DEMUX_CPPS = DEMUX_CPPS + [ 'src/demux/epoll/demux_epoll_demuxer' ] # Linux 2.6 + - -if config.TARGET_CXX.options.HAVE_EVTPORTS: - DEMUX_CPPS = DEMUX_CPPS + [ 'src/demux/evtport/demux_evtport_demuxer'] # solaris 10 - -if config.SOLARIS: - # RF: this might not be necessary anymore. - EXTRA_SYS_LIBS = '-lsocket -lnsl ' - -cpp_cpps = DEMUX_CPPS -lib_requires = ['libflx_pthread'] # however libflx not needed -pkg_requires = ['flx_pthread', 'flx_rtl'] # flx_rtl for config .hpp -dflags = EXTRA_SYS_LIBS -sflags = EXTRA_SYS_LIBS -build_macro = 'DEMUX' - -rtl_interfaces = DEMUXRTL_INTERFACES -felix_rtl = ['src/demux/flx_demux.flx'] - -iscr_source = [ - 'lpsrc/flx_demux.pak', -] - -weaver_directory = 'doc/rtl/flx_demux/' -tmpdir = ['demux'] -xfiles = [ - os.path.join('src', 'demux', '*'), - os.path.join('src', 'demux', 'epoll', '*'), - os.path.join('src', 'demux', 'evtport', '*'), - os.path.join('src', 'demux', 'kqueue', '*'), - os.path.join('src', 'demux', 'poll', '*'), - os.path.join('src', 'demux', 'posix', '*'), - os.path.join('src', 'demux', 'win', '*'), -] - @h = tangler('config/demux.fpc') @select(h) Name: demux diff --git a/lpsrc/flx_devutil.pak b/lpsrc/flx_devutil.pak deleted file mode 100644 index 875e9d7..0000000 --- a/lpsrc/flx_devutil.pak +++ /dev/null @@ -1,1220 +0,0 @@ -@head(1,"Developer utility scripts") -These script are NOT required to build Felix: they're utilies -related to munging the original code into interscript format, -and doing miscellaneous things during development. - -@head(2,'Attempt to produce Texinfo document') -Hack up the tutorial: phase 1 of conversion to texinfo format. -@h = tangler('script/mktitut.sed','python') -@select(h) -s/@set_title('\(.*\)')/\\input texinfo\n@settitle \1/ -s/@head(1,'\(.*\)')/@node \1\n@chapter \1/ -s/@head(1,"\(.*\)")/@node \1\n@chapter \1/ -s/@head(2,'\(.*\)')/@node \1\n@section \1/ -s/@head(2,"\(.*\)")/@node \1\n@section \1/ -s/@head(3,'\(.*\)')/@node \1\n@subsection \1/ -s/@head(3,"\(.*\)")/@node \1\n@subsection \1/ -s/@p()// -s/@select.*/@verbatim/ -s/@doc()/@end verbatim/ -s/@begin_displayed_code()/@verbatim/ -s/@end_displayed_code()/@end verbatim/ -s/@tdir =.*// -s/@execfile.*// -s/@h=// -s/@begin_table("\(.*\)","\(.*\)","\(.*\)")/@multitable @columnfractions .33 .33 .33\n@headitem \1 @tab \2 @tab \3/ -s/@begin_table("\(.*\)","\(.*\)")/@multitable @columnfractions .5 .5\n@headitem \1 @tab \2/ -s/@end_table()/@end multitable/ -s/@table_row("\(.*\)","\(.*\)","\(.*\)")/@item \1 @tab \2 @tab \3/ -s/@table_row("\(.*\)","\(.*\)")/@item \1 @tab \2/ -s/\\uXXXX/@verb{ \\uXXXX }/ -s/\\UXXXXXXXX/@verb{ \\UXXXXXXXX }/ -s/\\\\, \\', \\", \\r, \\n, \\t, \\b, \\v, \\f/@verb{ \\\\, \\', \\", \\r, \\n, \\t, \\b, \\v, \\f }/ -s/'else {}'\./@verb{.else {}.}/ -s/"{" /@verb{ { }/ -s/"}" /@verb{ } }/ -@doc() -Now phase 2, a python script. There are some caveats -on what it can handle: it generates just one menu. -@h = tangler('script/mktitut.py','python') -@select(h) -# modify an texinfo file to add a menu of all the nodes -# read from stdin, write to stout -import sys - -crap1 = """ -@@copying -This manual is for Felix version 1.1.0. -Copyright @copyright{} 2005 John Skaller -@@quotation -All rights relinquished, you can do whatever you -like with this manual. -@@end quotation -@@end copying - -@@titlepage -@@title Felix Overview -@@subtitle A quick guide to the basic ideas -@@author John Skaller -@@page -@@vskip 0pt plus 1filll -@@insertcopying -@@end titlepage -@@contents - -@@ifnottex -""" - -crap2 = """ -@@top Overview - -@@insertcopying -@@end ifnottex -""" - -cache = [] -menu = [] - -def nav(node): - for i in xrange(0,n): - if node == menu[i]: - if i == 0: prev = "Top" - else: prev = menu[i-1] - if i == n-1: next = "Top" - else: next = menu[i+1] - return next,prev - -flag = 0 -for line in sys.stdin: - if flag == 0: - if '@node ' == line[:6]: - node = line[6:-1] - flag = 1 - cache.append(line) - else: - cache.append(line) - else: - if '@chapter' == line[:8]: - #print "chapter" - menu.append(node) - elif '@section' == line[:8]: - #print "section" - menu.append(node) - elif '@subsection' == line[:11]: - #print "subsection" - menu.append(node) - else: - print "ERROR, need chapter section or subsection here" - print "got ",line, - raise "error" - cache.append('@section\n') - flag = 0 - - -n = len(menu) - -for line in cache: - if '@settitle' == line[:9]: - print '@setfilename ' + sys.argv[1] # the filename - print line, - print crap1 - print "@node Top, "+menu[0]+", "+menu[n-1]+",(dir)" - print crap2 - print '@menu' - for item in menu: - print "* " + item+":: "+item - print '@end menu' - elif '@node ' == line[:6]: - node = line[6:-1] - next,prev = nav(node) - print '@node '+node+', '+next+', '+prev+', Top' - else: - print line, -print - -@doc() -This is input to equiv-build, which makes -a dummy ocaml-3.08.3 package to satisfy -the debian package dependencies. -@h = tangler('misc/ocaml-nox-3.08.3-equiv','data') -@select(h) -Source: ocaml-nox-3.08.3 -Section: devel -Priority: optional -Maintainer: John Skaller <sk...@us...> -Standards-Version: 3.6.1 - -Package: ocaml-nox-3.08.3 -Architecture: any -Description: hack to tell system 0caml3.08.3... [truncated message content] |