567 lines
26 KiB
Plaintext
567 lines
26 KiB
Plaintext
--- src/cmd/ksh93/sh/xec.c
|
|
+++ src/cmd/ksh93/sh/xec.c 2013-02-01 16:22:50.000000000 +0000
|
|
@@ -2741,11 +2741,6 @@ int sh_exec(register const Shnode_t *t,
|
|
slp = (struct slnod*)np->nvenv;
|
|
sh_funstaks(slp->slchild,-1);
|
|
stakdelete(slp->slptr);
|
|
- if(shp->funload)
|
|
- {
|
|
- free((void*)np->nvalue.rp);
|
|
- np->nvalue.rp = 0;
|
|
- }
|
|
if(rp->sdict)
|
|
{
|
|
Namval_t *mp, *nq;
|
|
@@ -2759,6 +2754,12 @@ int sh_exec(register const Shnode_t *t,
|
|
dtclose(rp->sdict);
|
|
rp->sdict = 0;
|
|
}
|
|
+ if(shp->funload)
|
|
+ {
|
|
+ if(!shp->fpathdict)
|
|
+ free((void*)np->nvalue.rp);
|
|
+ np->nvalue.rp = 0;
|
|
+ }
|
|
}
|
|
if(!np->nvalue.rp)
|
|
{
|
|
@@ -2769,7 +2770,7 @@ int sh_exec(register const Shnode_t *t,
|
|
{
|
|
static Dtdisc_t _Rpdisc =
|
|
{
|
|
- offsetof(struct Ufunction,fname), -1, sizeof(struct Ufunction)
|
|
+ offsetof(struct Ufunction,fname), -1, sizeof(struct Ufunction)
|
|
};
|
|
struct functnod *fp;
|
|
struct comnod *ac = t->funct.functargs;
|
|
@@ -2796,8 +2797,10 @@ int sh_exec(register const Shnode_t *t,
|
|
rp->np = np;
|
|
if(!shp->fpathdict)
|
|
shp->fpathdict = dtopen(&_Rpdisc,Dtobag);
|
|
- if(shp->fpathdict)
|
|
+ if(shp->fpathdict) {
|
|
+ dtuserdata(shp->fpathdict,shp,1);
|
|
dtinsert(shp->fpathdict,rp);
|
|
+ }
|
|
}
|
|
}
|
|
else
|
|
--- src/lib/libast/Mamfile
|
|
+++ src/lib/libast/Mamfile 2013-01-30 10:01:13.000000000 +0000
|
|
@@ -3969,6 +3969,14 @@ meta dtopen.o %.c>%.o cdt/dtopen.c dtope
|
|
prev cdt/dtopen.c
|
|
exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icdt -Icomp -Iinclude -Istd -I${INSTALLROOT}/include/ast -D_PACKAGE_ast -c cdt/dtopen.c
|
|
done dtopen.o generated
|
|
+make dtstat.o
|
|
+make cdt/dtstat.c
|
|
+prev cdt/dthdr.h implicit
|
|
+done cdt/dtstat.c
|
|
+meta dtstat.o %.c>%.o cdt/dtstat.c dtstat
|
|
+prev cdt/dtstat.c
|
|
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icdt -Icomp -Iinclude -Istd -I${INSTALLROOT}/include/ast -D_PACKAGE_ast -c cdt/dtstat.c
|
|
+done dtstat.o generated
|
|
make dtstrhash.o
|
|
make cdt/dtstrhash.c
|
|
prev cdt/dthdr.h implicit
|
|
@@ -3985,6 +3993,14 @@ meta dttree.o %.c>%.o cdt/dttree.c dttre
|
|
prev cdt/dttree.c
|
|
exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icdt -Icomp -Iinclude -Istd -I${INSTALLROOT}/include/ast -D_PACKAGE_ast -c cdt/dttree.c
|
|
done dttree.o generated
|
|
+make dtuser.o
|
|
+make cdt/dtuser.c
|
|
+prev cdt/dthdr.h implicit
|
|
+done cdt/dtuser.c
|
|
+meta dtuser.o %.c>%.o cdt/dtuser.c dtuser
|
|
+prev cdt/dtuser.c
|
|
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icdt -Icomp -Iinclude -Istd -I${INSTALLROOT}/include/ast -D_PACKAGE_ast -c cdt/dtuser.c
|
|
+done dtuser.o generated
|
|
make dtview.o
|
|
make cdt/dtview.c
|
|
prev cdt/dthdr.h implicit
|
|
@@ -6101,7 +6117,7 @@ exec - ${AR} rc libast.a state.o transit
|
|
exec - ${AR} rc libast.a streval.o strexpr.o strmatch.o strcopy.o modei.o modex.o strmode.o strlcat.o strlcpy.o strlook.o strncopy.o strsearch.o strpsearch.o stresc.o stropt.o strtape.o strpcmp.o strnpcmp.o strvcmp.o strnvcmp.o tok.o tokline.o tokscan.o pathaccess.o pathcat.o pathcanon.o pathcheck.o pathpath.o pathexists.o pathfind.o pathkey.o pathprobe.o pathrepl.o pathnative.o pathposix.o pathtemp.o pathtmp.o pathstat.o pathgetlink.o pathsetlink.o pathbin.o pathshell.o pathcd.o pathprog.o fs3d.o ftwalk.o ftwflags.o fts.o astintercept.o conformance.o getenv.o setenviron.o optget.o optjoin.o optesc.o optctx.o strsort.o struniq.o magic.o mime.o mimetype.o signal.o sigflag.o systrace.o error.o errorf.o errormsg.o errorx.o localeconv.o setlocale.o translate.o catopen.o iconv.o lc.o lctab.o mc.o base64.o recfmt.o recstr.o reclen.o fmtrec.o fmtbase.o fmtbuf.o fmtclock.o fmtdev.o fmtelapsed.o fmterror.o fmtesc.o fmtfmt.o fmtfs.o fmtident.o fmtint.o fmtip4.o fmtip6.o fmtls.o fmtmatch.o fmtmode.o fmtnum.o fmtperm.o fmtre.o fmttime.o
|
|
exec - ${AR} rc libast.a fmtuid.o fmtgid.o fmtsignal.o fmtscale.o fmttmx.o fmttv.o fmtversion.o strelapsed.o strperm.o struid.o strgid.o strtoip4.o strtoip6.o stack.o stk.o swapget.o swapmem.o swapop.o swapput.o sigdata.o sigcrit.o sigunblock.o procopen.o procclose.o procrun.o procfree.o tmdate.o tmequiv.o tmfix.o tmfmt.o tmform.o tmgoff.o tminit.o tmleap.o tmlex.o tmlocale.o tmmake.o tmpoff.o tmscan.o tmsleep.o tmtime.o tmtype.o tmweek.o tmword.o tmzone.o tmxdate.o tmxduration.o tmxfmt.o tmxgettime.o tmxleap.o tmxmake.o tmxscan.o tmxsettime.o tmxsleep.o tmxtime.o tmxtouch.o tvcmp.o tvgettime.o tvsettime.o tvsleep.o tvtouch.o cmdarg.o vecargs.o vecfile.o vecfree.o vecload.o vecstring.o univdata.o touch.o mnt.o debug.o memccpy.o memchr.o memcmp.o memcpy.o memdup.o memmove.o memset.o mkdir.o mkfifo.o mknod.o rmdir.o remove.o rename.o link.o unlink.o strdup.o strchr.o strrchr.o strstr.o strtod.o strtold.o strtol.o strtoll.o strtoul.o strtoull.o strton.o strtonll.o strntod.o strntold.o strnton.o
|
|
exec - ${AR} rc libast.a strntonll.o strntol.o strntoll.o strntoul.o strntoull.o strcasecmp.o strncasecmp.o strerror.o mktemp.o tmpnam.o fsync.o execlp.o execve.o execvp.o execvpe.o spawnveg.o vfork.o killpg.o hsearch.o tsearch.o getlogin.o putenv.o setenv.o unsetenv.o lstat.o statvfs.o eaccess.o gross.o omitted.o readlink.o symlink.o getpgrp.o setpgid.o setsid.o waitpid.o creat64.o fcntl.o open.o atexit.o getdents.o getwd.o dup2.o errno.o getpreroot.o ispreroot.o realopen.o setpreroot.o getgroups.o mount.o system.o iblocks.o modedata.o tmdata.o memfatal.o sfkeyprintf.o sfdcdio.o sfdcdos.o sfdcfilter.o sfdcseekable.o sfdcslow.o sfdcsubstr.o sfdctee.o sfdcunion.o sfdcmore.o sfdcprefix.o wc.o wc2utf8.o basename.o closelog.o dirname.o fmtmsglib.o fnmatch.o ftw.o getdate.o getsubopt.o glob.o nftw.o openlog.o re_comp.o resolvepath.o realpath.o regcmp.o regexp.o setlogmask.o strftime.o strptime.o swab.o syslog.o tempnam.o wordexp.o mktime.o regalloc.o regclass.o regcoll.o regcomp.o regcache.o regdecomp.o regerror.o regexec.o regfatal.o reginit.o
|
|
-exec - ${AR} rc libast.a regnexec.o regsubcomp.o regsubexec.o regsub.o regrecord.o regrexec.o regstat.o dtclose.o dtdisc.o dthash.o dtlist.o dtmethod.o dtopen.o dtstrhash.o dttree.o dtview.o dtwalk.o dtnew.o dtcomp.o sfclose.o sfclrlock.o sfdisc.o sfdlen.o sfexcept.o sfgetl.o sfgetu.o sfcvt.o sfecvt.o sffcvt.o sfextern.o sffilbuf.o sfflsbuf.o sfprints.o sfgetd.o sfgetr.o sfllen.o sfmode.o sfmove.o sfnew.o sfpkrd.o sfnotify.o sfnputc.o sfopen.o sfpeek.o sfpoll.o sfpool.o sfpopen.o sfprintf.o sfputd.o sfputl.o sfputr.o sfputu.o sfrd.o sfread.o sfreserve.o sfscanf.o sfseek.o sfset.o sfsetbuf.o sfsetfd.o sfsize.o sfsk.o sfstack.o sfstrtod.o sfsync.o sfswap.o sftable.o sftell.o sftmp.o sfungetc.o sfvprintf.o sfvscanf.o sfwr.o sfwrite.o sfpurge.o sfraise.o sfwalk.o sfgetm.o sfmutex.o sfputm.o sfresize.o _sfclrerr.o _sfeof.o _sferror.o _sffileno.o _sfopen.o _sfstacked.o _sfvalue.o _sfgetc.o _sfgetl.o _sfgetl2.o _sfgetu.o _sfgetu2.o _sfdlen.o _sfllen.o _sfslen.o _sfulen.o _sfputc.o _sfputd.o _sfputl.o _sfputm.o
|
|
+exec - ${AR} rc libast.a regnexec.o regsubcomp.o regsubexec.o regsub.o regrecord.o regrexec.o regstat.o dtclose.o dtdisc.o dthash.o dtlist.o dtmethod.o dtopen.o dtstat.o dtstrhash.o dttree.o dtuser.o dtview.o dtwalk.o dtnew.o dtcomp.o sfclose.o sfclrlock.o sfdisc.o sfdlen.o sfexcept.o sfgetl.o sfgetu.o sfcvt.o sfecvt.o sffcvt.o sfextern.o sffilbuf.o sfflsbuf.o sfprints.o sfgetd.o sfgetr.o sfllen.o sfmode.o sfmove.o sfnew.o sfpkrd.o sfnotify.o sfnputc.o sfopen.o sfpeek.o sfpoll.o sfpool.o sfpopen.o sfprintf.o sfputd.o sfputl.o sfputr.o sfputu.o sfrd.o sfread.o sfreserve.o sfscanf.o sfseek.o sfset.o sfsetbuf.o sfsetfd.o sfsize.o sfsk.o sfstack.o sfstrtod.o sfsync.o sfswap.o sftable.o sftell.o sftmp.o sfungetc.o sfvprintf.o sfvscanf.o sfwr.o sfwrite.o sfpurge.o sfraise.o sfwalk.o sfgetm.o sfmutex.o sfputm.o sfresize.o _sfclrerr.o _sfeof.o _sferror.o _sffileno.o _sfopen.o _sfstacked.o _sfvalue.o _sfgetc.o _sfgetl.o _sfgetl2.o _sfgetu.o _sfgetu2.o _sfdlen.o _sfllen.o _sfslen.o _sfulen.o _sfputc.o _sfputd.o _sfputl.o _sfputm.o
|
|
exec - ${AR} rc libast.a _sfputu.o clearerr.o fclose.o fdopen.o feof.o ferror.o fflush.o fgetc.o fgetpos.o fgets.o fileno.o fopen.o fprintf.o fpurge.o fputc.o fputs.o fread.o freopen.o fscanf.o fseek.o fseeko.o fsetpos.o ftell.o ftello.o fwrite.o flockfile.o ftrylockfile.o funlockfile.o getc.o getchar.o getw.o pclose.o popen.o printf.o putc.o putchar.o puts.o putw.o rewind.o scanf.o setbuf.o setbuffer.o setlinebuf.o setvbuf.o snprintf.o sprintf.o sscanf.o asprintf.o vasprintf.o tmpfile.o ungetc.o vfprintf.o vfscanf.o vprintf.o vscanf.o vsnprintf.o vsprintf.o vsscanf.o _doprnt.o _doscan.o _filbuf.o _flsbuf.o _stdfun.o _stdopen.o _stdprintf.o _stdscanf.o _stdsprnt.o _stdvbuf.o _stdvsnprnt.o _stdvsprnt.o _stdvsscn.o fgetwc.o fwprintf.o putwchar.o vfwscanf.o wprintf.o fgetws.o fwscanf.o swprintf.o vswprintf.o wscanf.o fputwc.o getwc.o swscanf.o vswscanf.o fputws.o getwchar.o ungetwc.o vwprintf.o fwide.o putwc.o vfwprintf.o vwscanf.o stdio_c99.o fcloseall.o fmemopen.o getdelim.o getline.o frexp.o frexpl.o astcopy.o
|
|
exec - ${AR} rc libast.a astconf.o astdynamic.o astlicense.o astquery.o astwinsize.o conftab.o aststatic.o getopt.o getoptl.o aso.o asolock.o asometh.o asorelax.o aso-sem.o aso-fcntl.o vmbest.o vmclear.o vmclose.o vmdcheap.o vmdebug.o vmdisc.o vmexit.o vmlast.o vmopen.o vmpool.o vmprivate.o vmprofile.o vmregion.o vmsegment.o vmset.o vmstat.o vmstrdup.o vmtrace.o vmwalk.o vmmopen.o malloc.o vmgetmem.o a64l.o acosh.o asinh.o atanh.o cbrt.o crypt.o erf.o err.o exp.o exp__E.o expm1.o gamma.o getpass.o lgamma.o log.o log1p.o log__L.o rand48.o random.o rcmd.o rint.o support.o sfstrtmp.o spawn.o
|
|
exec - (ranlib libast.a) >/dev/null 2>&1 || true
|
|
--- src/lib/libast/cdt/dtcomp.c
|
|
+++ src/lib/libast/cdt/dtcomp.c 2012-12-20 10:29:45.000000000 +0000
|
|
@@ -52,9 +52,3 @@ extern ssize_t dtsize(Dt_t* d)
|
|
{
|
|
return (ssize_t)(*(_DT(d)->searchf))((d),(Void_t*)(0),DT_STAT);
|
|
}
|
|
-
|
|
-#undef dtstat
|
|
-extern ssize_t dtstat(Dt_t* d)
|
|
-{
|
|
- return (ssize_t)(*(_DT(d)->searchf))((d),(Void_t*)(0),DT_STAT);
|
|
-}
|
|
--- src/lib/libast/cdt/dthash.c
|
|
+++ src/lib/libast/cdt/dthash.c 2012-12-20 10:29:45.000000000 +0000
|
|
@@ -52,11 +52,13 @@ static int htable(Dt_t* dt)
|
|
if((n = hash->tblz) > 0 && (hash->type&H_FIXED) )
|
|
return 0; /* fixed size table */
|
|
|
|
- if(n == 0 && disc && disc->eventf) /* let user have input */
|
|
+ if(disc && disc->eventf) /* let user have input */
|
|
{ if((*disc->eventf)(dt, DT_HASHSIZE, &n, disc) > 0 )
|
|
{ if(n < 0) /* fix table size */
|
|
{ hash->type |= H_FIXED;
|
|
- n = -n;
|
|
+ n = -n; /* desired table size */
|
|
+ if(hash->tblz >= n ) /* table size is fixed now */
|
|
+ return 0;
|
|
}
|
|
}
|
|
}
|
|
@@ -234,12 +236,13 @@ static Void_t* hstat(Dt_t* dt, Dtstat_t*
|
|
|
|
for(endt = (t = hash->htbl) + hash->tblz; t < endt; ++t)
|
|
{ for(n = 0, l = *t; l; l = l->_rght)
|
|
+ { if(n < DT_MAXSIZE)
|
|
+ st->lsize[n] += 1;
|
|
n += 1;
|
|
+ }
|
|
st->mlev = n > st->mlev ? n : st->mlev;
|
|
if(n < DT_MAXSIZE) /* if chain length is small */
|
|
- { st->msize = n > st->msize ? n : st->msize;
|
|
- st->lsize[n] += n;
|
|
- }
|
|
+ st->msize = n > st->msize ? n : st->msize;
|
|
}
|
|
}
|
|
|
|
@@ -310,7 +313,7 @@ int type;
|
|
hsh = _DTHSH(dt,key,disc);
|
|
|
|
tbl = hash->htbl + (hsh & (hash->tblz-1));
|
|
- pp = ll = NIL(Dtlink_t*);
|
|
+ pp = ll = NIL(Dtlink_t*); /* pp is the before, ll is the here */
|
|
for(p = NIL(Dtlink_t*), l = *tbl; l; p = l, l = l->_rght)
|
|
{ if(hsh == l->_hash)
|
|
{ o = _DTOBJ(disc,l); k = _DTKEY(disc,o);
|
|
@@ -342,20 +345,41 @@ int type;
|
|
_dtfree(dt, ll, type);
|
|
DTRETURN(obj, _DTOBJ(disc,ll));
|
|
}
|
|
+ else if(type & DT_INSTALL )
|
|
+ { if(dt->meth->type&DT_BAG)
|
|
+ goto do_insert;
|
|
+ else if(!(lnk = _dtmake(dt, obj, type)) )
|
|
+ DTRETURN(obj, NIL(Void_t*) );
|
|
+ else /* replace old object with new one */
|
|
+ { if(pp) /* remove old object */
|
|
+ pp->_rght = ll->_rght;
|
|
+ else *tbl = ll->_rght;
|
|
+ o = _DTOBJ(disc,ll);
|
|
+ _dtfree(dt, ll, DT_DELETE);
|
|
+ DTANNOUNCE(dt, o, DT_DELETE);
|
|
+
|
|
+ goto do_insert;
|
|
+ }
|
|
+ }
|
|
else
|
|
{ /**/DEBUG_ASSERT(type&(DT_INSERT|DT_ATTACH|DT_APPEND|DT_RELINK));
|
|
- if(!(dt->meth->type&DT_BAG) )
|
|
+ if((dt->meth->type&DT_BAG) )
|
|
+ goto do_insert;
|
|
+ else
|
|
{ if(type&(DT_INSERT|DT_APPEND|DT_ATTACH) )
|
|
- type |= DT_SEARCH; /* for announcement */
|
|
+ type |= DT_MATCH; /* for announcement */
|
|
else if(lnk && (type&DT_RELINK) )
|
|
+ { /* remove a duplicate */
|
|
+ o = _DTOBJ(disc, lnk);
|
|
_dtfree(dt, lnk, DT_DELETE);
|
|
+ DTANNOUNCE(dt, o, DT_DELETE);
|
|
+ }
|
|
DTRETURN(obj, _DTOBJ(disc,ll));
|
|
}
|
|
- else goto do_insert;
|
|
}
|
|
}
|
|
else /* no matching object */
|
|
- { if(!(type&(DT_INSERT|DT_APPEND|DT_ATTACH|DT_RELINK)) )
|
|
+ { if(!(type&(DT_INSERT|DT_INSTALL|DT_APPEND|DT_ATTACH|DT_RELINK)) )
|
|
DTRETURN(obj, NIL(Void_t*));
|
|
|
|
do_insert: /* inserting a new object */
|
|
--- src/lib/libast/cdt/dtlist.c
|
|
+++ src/lib/libast/cdt/dtlist.c 2012-12-20 10:29:45.000000000 +0000
|
|
@@ -142,9 +142,9 @@ int type;
|
|
}
|
|
|
|
#if __STD_C
|
|
-static Void_t* liststat(Dt_t* dt, Dtstat_t* st)
|
|
+static Void_t* listat(Dt_t* dt, Dtstat_t* st)
|
|
#else
|
|
-static Void_t* liststat(dt, st)
|
|
+static Void_t* listat(dt, st)
|
|
Dt_t* dt;
|
|
Dtstat_t* st;
|
|
#endif
|
|
@@ -186,7 +186,7 @@ int type;
|
|
else if(type&DT_CLEAR)
|
|
DTRETURN(obj, lclear(dt));
|
|
else if(type&DT_STAT )
|
|
- DTRETURN(obj, liststat(dt, (Dtstat_t*)obj));
|
|
+ DTRETURN(obj, listat(dt, (Dtstat_t*)obj));
|
|
|
|
h = list->here; /* save finger to last search object */
|
|
list->here = NIL(Dtlink_t*);
|
|
@@ -202,8 +202,9 @@ int type;
|
|
{ r = (Dtlink_t*)obj;
|
|
goto do_insert;
|
|
}
|
|
- else if(type&(DT_INSERT|DT_APPEND|DT_ATTACH))
|
|
- { if(!(r = _dtmake(dt, obj, type)) )
|
|
+ else if(type&(DT_INSERT|DT_INSTALL|DT_APPEND|DT_ATTACH))
|
|
+ { dt_insert:
|
|
+ if(!(r = _dtmake(dt, obj, type)) )
|
|
DTRETURN(obj, NIL(Void_t*));
|
|
dt->data->size += 1;
|
|
|
|
@@ -290,7 +291,7 @@ int type;
|
|
}
|
|
r = h ? h : r;
|
|
}
|
|
- if(!r)
|
|
+ if(!r) /* not found */
|
|
DTRETURN(obj, NIL(Void_t*));
|
|
|
|
if(type&(DT_DELETE|DT_DETACH|DT_REMOVE))
|
|
--- src/lib/libast/cdt/dtopen.c
|
|
+++ src/lib/libast/cdt/dtopen.c 2012-12-20 10:29:45.000000000 +0000
|
|
@@ -153,25 +153,3 @@ void _dtfree(Dt_t* dt, Dtlink_t* l, int
|
|
if(disc->link < 0) /* free holder */
|
|
(void)(*dt->memoryf)(dt, (Void_t*)l, 0, disc);
|
|
}
|
|
-
|
|
-int dtuserlock(Dt_t* dt, unsigned int key, int type)
|
|
-{
|
|
- if(type > 0)
|
|
- return asolock(&dt->data->user.lock, key, ASO_LOCK);
|
|
- else if(type < 0)
|
|
- return asolock(&dt->data->user.lock, key, ASO_UNLOCK);
|
|
- else return asolock(&dt->data->user.lock, key, ASO_TRYLOCK);
|
|
-}
|
|
-
|
|
-Void_t* dtuserdata(Dt_t* dt, Void_t* data, unsigned int key)
|
|
-{
|
|
- if(key == 0)
|
|
- return dt->data->user.data;
|
|
- else if(dtuserlock(dt, key, 1) < 0 )
|
|
- return NIL(Void_t*);
|
|
- else
|
|
- { dt->data->user.data = data;
|
|
- dtuserlock(dt, key, -1);
|
|
- return data;
|
|
- }
|
|
-}
|
|
--- src/lib/libast/cdt/dtstat.c
|
|
+++ src/lib/libast/cdt/dtstat.c 2012-12-20 10:29:45.000000000 +0000
|
|
@@ -0,0 +1,54 @@
|
|
+/***********************************************************************
|
|
+* *
|
|
+* This software is part of the ast package *
|
|
+* Copyright (c) 1985-2012 AT&T Intellectual Property *
|
|
+* and is licensed under the *
|
|
+* Eclipse Public License, Version 1.0 *
|
|
+* by AT&T Intellectual Property *
|
|
+* *
|
|
+* A copy of the License is available at *
|
|
+* http://www.eclipse.org/org/documents/epl-v10.html *
|
|
+* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
|
+* *
|
|
+* Information and Software Systems Research *
|
|
+* AT&T Research *
|
|
+* Florham Park NJ *
|
|
+* *
|
|
+* Glenn Fowler <gsf@research.att.com> *
|
|
+* David Korn <dgk@research.att.com> *
|
|
+* Phong Vo <kpv@research.att.com> *
|
|
+* *
|
|
+***********************************************************************/
|
|
+#include "dthdr.h"
|
|
+
|
|
+/* Get statistics for a dictionary
|
|
+**
|
|
+** Written by Kiem-Phong Vo
|
|
+*/
|
|
+
|
|
+ssize_t dtstat(Dt_t* dt, Dtstat_t* dtst)
|
|
+{
|
|
+ ssize_t sz, k, maxk;
|
|
+ char *str;
|
|
+ char *end;
|
|
+
|
|
+ sz = (ssize_t)(*dt->meth->searchf)(dt, (Void_t*)dtst, DT_STAT);
|
|
+
|
|
+ str = dtst->mesg;
|
|
+ end = &dtst->mesg[sizeof(dtst->mesg)] - 1;
|
|
+ str += sfsprintf(str, end - str, "Objects=%d Levels=%d(Largest:", dtst->size, dtst->mlev+1);
|
|
+
|
|
+ /* print top 3 levels */
|
|
+ for(k = maxk = 0; k <= dtst->mlev; ++k)
|
|
+ if(dtst->lsize[k] > dtst->lsize[maxk])
|
|
+ maxk = k;
|
|
+ if(maxk > 0)
|
|
+ maxk -= 1;
|
|
+ for(k = 0; k < 3 && maxk <= dtst->mlev; ++k, ++maxk)
|
|
+ str += sfsprintf(str, end - str, " lev[%d]=%d", maxk, dtst->lsize[maxk] );
|
|
+ if (str < end)
|
|
+ *str++ = ')';
|
|
+ *str = 0;
|
|
+
|
|
+ return sz;
|
|
+}
|
|
--- src/lib/libast/cdt/dtstrhash.c
|
|
+++ src/lib/libast/cdt/dtstrhash.c 2012-12-20 10:29:45.000000000 +0000
|
|
@@ -22,40 +22,38 @@
|
|
#include "dthdr.h"
|
|
|
|
/* Hashing a string into an unsigned integer.
|
|
-** The basic method is to continuingly accumulate bytes and multiply
|
|
-** with some given prime. The length n of the string is added last.
|
|
-** The recurrent equation is like this:
|
|
-** h[k] = (h[k-1] + bytes)*prime for 0 <= k < n
|
|
-** h[n] = (h[n-1] + n)*prime
|
|
-** The prime is chosen to have a good distribution of 1-bits so that
|
|
-** the multiplication will distribute the bits in the accumulator well.
|
|
-** The below code accumulates 2 bytes at a time for speed.
|
|
-**
|
|
-** Written by Kiem-Phong Vo (02/28/03)
|
|
+** This is the FNV (Fowler-Noll-Vo) hash function.
|
|
+** Written by Kiem-Phong Vo (01/10/2012)
|
|
*/
|
|
|
|
#if __STD_C
|
|
uint dtstrhash(uint h, Void_t* args, ssize_t n)
|
|
#else
|
|
uint dtstrhash(h,args,n)
|
|
-reg uint h;
|
|
+uint h;
|
|
Void_t* args;
|
|
ssize_t n;
|
|
#endif
|
|
{
|
|
unsigned char *s = (unsigned char*)args;
|
|
|
|
- if(n <= 0)
|
|
- { for(; *s != 0; s += s[1] ? 2 : 1)
|
|
- h = (h + (s[0]<<8) + s[1])*DT_PRIME;
|
|
- n = s - (unsigned char*)args;
|
|
+#if _ast_sizeof_int == 8 /* 64-bit hash */
|
|
+#define FNV_PRIME ((1<<40) + (1<<8) + 0xb3)
|
|
+#define FNV_OFFSET 14695981039346656037
|
|
+#else /* 32-bit hash */
|
|
+#define FNV_PRIME ((1<<24) + (1<<8) + 0x93)
|
|
+#define FNV_OFFSET 2166136261
|
|
+#endif
|
|
+ h = (h == 0 || h == ~0) ? FNV_OFFSET : h;
|
|
+ if(n <= 0) /* see discipline key definition for == 0 */
|
|
+ { for(; *s != 0; ++s )
|
|
+ h = (h ^ s[0]) * FNV_PRIME;
|
|
}
|
|
else
|
|
{ unsigned char* ends;
|
|
- for(ends = s+n-1; s < ends; s += 2)
|
|
- h = (h + (s[0]<<8) + s[1])*DT_PRIME;
|
|
- if(s <= ends)
|
|
- h = (h + (s[0]<<8))*DT_PRIME;
|
|
+ for(ends = s+n; s < ends; ++s)
|
|
+ h = (h ^ s[0]) * FNV_PRIME;
|
|
}
|
|
- return (h+n)*DT_PRIME;
|
|
+
|
|
+ return h;
|
|
}
|
|
--- src/lib/libast/cdt/dttree.c
|
|
+++ src/lib/libast/cdt/dttree.c 2012-12-20 10:29:45.000000000 +0000
|
|
@@ -545,7 +545,14 @@ int type;
|
|
}
|
|
else goto no_root;
|
|
}
|
|
- else if(type&DT_REMOVE) /* remove a particular element in the tree */
|
|
+ else if(type&(DT_DELETE|DT_DETACH))
|
|
+ { dt_delete: /* remove an object from the dictionary */
|
|
+ obj = _DTOBJ(disc,root);
|
|
+ _dtfree(dt, root, type);
|
|
+ dt->data->size -= 1;
|
|
+ goto no_root;
|
|
+ }
|
|
+ else if(type&DT_REMOVE) /* remove a particular object */
|
|
{ if(_DTOBJ(disc,root) == obj)
|
|
goto dt_delete;
|
|
else
|
|
@@ -555,28 +562,32 @@ int type;
|
|
DTRETURN(obj, NIL(Void_t*));
|
|
}
|
|
}
|
|
- else if(type&(DT_DELETE|DT_DETACH))
|
|
- { dt_delete: /* remove an object from the dictionary */
|
|
- obj = _DTOBJ(disc,root);
|
|
- _dtfree(dt, root, type);
|
|
- dt->data->size -= 1;
|
|
- goto no_root;
|
|
- }
|
|
else if(type&(DT_INSERT|DT_APPEND|DT_ATTACH))
|
|
{ if(dt->meth->type&DT_OSET)
|
|
- { type |= DT_SEARCH; /* for announcement */
|
|
+ { type |= DT_MATCH; /* for announcement */
|
|
goto has_root;
|
|
}
|
|
- else
|
|
+ else /* if(dt->meth->type&DT_OBAG) */
|
|
{ root->_left = NIL(Dtlink_t*);
|
|
root->_rght = link._left;
|
|
link._left = root;
|
|
goto dt_insert;
|
|
}
|
|
}
|
|
+ else if(type&DT_INSTALL)
|
|
+ { /* remove old object before insert new one */
|
|
+ o = _DTOBJ(disc, root);
|
|
+ _dtfree(dt, root, DT_DELETE);
|
|
+ DTANNOUNCE(dt, o, DT_DELETE);
|
|
+ goto dt_insert;
|
|
+ }
|
|
else if(type&DT_RELINK) /* a duplicate */
|
|
{ if(dt->meth->type&DT_OSET)
|
|
+ { /* remove object */
|
|
+ o = _DTOBJ(disc, me);
|
|
_dtfree(dt, me, DT_DELETE);
|
|
+ DTANNOUNCE(dt, o, DT_DELETE);
|
|
+ }
|
|
else
|
|
{ me->_left = NIL(Dtlink_t*);
|
|
me->_rght = link._left;
|
|
@@ -612,7 +623,7 @@ int type;
|
|
{ obj = NIL(Void_t*);
|
|
goto no_root;
|
|
}
|
|
- else if(type&(DT_INSERT|DT_APPEND|DT_ATTACH))
|
|
+ else if(type&(DT_INSERT|DT_APPEND|DT_ATTACH|DT_INSTALL))
|
|
{ dt_insert:
|
|
if(!(root = _dtmake(dt, obj, type)) )
|
|
{ obj = NIL(Void_t*);
|
|
--- src/lib/libast/cdt/dtuser.c
|
|
+++ src/lib/libast/cdt/dtuser.c 2012-12-20 10:29:45.000000000 +0000
|
|
@@ -0,0 +1,59 @@
|
|
+/***********************************************************************
|
|
+* *
|
|
+* This software is part of the ast package *
|
|
+* Copyright (c) 1985-2012 AT&T Intellectual Property *
|
|
+* and is licensed under the *
|
|
+* Eclipse Public License, Version 1.0 *
|
|
+* by AT&T Intellectual Property *
|
|
+* *
|
|
+* A copy of the License is available at *
|
|
+* http://www.eclipse.org/org/documents/epl-v10.html *
|
|
+* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
|
+* *
|
|
+* Information and Software Systems Research *
|
|
+* AT&T Research *
|
|
+* Florham Park NJ *
|
|
+* *
|
|
+* Glenn Fowler <gsf@research.att.com> *
|
|
+* David Korn <dgk@research.att.com> *
|
|
+* Phong Vo <kpv@research.att.com> *
|
|
+* *
|
|
+***********************************************************************/
|
|
+#include "dthdr.h"
|
|
+
|
|
+/* Perform various functions on the user's behalf.
|
|
+**
|
|
+** Written by Kiem-Phong Vo (01/05/2012)
|
|
+*/
|
|
+
|
|
+/* managing the lock dt->data->user.lock */
|
|
+int dtuserlock(Dt_t* dt, unsigned int key, int type)
|
|
+{
|
|
+ if(key == 0)
|
|
+ return -1;
|
|
+ else if(type > 0)
|
|
+ return asolock(&dt->data->user.lock, key, ASO_LOCK);
|
|
+ else if(type < 0)
|
|
+ return asolock(&dt->data->user.lock, key, ASO_UNLOCK);
|
|
+ else return asolock(&dt->data->user.lock, key, ASO_TRYLOCK);
|
|
+}
|
|
+
|
|
+/* managing the user data slot dt->data->user.data */
|
|
+Void_t* dtuserdata(Dt_t* dt, Void_t* data, int set)
|
|
+{
|
|
+ if(set == 0) /* just return current value */
|
|
+ return asogetptr(&dt->data->user.data);
|
|
+ else while(1)
|
|
+ { Void_t *current = dt->data->user.data;
|
|
+ if(asocasptr(&dt->data->user.data, current, data) == current)
|
|
+ return current;
|
|
+ }
|
|
+}
|
|
+
|
|
+/* announcing an event on the user's behalf */
|
|
+int dtuserevent(Dt_t* dt, int flags, Void_t* data)
|
|
+{
|
|
+ if(!dt->disc->eventf)
|
|
+ return 0;
|
|
+ else return (*dt->disc->eventf)(dt, DT_ANNOUNCE|DT_USER|flags, data, dt->disc);
|
|
+}
|
|
--- src/lib/libast/include/cdt.h
|
|
+++ src/lib/libast/include/cdt.h 2012-12-20 10:29:45.000000000 +0000
|
|
@@ -164,6 +164,7 @@ struct _dtstat_s
|
|
ssize_t msize; /* max #defined elts in below arrays */
|
|
ssize_t lsize[DT_MAXSIZE]; /* #objects by level */
|
|
ssize_t tsize[DT_MAXSIZE]; /* #tables by level */
|
|
+ char mesg[256]; /* digest of top level statistics */
|
|
};
|
|
|
|
/* supported storage methods */
|
|
@@ -199,7 +200,8 @@ struct _dtstat_s
|
|
#define DT_ATLEAST 0000040000 /* find the least elt >= object */
|
|
#define DT_ATMOST 0000100000 /* find the biggest elt <= object */
|
|
#define DT_REMOVE 0002000000 /* remove a specific object */
|
|
-#define DT_TOANNOUNCE (DT_INSERT|DT_DELETE|DT_SEARCH|DT_NEXT|DT_PREV|DT_FIRST|DT_LAST|DT_MATCH|DT_ATTACH|DT_DETACH|DT_APPEND|DT_ATLEAST|DT_ATMOST|DT_REMOVE)
|
|
+#define DT_INSTALL 0004000000 /* install a new object */
|
|
+#define DT_TOANNOUNCE (DT_INSERT|DT_DELETE|DT_SEARCH|DT_NEXT|DT_PREV|DT_FIRST|DT_LAST|DT_MATCH|DT_ATTACH|DT_DETACH|DT_APPEND|DT_ATLEAST|DT_ATMOST|DT_REMOVE|DT_INSTALL)
|
|
|
|
#define DT_RELINK 0000002000 /* re-inserting (dtdisc,dtmethod...) */
|
|
#define DT_FLATTEN 0000000040 /* flatten objects into a list */
|
|
@@ -216,6 +218,7 @@ struct _dtstat_s
|
|
/* the actual event will be this bit */
|
|
/* combined with the operation bit */
|
|
#define DT_OPTIMIZE 0100000000 /* optimizing data structure */
|
|
+#define DT_USER 0200000000 /* an announcement on user's behalf */
|
|
|
|
/* events for discipline and method event-handling functions */
|
|
#define DT_OPEN 1 /* a dictionary is being opened */
|
|
@@ -277,7 +280,8 @@ extern int dtwalk _ARG_((Dt_t*, int(*)(
|
|
extern int dtcustomize _ARG_((Dt_t*, int, int));
|
|
extern unsigned int dtstrhash _ARG_((unsigned int, Void_t*, ssize_t));
|
|
extern int dtuserlock _ARG_((Dt_t*, unsigned int, int));
|
|
-extern Void_t* dtuserdata _ARG_((Dt_t*, Void_t*, unsigned int));
|
|
+extern Void_t* dtuserdata _ARG_((Dt_t*, Void_t*, int));
|
|
+extern int dtuserevent _ARG_((Dt_t*, int, Void_t*));
|
|
|
|
/* deal with upward binary compatibility (operation bit translation, etc.) */
|
|
extern Dt_t* _dtopen _ARG_((Dtdisc_t*, Dtmethod_t*, unsigned long));
|
|
@@ -334,6 +338,7 @@ _END_EXTERNS_
|
|
#define dtsearch(d,o) (*(_DT(d)->searchf))((d),(Void_t*)(o),DT_SEARCH)
|
|
#define dtmatch(d,o) (*(_DT(d)->searchf))((d),(Void_t*)(o),DT_MATCH)
|
|
#define dtinsert(d,o) (*(_DT(d)->searchf))((d),(Void_t*)(o),DT_INSERT)
|
|
+#define dtinstall(d,o) (*(_DT(d)->searchf))((d),(Void_t*)(o),DT_INSTALL)
|
|
#define dtappend(d,o) (*(_DT(d)->searchf))((d),(Void_t*)(o),DT_APPEND)
|
|
#define dtdelete(d,o) (*(_DT(d)->searchf))((d),(Void_t*)(o),DT_DELETE)
|
|
#define dtremove(d,o) (*(_DT(d)->searchf))((d),(Void_t*)(o),DT_REMOVE)
|
|
@@ -345,7 +350,6 @@ _END_EXTERNS_
|
|
#define dtextract(d) (Dtlink_t*)(*(_DT(d)->searchf))((d),(Void_t*)(0),DT_EXTRACT)
|
|
#define dtrestore(d,l) (Dtlink_t*)(*(_DT(d)->searchf))((d),(Void_t*)(l),DT_RESTORE)
|
|
|
|
-#define dtstat(d,s) (ssize_t)(*(_DT(d)->searchf))((d),(Void_t*)(s),DT_STAT)
|
|
#define dtsize(d) (ssize_t)(*(_DT(d)->searchf))((d),(Void_t*)(0),DT_STAT)
|
|
|
|
#define DT_PRIME 17109811 /* 2#00000001 00000101 00010011 00110011 */
|