diff --git a/moo/Makefile.in b/moo/Makefile.in index 93aa608..7412225 100644 --- a/moo/Makefile.in +++ b/moo/Makefile.in @@ -362,6 +362,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -595,7 +596,7 @@ distdir: $(DISTFILES) ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir - tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir @@ -621,7 +622,7 @@ dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 - shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir @@ -639,7 +640,7 @@ dist dist-all: distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ - eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ @@ -649,7 +650,7 @@ distcheck: dist *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ - eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac diff --git a/moo/configure b/moo/configure index 6f91175..9209478 100755 --- a/moo/configure +++ b/moo/configure @@ -803,6 +803,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -900,6 +901,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1152,6 +1154,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1289,7 +1300,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1442,6 +1453,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] diff --git a/moo/kernel/Process.moo b/moo/kernel/Process.moo index d8fdc54..135e1bc 100644 --- a/moo/kernel/Process.moo +++ b/moo/kernel/Process.moo @@ -52,9 +52,11 @@ class Semaphore(Object) { var waiting_head := nil, waiting_tail := nil, - count := 0, - heapIndex := -1, - fireTimeSec := 0, + count := 0. + + var(#get,#set) heapIndex := -1. + + var fireTimeSec := 0, fireTimeNsec := 0, ioIndex := -1, ioHandle := nil, @@ -81,16 +83,6 @@ class Semaphore(Object) ## ================================================================== - method heapIndex - { - ^heapIndex - } - - method heapIndex: anIndex - { - heapIndex := anIndex - } - method fireTime { ^fireTimeSec @@ -221,6 +213,13 @@ method(#class,#abstract) xxx. => method(#class) xxx { self subclassResponsibilit method(#primitive) _removeSemaphore: sem. method(#primitive) _wait. + method addSemaphore: sem + { + | x | + x := self _addSemaphore: sem. + if (x isError) { thisProcess primError dump. Exception signal: ('Cannot add a semaphore - ' & thisProcess primError) }. + ^x + } method wait { | r | diff --git a/moo/kernel/Socket.moo b/moo/kernel/Socket.moo index 4ffaee3..3da1933 100644 --- a/moo/kernel/Socket.moo +++ b/moo/kernel/Socket.moo @@ -3,8 +3,9 @@ class Socket(Object) from 'sck' var handle := -1. method(#primitive) _open(domain, type, proto). - method(#primitive) _connect(a,b,c). method(#primitive) _close. + + method(#primitive) _connect(a,b,c). } (* TODO: generate these domain and type from the C header *) @@ -22,27 +23,113 @@ pooldic Socket.Type extend Socket { - method(#class) domain: domain type: type + method(#class) new { self messageProhibited: #new } + method(#class) new: size { self messageProhibited: #new: } + + method(#class) _domain: domain _type: type { ^super new _open(domain, type, 0). } - method beginConnect + method(#class) domain: domain type: type { - (* - | s1 s1 | - s1 = Semaphore new. - s2 = Semaphore new. + | s | + s := super new _open(domain, type, 0). + if (s isError) { Exception signal: 'Cannot open socket' }. + ^s. + } - s1 signalHandler: [xxxxx]. - s2 signalHandler: [xxxxxx]. + method close + { + if (self.handle >= 0) + { + ## this primitive method may return failure. + ## but ignore it in this normal method. + self _close. + self.handle := -1. + } + } - fcntl (nonblock); + method asyncConnect: connectBlock + { + | s1 s2 sg | + s1 := Semaphore new. + s2 := Semaphore new. + + s1 signalAction: [:sem | Processor unsignal: s1. connectBlock value: true]. + s2 signalAction: [:sem | Processor unsignal: s2. connectBlock value: false]. Processor signal: s1 onOutput: self.handle. - Processor signal: s2 after: timeout. + Processor signal: s2 after: 10. - connect (); - *) + sg := SemaphoreGroup new. + sg addSemaphore: s1. + sg addSemaphore: s2. +sg addSemaphore: s1. +sg addSemaphore: 10. +sg addSemaphore: s1. + + if (self _connect(1, 2, 3) isError) + { + Exception signal: 'Cannot connect to 1,2,3'. + }. + + sg wait. + } + + method asyncRead: readBlock + { + | s1 s2 | + s1 := Semaphore new. + s2 := Semaphore new. + + s1 signalAction: [:sem | readBlock value: true]. + s2 signalAction: [:sem | readBlock value: false]. + + Processor signal: s1 onInput: self.handle. + Processor signal: s2 after: 10. + } + +(* + method asyncWrite: + { + | s1 s2 | + s1 := Semaphore new. + s2 := Semaphore new. + + s1 signalAction: [:sem | writeBlock value: true]. + s2 signalAction: [:sem | writeBlock value: false]. + + Processor signal: s1 onOutput: self.handle. + Processor signal: s2 after: 10. + } +*) + +} + + +(**** +class MyObject(Object) +{ + + method(#class) main + { + | s | + [ + s := Socket domain: Socket.Domain.INET type: Socket.Type.STREAM. + s dump. + + s asyncConnect: [:result | + ##s endConnect: result. + ##s beginRead: xxx. + 'CONNECTED NOW.............' dump. + ]. + + s close dump. + ] on: Exception do: [:ex | ('Exception - ' & ex messageText) dump ]. + + '----- END OF MAIN ------' dump. } } +*****) + diff --git a/moo/kernel/generr.moo b/moo/kernel/generr.moo index 7486e14..e2738b0 100644 --- a/moo/kernel/generr.moo +++ b/moo/kernel/generr.moo @@ -27,6 +27,7 @@ class MyObject(Object) 'interrupted' 'pipe error' 'resource temporarily unavailable' + 'bad system handle' 'data too large' 'message receiver error' diff --git a/moo/kernel/test-002.moo b/moo/kernel/test-002.moo index 2b2ef8f..85c3af5 100644 --- a/moo/kernel/test-002.moo +++ b/moo/kernel/test-002.moo @@ -132,12 +132,27 @@ class MyObject(Object) s1 := TcpSocket new. s1 onEvent: #connected do: [ - s1 write: C'GET / HTTP/1.0\n\r'. + s1 waitToRead. + ##s1 beginWrite: C'GET / HTTP/1.0\n\r'. ] s1 onEvent: #written do: [ -] +]. -s1 on: #read do: -s1 connectTo: '1.2.3.4:45'. +s1 onEvent: #readyToRead do: [ + +]. +s1 beginConnect: '1.2.3.4:45' onConnected: [ :result | xxxx]. + + +#### +s1 beginConnect: destination onConnected: +s1 endConnect --> return what? +s1 endReceive +s1 beginReceive: buffer callback: [xxxx]. +s1 beginSend: data onEnd: [do this]. +s1 endSend + +s1 beginAccept: [callback] +s1 endAccept -> returns the actual socket *) diff --git a/moo/lib/Makefile.in b/moo/lib/Makefile.in index 2ad657f..b68939e 100644 --- a/moo/lib/Makefile.in +++ b/moo/lib/Makefile.in @@ -398,6 +398,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ diff --git a/moo/lib/err.c b/moo/lib/err.c index 4481f1b..385f1c2 100644 --- a/moo/lib/err.c +++ b/moo/lib/err.c @@ -48,26 +48,28 @@ static moo_ooch_t errstr_14[] = {'n','o','t',' ','a',' ','d','i','r','e','c','t' static moo_ooch_t errstr_15[] = {'i','n','t','e','r','r','u','p','t','e','d','\0'}; static moo_ooch_t errstr_16[] = {'p','i','p','e',' ','e','r','r','o','r','\0'}; static moo_ooch_t errstr_17[] = {'r','e','s','o','u','r','c','e',' ','t','e','m','p','o','r','a','r','i','l','y',' ','u','n','a','v','a','i','l','a','b','l','e','\0'}; -static moo_ooch_t errstr_18[] = {'d','a','t','a',' ','t','o','o',' ','l','a','r','g','e','\0'}; -static moo_ooch_t errstr_19[] = {'m','e','s','s','a','g','e',' ','r','e','c','e','i','v','e','r',' ','e','r','r','o','r','\0'}; -static moo_ooch_t errstr_20[] = {'m','e','s','s','a','g','e',' ','s','e','n','d','i','n','g',' ','e','r','r','o','r','\0'}; -static moo_ooch_t errstr_21[] = {'w','r','o','n','g',' ','n','u','m','b','e','r',' ','o','f',' ','a','r','g','u','m','e','n','t','s','\0'}; -static moo_ooch_t errstr_22[] = {'r','a','n','g','e',' ','e','r','r','o','r','\0'}; -static moo_ooch_t errstr_23[] = {'b','y','t','e','-','c','o','d','e',' ','f','u','l','l','\0'}; -static moo_ooch_t errstr_24[] = {'d','i','c','t','i','o','n','a','r','y',' ','f','u','l','l','\0'}; -static moo_ooch_t errstr_25[] = {'p','r','o','c','e','s','s','o','r',' ','f','u','l','l','\0'}; -static moo_ooch_t errstr_26[] = {'s','e','m','a','p','h','o','r','e',' ','h','e','a','p',' ','f','u','l','l','\0'}; -static moo_ooch_t errstr_27[] = {'s','e','m','a','p','h','o','r','e',' ','l','i','s','t',' ','f','u','l','l','\0'}; -static moo_ooch_t errstr_28[] = {'d','i','v','i','d','e',' ','b','y',' ','z','e','r','o','\0'}; -static moo_ooch_t errstr_29[] = {'I','/','O',' ','e','r','r','o','r','\0'}; -static moo_ooch_t errstr_30[] = {'e','n','c','o','d','i','n','g',' ','c','o','n','v','e','r','s','i','o','n',' ','e','r','r','o','r','\0'}; -static moo_ooch_t errstr_31[] = {'b','u','f','f','e','r',' ','f','u','l','l','\0'}; +static moo_ooch_t errstr_18[] = {'b','a','d',' ','s','y','s','t','e','m',' ','h','a','n','d','l','e','\0'}; +static moo_ooch_t errstr_19[] = {'d','a','t','a',' ','t','o','o',' ','l','a','r','g','e','\0'}; +static moo_ooch_t errstr_20[] = {'m','e','s','s','a','g','e',' ','r','e','c','e','i','v','e','r',' ','e','r','r','o','r','\0'}; +static moo_ooch_t errstr_21[] = {'m','e','s','s','a','g','e',' ','s','e','n','d','i','n','g',' ','e','r','r','o','r','\0'}; +static moo_ooch_t errstr_22[] = {'w','r','o','n','g',' ','n','u','m','b','e','r',' ','o','f',' ','a','r','g','u','m','e','n','t','s','\0'}; +static moo_ooch_t errstr_23[] = {'r','a','n','g','e',' ','e','r','r','o','r','\0'}; +static moo_ooch_t errstr_24[] = {'b','y','t','e','-','c','o','d','e',' ','f','u','l','l','\0'}; +static moo_ooch_t errstr_25[] = {'d','i','c','t','i','o','n','a','r','y',' ','f','u','l','l','\0'}; +static moo_ooch_t errstr_26[] = {'p','r','o','c','e','s','s','o','r',' ','f','u','l','l','\0'}; +static moo_ooch_t errstr_27[] = {'s','e','m','a','p','h','o','r','e',' ','h','e','a','p',' ','f','u','l','l','\0'}; +static moo_ooch_t errstr_28[] = {'s','e','m','a','p','h','o','r','e',' ','l','i','s','t',' ','f','u','l','l','\0'}; +static moo_ooch_t errstr_29[] = {'d','i','v','i','d','e',' ','b','y',' ','z','e','r','o','\0'}; +static moo_ooch_t errstr_30[] = {'I','/','O',' ','e','r','r','o','r','\0'}; +static moo_ooch_t errstr_31[] = {'e','n','c','o','d','i','n','g',' ','c','o','n','v','e','r','s','i','o','n',' ','e','r','r','o','r','\0'}; +static moo_ooch_t errstr_32[] = {'b','u','f','f','e','r',' ','f','u','l','l','\0'}; static moo_ooch_t* errstr[] = { errstr_0, errstr_1, errstr_2, errstr_3, errstr_4, errstr_5, errstr_6, errstr_7, errstr_8, errstr_9, errstr_10, errstr_11, errstr_12, errstr_13, errstr_14, errstr_15, errstr_16, errstr_17, errstr_18, errstr_19, errstr_20, errstr_21, errstr_22, errstr_23, - errstr_24, errstr_25, errstr_26, errstr_27, errstr_28, errstr_29, errstr_30, errstr_31 + errstr_24, errstr_25, errstr_26, errstr_27, errstr_28, errstr_29, errstr_30, errstr_31, + errstr_32 }; #if defined(MOO_INCLUDE_COMPILER) @@ -242,6 +244,7 @@ moo_errnum_t moo_syserr_to_errnum (int e) { case ENOMEM: return MOO_ESYSMEM; case EINVAL: return MOO_EINVAL; + #if defined(EBUSY) case EBUSY: return MOO_EBUSY; #endif @@ -272,6 +275,15 @@ moo_errnum_t moo_syserr_to_errnum (int e) #elif defined(EWOULDBLOCK) case EWOULDBLOCK: return MOO_EAGAIN; #endif + + #if defined(EBADF) + case EBADF: return MOO_EBADHND; + #endif + + #if defined(EIO) + case EIO: return MOO_EIOERR; + #endif + default: return MOO_ESYSERR; } #endif diff --git a/moo/lib/moo.h b/moo/lib/moo.h index 5d26f5b..035d6fe 100644 --- a/moo/lib/moo.h +++ b/moo/lib/moo.h @@ -64,6 +64,7 @@ enum moo_errnum_t MOO_EINTR, MOO_EPIPE, MOO_EAGAIN, + MOO_EBADHND, MOO_ENOAVAIL, /**< data not available*/ MOO_EMSGRCV, /**< mesasge receiver error */ diff --git a/moo/mod/Makefile.in b/moo/mod/Makefile.in index b18b14b..9303c86 100644 --- a/moo/mod/Makefile.in +++ b/moo/mod/Makefile.in @@ -424,6 +424,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ diff --git a/moo/mod/sck.c b/moo/mod/sck.c index 0d3489d..c21abad 100644 --- a/moo/mod/sck.c +++ b/moo/mod/sck.c @@ -98,15 +98,18 @@ static moo_pfrc_t pf_close_socket (moo_t* moo, moo_ooi_t nargs) if (close(MOO_OOP_TO_SMOOI(sck->handle)) == -1) { MOO_STACK_SETRETTOERROR (moo, nargs, moo_syserr_to_errnum(errno)); - return MOO_PF_SUCCESS; } else { sck->handle = MOO_SMOOI_TO_OOP(-1); + MOO_STACK_SETRETTORCV (moo, nargs); } } + else + { + MOO_STACK_SETRETTOERROR (moo, nargs, MOO_EBADHND); + } - MOO_STACK_SETRETTORCV (moo, nargs); return MOO_PF_SUCCESS; }