VirtualBox

Changeset 2424 in kBuild


Ignore:
Timestamp:
Oct 18, 2010 8:52:03 AM (14 years ago)
Author:
bird
Message:

kash: Some S-bahn optimizations.

Location:
trunk/src/kash
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kash/eval.c

    r2423 r2424  
    511511                        INTON;
    512512                        if (prevfd > 0) {
    513                                 shfile_close(&psh->fdtab, 0);
    514                                 copyfd(psh, prevfd, 0);
    515                                 shfile_close(&psh->fdtab, prevfd);
     513                                movefd(psh, prevfd, 0);
    516514                        }
    517515                        if (pip[1] >= 0) {
    518516                                shfile_close(&psh->fdtab, pip[0]);
    519517                                if (pip[1] != 1) {
    520                                         shfile_close(&psh->fdtab, 1);
    521                                         copyfd(psh, pip[1], 1);
    522                                         shfile_close(&psh->fdtab, pip[1]);
     518                                        movefd(psh, pip[1], 1);
    523519                                }
    524520                        }
     
    582578                        shfile_close(&psh->fdtab, pip[0]);
    583579                        if (pip[1] != 1) {
    584                                 shfile_close(&psh->fdtab, 1);
    585                                 copyfd(psh, pip[1], 1);
    586                                 shfile_close(&psh->fdtab, pip[1]);
     580                                movefd(psh, pip[1], 1);
    587581                        }
    588582                        eflag(psh) = 0;
     
    911905                        shfile_close(&psh->fdtab, pip[0]);
    912906                        if (pip[1] != 1) {
    913                                 shfile_close(&psh->fdtab, 1);
    914                                 copyfd(psh, pip[1], 1);
    915                                 shfile_close(&psh->fdtab, pip[1]);
     907                                movefd(psh, pip[1], 1);
    916908                        }
    917909                }
  • trunk/src/kash/input.c

    r2310 r2424  
    408408                error(psh, "Can't open %s", fname);
    409409        if (fd < 10) {
    410                 fd2 = copyfd(psh, fd, 10);
    411                 shfile_close(&psh->fdtab, fd);
     410                fd2 = movefd_above(psh, fd, 10);
    412411                if (fd2 < 0)
    413412                        error(psh, "Out of file descriptors");
  • trunk/src/kash/redir.c

    r2423 r2424  
    233233
    234234        if (f != fd) {
    235                 copyfd(psh, f, fd);
    236                 shfile_close(&psh->fdtab, f);
     235                movefd(psh, f, fd);
    237236        }
    238237        INTON;
     
    302301                        if (i == 0)
    303302                                psh->fd0_redirected--;
    304                         shfile_close(&psh->fdtab, i);
    305303                        if (rp->renamed[i] >= 0) {
    306                                 copyfd(psh, rp->renamed[i], i);
    307                                 shfile_close(&psh->fdtab, rp->renamed[i]);
     304                                movefd(psh, rp->renamed[i], i);
     305                        } else {
     306                                shfile_close(&psh->fdtab, i);
    308307                        }
    309308                }
     
    378377                if (errno == EMFILE)
    379378                        return EMPTY;
    380                 else
    381                         error(psh, "%d: %s", from, strerror(errno));
     379                error(psh, "%d: %s", from, strerror(errno));
    382380        }
    383381        return newfd;
     
    386384
    387385/*
    388  * Copy a file descriptor to be = to.  Returns -1
     386 * Move a file descriptor to be == to.  Returns -1
    389387 * if the source file descriptor is closed, EMPTY if there are no unused
    390388 * file descriptors left.
     
    392390
    393391int
    394 copyfd2(shinstance *psh, int from, int to)
     392movefd(shinstance *psh, int from, int to)
    395393{
    396394        int newfd;
    397395
    398         /** @todo Use dup2()... */
    399         newfd = shfile_fcntl(&psh->fdtab, from, F_DUPFD, to);
     396        newfd = shfile_movefd(&psh->fdtab, from, to);
    400397        if (newfd < 0) {
    401398                if (errno == EMFILE)
    402399                        return EMPTY;
    403                 else
    404                         error(psh, "%d: %s", from, strerror(errno));
    405         }
    406         else if (newfd != to) {
    407                 error(psh, "%d: F_DUPFD returned %d, expected %d", from, newfd, to);
    408                 close(newfd);
    409                 newfd = -1;
    410         }
    411 
     400                error(psh, "%d: %s", from, strerror(errno));
     401        }
    412402        return newfd;
    413403}
    414404
     405
     406/*
     407 * Move a file descriptor to be >= to.  Returns -1
     408 * if the source file descriptor is closed, EMPTY if there are no unused
     409 * file descriptors left.
     410 */
     411
     412int
     413movefd_above(shinstance *psh, int from, int to)
     414{
     415        int newfd;
     416
     417        newfd = shfile_movefd_above(&psh->fdtab, from, to);
     418        if (newfd < 0) {
     419                if (errno == EMFILE)
     420                        return EMPTY;
     421                error(psh, "%d: %s", from, strerror(errno));
     422        }
     423        return newfd;
     424}
     425
  • trunk/src/kash/redir.h

    r1233 r2424  
    4646void clearredir(struct shinstance *, int);
    4747int copyfd(struct shinstance *, int, int);
     48int movefd(struct shinstance *, int, int);
     49int movefd_above(struct shinstance *, int, int);
    4850
  • trunk/src/kash/shfile.c

    r2423 r2424  
    6565# define SHFILE_IN_USE
    6666#endif
     67# define SHFILE_IN_USE
    6768/** The max file table size. */
    6869#define SHFILE_MAX          1024
     
    176177
    177178/**
     179 * Grows the descriptor table, making sure that it can hold @a fdMin,
     180 *
     181 * @returns The max(fdMin, fdFirstNew) on success, -1 on failure.
     182 * @param   pfdtab      The table to grow.
     183 * @param   fdMin       Grow to include this index.
     184 */
     185static int shfile_grow_tab_locked(shfdtab *pfdtab, int fdMin)
     186{
     187    /*
     188     * Grow the descriptor table.
     189     */
     190    int         fdRet = -1;
     191    shfile     *new_tab;
     192    int         new_size = pfdtab->size + SHFILE_GROW;
     193    while (new_size < fdMin)
     194        new_size += SHFILE_GROW;
     195    new_tab = sh_realloc(shthread_get_shell(), pfdtab->tab, new_size * sizeof(shfile));
     196    if (new_tab)
     197    {
     198        int     i;
     199        for (i = pfdtab->size; i < new_size; i++)
     200        {
     201            new_tab[i].fd = -1;
     202            new_tab[i].oflags = 0;
     203            new_tab[i].shflags = 0;
     204            new_tab[i].native = -1;
     205        }
     206
     207        fdRet = pfdtab->size;
     208        if (fdRet < fdMin)
     209            fdRet = fdMin;
     210
     211        pfdtab->tab = new_tab;
     212        pfdtab->size = new_size;
     213    }
     214
     215    return fdRet;
     216}
     217
     218/**
    178219 * Inserts the file into the descriptor table.
    179220 *
     
    219260     */
    220261    fd = -1;
    221     for (i = 0; (unsigned)i < pfdtab->size; i++)
    222         if (    i >= fdMin
    223             &&  pfdtab->tab[i].fd == -1)
     262    for (i = fdMin >= 0 ? fdMin : 0; (unsigned)i < pfdtab->size; i++)
     263        if (pfdtab->tab[i].fd == -1)
    224264        {
    225265            fd = i;
     
    227267        }
    228268    if (fd == -1)
    229     {
    230         /*
    231          * Grow the descriptor table.
    232          */
    233         shfile     *new_tab;
    234         int         new_size = pfdtab->size + SHFILE_GROW;
    235         while (new_size < fdMin)
    236             new_size += SHFILE_GROW;
    237         new_tab = sh_realloc(shthread_get_shell(), pfdtab->tab, new_size * sizeof(shfile));
    238         if (new_tab)
    239         {
    240             for (i = pfdtab->size; i < new_size; i++)
    241             {
    242                 new_tab[i].fd = -1;
    243                 new_tab[i].oflags = 0;
    244                 new_tab[i].shflags = 0;
    245                 new_tab[i].native = -1;
    246             }
    247 
    248             fd = pfdtab->size;
    249             if (fd < fdMin)
    250                 fd = fdMin;
    251 
    252             pfdtab->tab = new_tab;
    253             pfdtab->size = new_size;
    254         }
    255     }
     269        fd = shfile_grow_tab_locked(pfdtab, fdMin);
    256270
    257271    /*
     
    11341148
    11351149/**
     1150 * Move the file descriptor, closing any existing descriptor at @a fdto.
     1151 *
     1152 * @returns fdto on success, -1 and errno on failure.
     1153 * @param   pfdtab          The file descriptor table.
     1154 * @param   fdfrom          The descriptor to move.
     1155 * @param   fdto            Where to move it.
     1156 */
     1157int shfile_movefd(shfdtab *pfdtab, int fdfrom, int fdto)
     1158{
     1159#ifdef SHFILE_IN_USE
     1160    int         rc;
     1161    shmtxtmp    tmp;
     1162    shfile     *file = shfile_get(pfdtab, fdfrom, &tmp);
     1163    if (file)
     1164    {
     1165        /* prepare the new entry */
     1166        if (fdto >= (int)pfdtab->size)
     1167            shfile_grow_tab_locked(pfdtab, fdto);
     1168        if (fdto < (int)pfdtab->size)
     1169        {
     1170            if (pfdtab->tab[fdto].fd != -1)
     1171                shfile_native_close(pfdtab->tab[fdto].native, pfdtab->tab[fdto].oflags);
     1172
     1173            /* setup the target. */
     1174            pfdtab->tab[fdto].fd      = fdto;
     1175            pfdtab->tab[fdto].oflags  = file->oflags;
     1176            pfdtab->tab[fdto].shflags = file->shflags;
     1177            pfdtab->tab[fdto].native  = file->native;
     1178
     1179            /* close the source. */
     1180            file->fd        = -1;
     1181            file->oflags    = 0;
     1182            file->shflags   = 0;
     1183            file->native    = -1;
     1184
     1185            rc = fdto;
     1186        }
     1187        else
     1188        {
     1189            errno = EMFILE;
     1190            rc = -1;
     1191        }
     1192
     1193        shfile_put(pfdtab, file, &tmp);
     1194    }
     1195    else
     1196        rc = -1;
     1197    return rc;
     1198
     1199#else
     1200    return dup2(fdfrom, fdto);
     1201#endif
     1202}
     1203
     1204/**
     1205 * Move the file descriptor to somewhere at @a fdMin or above.
     1206 *
     1207 * @returns the new file descriptor success, -1 and errno on failure.
     1208 * @param   pfdtab          The file descriptor table.
     1209 * @param   fdfrom          The descriptor to move.
     1210 * @param   fdMin           The minimum descriptor.
     1211 */
     1212int shfile_movefd_above(shfdtab *pfdtab, int fdfrom, int fdMin)
     1213{
     1214#ifdef SHFILE_IN_USE
     1215    int         fdto;
     1216    shmtxtmp    tmp;
     1217    shfile     *file = shfile_get(pfdtab, fdfrom, &tmp);
     1218    if (file)
     1219    {
     1220        /* find a new place */
     1221        int i;
     1222        fdto = -1;
     1223        for (i = fdMin; (unsigned)i < pfdtab->size; i++)
     1224            if (pfdtab->tab[i].fd == -1)
     1225            {
     1226                fdto = i;
     1227                break;
     1228            }
     1229        if (fdto == -1)
     1230            fdto = shfile_grow_tab_locked(pfdtab, fdMin);
     1231        if (fdto != -1)
     1232        {
     1233            /* setup the target. */
     1234            pfdtab->tab[fdto].fd      = fdto;
     1235            pfdtab->tab[fdto].oflags  = file->oflags;
     1236            pfdtab->tab[fdto].shflags = file->shflags;
     1237            pfdtab->tab[fdto].native  = file->native;
     1238
     1239            /* close the source. */
     1240            file->fd        = -1;
     1241            file->oflags    = 0;
     1242            file->shflags   = 0;
     1243            file->native    = -1;
     1244        }
     1245        else
     1246        {
     1247            errno = EMFILE;
     1248            fdto = -1;
     1249        }
     1250
     1251        shfile_put(pfdtab, file, &tmp);
     1252    }
     1253    else
     1254        fdto = -1;
     1255    return fdto;
     1256
     1257#else
     1258    int fdnew = fcntl(fdfrom, F_DUPFD, fdMin);
     1259    if (fdnew >= 0)
     1260        close(fdfrom);
     1261    return fdnew;
     1262#endif
     1263}
     1264
     1265/**
    11361266 * close().
    11371267 */
     
    11581288
    11591289#else
    1160     fsync(fd);
    1161     {
    1162         struct stat s;
    1163         fstat(fd, &s);
    1164         TRACE2((NULL, "shfile_close(%d) - %lu bytes\n", fd, (long)s.st_size));
    1165     }
    11661290    rc = close(fd);
    11671291#endif
     
    14301554int shfile_chdir(shfdtab *pfdtab, const char *path)
    14311555{
    1432     shinstance *psh = shthread_get_shell();
    14331556    int         rc;
    14341557#ifdef SHFILE_IN_USE
     1558    shinstance *psh = shthread_get_shell();
    14351559    char        abspath[SHFILE_MAX_PATH];
    14361560
     
    14591583#endif
    14601584
    1461     TRACE2((psh, "shfile_chdir(,%s) -> %d [%d]\n", path, rc, errno));
     1585    TRACE2((NULL, "shfile_chdir(,%s) -> %d [%d]\n", path, rc, errno));
    14621586    return rc;
    14631587}
  • trunk/src/kash/shfile.h

    r2423 r2424  
    142142int shfile_fcntl(shfdtab *, int fd, int cmd, int arg);
    143143int shfile_dup(shfdtab *, int fd);
     144int shfile_movefd(shfdtab *, int fdfrom, int fdto);
     145int shfile_movefd_above(shfdtab *, int fdfrom, int fdmin);
    144146
    145147int shfile_stat(shfdtab *, const char *, struct stat *);
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette