Coder Social home page Coder Social logo

Comments (1)

gerard5 avatar gerard5 commented on August 17, 2024

The cmdline is a string before parsing (received directly from the plo in the syspage):

"Xdummyfs Ximxrt-multi Xpsh Xspawn_test;1 Xspawn_test;2 Xspawn_test;3 Xspawn_test;4 Xspawn_test;5 "

after parsing, the memory content looks like this:

Xdummyfs\0Ximxrt-multi\0Xpsh\0Xspawn_test\0Xspawn_test\0Xspawn_test\0Xspawn_test\0Xspawn_test\0

but whileis being parsed each of the cmdline item is scanned through prog=syspage->progs list and compared with prog->cmdline. This is a serious problem if cmdline contains multiple programs with the same name, with different or same arguments or without arguments at all. As in the example in the problem description (see screenshots above), these five commands with arguments: spawn_test;1, spawn_test;2,spawn_test;3, spawn_test;4,spawn_test;5, lead to 25 processes spawned… what !?

Take a close look at the block with hal_strcmp() if-statement inside the loop:

phoenix-rtos-kernel/main.c

Lines 97 to 105 in 54c5d2c

for (prog = syspage->progs, i = 0; i < syspage->progssz; i++, prog++) {
if (!hal_strcmp(cmdline + 1, prog->cmdline)) {
argv[0] = prog->cmdline;
res = proc_syspageSpawn(prog, vm_getSharedMap(prog), prog->cmdline, argv);
if (res < 0) {
lib_printf("main: failed to spawn %s (%d)\n", argv[0], res);
}
}
}

What it actually does, for each processed cmdline item, it scans through prog=syspage->progs, and if cmdline+1 matches the prog->cmdline spawns a single process (for now I'm omitting the performance of this scan loop), it's even worse when the same program name appears more than once (this is the topic of an issue), leads to multiple processes spawned to ^2

As a redesign of the syspage is not the subject of this issue, the temporary solution is to somehow mark the already spawned prog->cmdine program, to be skipped in next syspage->progs loop scan.

Not judging the solution itself, the below temporary hack seems to work:

u32 skips = 0; /* bit index */

In plo the MAX_PROGRAMS_NB is set to 32 so uint32 is ok here, though rootfs-less projects should not go above the limit if so it is a sign to have rootfs, with which we agree, I suppose.

            for (prog = syspage->progs, i = 0; i < syspage->progssz; i++, prog++) {
                if (!(skips & (1u << i)) && !hal_strcmp(cmdline + 1, prog->cmdline)) {
                    skips |= 1u << i;
                    argv[0] = prog->cmdline;
                    res = proc_syspageSpawn(prog, vm_getSharedMap(prog), prog->cmdline, argv);
                    if (res < 0) {
                        lib_printf("main: failed to spawn %s (%d)\n", argv[0], res);
                    }
                    break;
                }
            }

The result is as expected:

sol1

So, if there are better solutions that You guys have let's discuss them or if You agree with the presented approach let me prepare PR and commit.

from phoenix-rtos-kernel.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.