From owner-svn-ports-all@FreeBSD.ORG Tue Feb 5 00:15:37 2013 Return-Path: Delivered-To: svn-ports-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id D15B7BD0; Tue, 5 Feb 2013 00:15:37 +0000 (UTC) (envelope-from mi@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id A9E8CA74; Tue, 5 Feb 2013 00:15:37 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id r150Fb5d046819; Tue, 5 Feb 2013 00:15:37 GMT (envelope-from mi@svn.freebsd.org) Received: (from mi@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id r150FaB8046808; Tue, 5 Feb 2013 00:15:36 GMT (envelope-from mi@svn.freebsd.org) Message-Id: <201302050015.r150FaB8046808@svn.freebsd.org> From: Mikhail Teterin Date: Tue, 5 Feb 2013 00:15:36 +0000 (UTC) To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r311658 - in head/devel: . tcl-mmap tcl-mmap/files X-SVN-Group: ports-head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-ports-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for the ports tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 05 Feb 2013 00:15:37 -0000 Author: mi Date: Tue Feb 5 00:15:35 2013 New Revision: 311658 URL: http://svnweb.freebsd.org/changeset/ports/311658 Log: Add port tcl-mmap -- Tcl interface to mmap(2). Added: head/devel/tcl-mmap/ head/devel/tcl-mmap/Makefile (contents, props changed) head/devel/tcl-mmap/distinfo (contents, props changed) head/devel/tcl-mmap/files/ head/devel/tcl-mmap/files/Makefile.bsd (contents, props changed) head/devel/tcl-mmap/files/alltests.tcl (contents, props changed) head/devel/tcl-mmap/files/patch-tests (contents, props changed) head/devel/tcl-mmap/files/patch-warnings (contents, props changed) head/devel/tcl-mmap/pkg-descr (contents, props changed) Modified: head/devel/Makefile Modified: head/devel/Makefile ============================================================================== --- head/devel/Makefile Tue Feb 5 00:05:29 2013 (r311657) +++ head/devel/Makefile Tue Feb 5 00:15:35 2013 (r311658) @@ -4222,6 +4222,7 @@ SUBDIR += talloc SUBDIR += tbb SUBDIR += tcl-memchan + SUBDIR += tcl-mmap SUBDIR += tcl-signal SUBDIR += tcl-trf SUBDIR += tclcheck Added: head/devel/tcl-mmap/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/devel/tcl-mmap/Makefile Tue Feb 5 00:15:35 2013 (r311658) @@ -0,0 +1,27 @@ +# Created by: Mikhail Teterin +# $FreeBSD$ + +PORTNAME= tcl-mmap +PORTVERSION= 1.1 +CATEGORIES= devel tcl +MASTER_SITES= SF + +MAINTAINER= tcltk@FreeBSD.org +COMMENT= New TCL channel type using mmap-ed files + +MAKEFILE= ${FILESDIR}/Makefile.bsd + +USE_TCL= 84+ + +MAKE_ENV+= TCL_VER=${TCL_VER} MKDIR="${MKDIR}" \ + PORTVERSION="${PORTVERSION}" \ + FILESDIR="${FILESDIR}" \ + TCLSH="${TCLSH}" \ + INSTALL_DATA="${INSTALL_DATA}" +PLIST_DIRS= lib/tcl${TCL_VER}/mmap +PLIST_FILES= ${PLIST_DIRS}/pkgIndex.tcl ${PLIST_DIRS}/libmmap${PORTVERSION}.so + +MANN= tcl-mmap.n +MANCOMPRESSED= maybe + +.include Added: head/devel/tcl-mmap/distinfo ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/devel/tcl-mmap/distinfo Tue Feb 5 00:15:35 2013 (r311658) @@ -0,0 +1,2 @@ +SHA256 (tcl-mmap-1.1.tar.gz) = e41dd103866437eb0e4ed42671be6587de0d2787998391cd5b9cc8fc67bf0bb0 +SIZE (tcl-mmap-1.1.tar.gz) = 276254 Added: head/devel/tcl-mmap/files/Makefile.bsd ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/devel/tcl-mmap/files/Makefile.bsd Tue Feb 5 00:15:35 2013 (r311658) @@ -0,0 +1,36 @@ +LIBNAME= mmap${PORTVERSION} +SHLIB_NAME= lib${LIBNAME}.so + +.PATH: ${.CURDIR}/unix ${.CURDIR}/doc + +SRCS= mmap.c +MAN= tcl-mmap.n + +TCL_VER?= 8.3 +LOCALBASE?= /usr/local + +CFLAGS+= -I${LOCALBASE}/include/tcl${TCL_VER} + +LDADD= -L${LOCALBASE}/lib -ltcl${TCL_VER:S/.//} + +all: pkgIndex.tcl test + +pkgIndex.tcl: + echo 'package ifneeded mmap ${PORTVERSION} \ + [list load [file join $$dir $(SHLIB_NAME)]]' > pkgIndex.tcl + +DIR = lib/tcl${TCL_VER}/mmap +LIBDIR = ${PREFIX}/${DIR} +MANDIR = ${PREFIX}/man/man +WARNS = 3 + +${LIBDIR}: + ${MKDIR} ${LIBDIR} + +beforeinstall: ${LIBDIR} pkgIndex.tcl + ${INSTALL_DATA} pkgIndex.tcl ${LIBDIR}/ + +.include + +test: ${SHLIB_NAME} pkgIndex.tcl + cd tests && ${TCLSH} ${FILESDIR}/alltests.tcl Added: head/devel/tcl-mmap/files/alltests.tcl ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/devel/tcl-mmap/files/alltests.tcl Tue Feb 5 00:15:35 2013 (r311658) @@ -0,0 +1,6 @@ +lappend auto_path .. + +foreach t [glob *.tcl] { + puts "Running tests from $t" + source $t +} Added: head/devel/tcl-mmap/files/patch-tests ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/devel/tcl-mmap/files/patch-tests Tue Feb 5 00:15:35 2013 (r311658) @@ -0,0 +1,79 @@ +--- tests/mmap_err.tcl 2008-04-12 19:45:49.000000000 -0400 ++++ tests/mmap_err.tcl 2013-02-04 18:38:40.000000000 -0500 +@@ -1,29 +1,10 @@ + #!/usr/bin/tclsh + package require mmap +-set fd [open /tmp/messages r] +-set mp [mmap -length 30 -offset 4095 $fd] +-close $fd +- +-puts Gets: +-for {set i 0} {$i < 10} {incr i} { +- gets $mp line +- puts $line ++set fd [open messages r] ++if {[catch {mmap -length 30 -offset 4095 $fd} mp]} { ++ close $fd ++ puts "Using offset 4095 resulted in error ($mp), as expected. Good" ++} else { ++ puts "Offset 4095 should've caused an error. Test failed" ++ exit 1 + } +-close $mp +- +-set fd [open /tmp/a r+] +-set mp [mmap -shared -length 30 $fd] +-close $fd +- +-flush $mp +- +-seek $mp 1 +-puts -nonewline $mp alex +-seek $mp 0 +- +-puts Read: +-puts [read $mp] +- +-puts [eof $mp] +- +-close $mp +--- tests/test_mem2.tcl 2008-04-21 08:34:42.000000000 -0400 ++++ tests/test_mem2.tcl 2013-02-04 18:41:57.000000000 -0500 +@@ -2,10 +2,10 @@ + package require mmap + +-catch { file copy tests/testfile tests/testfile1 } +-set fd [open tests/testfile1 r+] ++catch { file copy testfile testfile1 } ++set fd [open testfile1 r+] + set mp [mmap -shared -length 30 $fd] + close $fd + +-while {1} { ++for {set i 0} {$i < 3} {incr i} { + flush $mp + +@@ -23,3 +23,3 @@ + close $mp + +-file delete tests/testfile1 ++file delete testfile1 +--- tests/test_mem.tcl 2008-04-21 08:35:36.000000000 -0400 ++++ tests/test_mem.tcl 2013-02-04 18:43:29.000000000 -0500 +@@ -2,7 +2,7 @@ + package require mmap + +-while {1} { +-catch { file copy tests/testfile tests/testfile1 } +-set fd [open tests/testfile1 r+] ++for {set i 0} {$i < 3} {incr i} { ++catch { file copy testfile testfile1 } ++set fd [open testfile1 r+] + set mp [mmap -shared -length 30 $fd] + close $fd +@@ -21,4 +21,4 @@ + close $mp + +-file delete tests/testfile1 ++file delete testfile1 + } Added: head/devel/tcl-mmap/files/patch-warnings ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/devel/tcl-mmap/files/patch-warnings Tue Feb 5 00:15:35 2013 (r311658) @@ -0,0 +1,148 @@ +Submitted upstream as: + +https://sourceforge.net/tracker/?func=detail&aid=3603360&group_id=224597&atid=1062254 + +--- unix/mmap.c 2008-04-21 08:47:04.000000000 -0400 ++++ unix/mmap.c 2013-02-04 18:18:52.000000000 -0500 +@@ -37,23 +37,16 @@ + */ + +-static int MmapCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); ++Tcl_PackageInitProc Mmap_Init; + +-void NewChannelName(char *name, CONST char* prefix); ++static Tcl_ObjCmdProc MmapCmd; + +-static int Input(ClientData instanceData, char *buf, int bufSize, int *errorCodePtr); ++static void NewChannelName(char *name, const char* prefix); + +-static int Output(ClientData instanceData, const char *buf, int bufSize, int *errorCodePtr); +- +-static int Seek(ClientData instanceData, long offset, int seekMode, int *errorCodePtr); +- +-static int Close(ClientData instanceData, Tcl_Interp *interp); +- +-static void Watch(ClientData instanceData, int mask); +- +-//static int BlockMode(ClientData instanceData, int mode); +- +-static int GetHandle(ClientData instanceData, int direction, ClientData *handlePtr); +- +-//static void catch_signal(int sig_num); ++static Tcl_DriverInputProc Input; ++static Tcl_DriverOutputProc Output; ++static Tcl_DriverSeekProc Seek; ++static Tcl_DriverCloseProc Close; ++static Tcl_DriverWatchProc Watch; ++static Tcl_DriverGetHandleProc GetHandle; + + /* +@@ -62,19 +55,12 @@ + + static Tcl_ChannelType channelType = { +- "mmap", /* Channel type name */ +- TCL_CHANNEL_VERSION_2, +- (Tcl_DriverCloseProc *) Close, +- (Tcl_DriverInputProc *) Input, +- (Tcl_DriverOutputProc *) Output, +- (Tcl_DriverSeekProc *) Seek, +- (Tcl_DriverSetOptionProc *) NULL, /* no channel type specific options */ +- (Tcl_DriverGetOptionProc *) NULL, /* no channel type specific options */ +- (Tcl_DriverWatchProc *) Watch, +- (Tcl_DriverGetHandleProc *) GetHandle, +- (Tcl_DriverClose2Proc *) NULL, /* no support for closing the read and write sides independently */ +- (Tcl_DriverBlockModeProc *) NULL, /* mmap channels are always in non-blocking mode */ +- //(Tcl_DriverBlockModeProc *) BlockMode, +- (Tcl_DriverFlushProc *) NULL, /* currently reserved for future use. It should be set to NULL */ +- (Tcl_DriverHandlerProc *) NULL /* this is not a stacked channel driver */ ++ .typeName = "mmap", /* Channel type name */ ++ .version = TCL_CHANNEL_VERSION_2, ++ .closeProc = Close, ++ .inputProc = Input, ++ .outputProc = Output, ++ .seekProc = Seek, ++ .watchProc = Watch, ++ .getHandleProc = GetHandle + }; + +@@ -129,9 +115,9 @@ + } + +- if (bufSize > data->length - data->seek) { ++ if (bufSize > (int)(data->length - data->seek)) { + bufSize = data->length - data->seek; + } + +- memcpy((char *)buf, (char *) (data->addr + data->seek), (size_t) bufSize); ++ memcpy(buf, data->addr + data->seek, (size_t)bufSize); + data->seek += bufSize; + +@@ -144,10 +130,10 @@ + int ret; + +- if (bufSize > data->length - data->seek) { ++ if (bufSize > (int)(data->length - data->seek)) { + bufSize = data->length - data->seek; +- memcpy((char *) (data->addr + data->seek), (char *) buf, (size_t) bufSize); ++ memcpy(data->addr + data->seek, buf, (size_t)bufSize); + data->seek = 0; + } else { +- memcpy((char *) (data->addr + data->seek), (char *) buf, (size_t) bufSize); ++ memcpy(data->addr + data->seek, buf, (size_t)bufSize); + data->seek += bufSize; + } +@@ -163,4 +149,5 @@ + static int Seek(ClientData instanceData, long offset, int seekMode, int *errorCodePtr) { + ChannelInstance* data; ++ off_t seek; + data = (ChannelInstance*) instanceData; + +@@ -178,21 +165,20 @@ + switch (seekMode) { + case SEEK_SET: +- data->seek = offset; ++ seek = offset; + break; + + case SEEK_CUR: +- data->seek += offset; ++ seek += offset; + break; + + case SEEK_END: +- data->seek = data->length + offset; ++ seek = data->length + offset; + break; + } + + /* We check if seek is within range, and fix */ +- if (data->seek < 0) data->seek = 0; +- if (data->seek > data->length) data->seek = data->length; +- +- return data->seek; ++ if (seek < 0) seek = 0; ++ if (seek > (off_t)data->length) seek = data->length; ++ return data->seek = seek; + } + +@@ -255,5 +241,5 @@ + */ + static int MmapCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { +- static char* cmds[] = { "-shared", "-length", "-offset", NULL }; ++ static const char* cmds[] = { "-shared", "-length", "-offset", NULL }; + int index; + int ret; +@@ -329,5 +315,5 @@ + ClientData cd; + ret = Tcl_GetChannelHandle(chan, mode, (ClientData *) &cd); +- fd = (int) cd; // This should be ok because the pointer size in bytes is at least as may bytes as 'int' ++ fd = (intptr_t) cd; // This should be ok because the pointer size in bytes is at least as may bytes as 'int' + if (ret != TCL_OK) { + Tcl_SetResult(interp, "Could not get file handle", TCL_STATIC); +@@ -384,5 +370,5 @@ + } + +-void NewChannelName(char *name, CONST char* prefix) { ++void NewChannelName(char *name, const char* prefix) { + TCL_DECLARE_MUTEX (mmapCounterMutex) + static unsigned long mmapCounter = 0; Added: head/devel/tcl-mmap/pkg-descr ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/devel/tcl-mmap/pkg-descr Tue Feb 5 00:15:35 2013 (r311658) @@ -0,0 +1,11 @@ +This extension provides a Tcl interface to the mmap(2) POSIX system +call. + +The functionality of 'mmap' is exported from this extension in the +form of a new Tcl channel type, named "mmap". A memory mapping is +established with the 'mmap' command. Following 'mmap' execution, +access to the memory mapped file is done via the standard Tcl +commands: puts/gets/seek/flush/close/fconfigure, only that this +time these commands operate on memory, rather than on a file. + +WWW: http://tcl-mmap.sourceforge.net/