My thinking is that maybe upon setting up the first SIGEV_THREAD notification 
for a task, a child thread would be created, which would act as a worker, 
waiting on some semaphore for example. The bad thing is that it would linger 
until task is finished (not sure even how easy would be to ensure it is deleted 
on task exit).

This would be difficult because in PROTECTED and KERNEL modes, the OS has no knowledge of any user-space symbols.  Creating a pthread is different from starting a task because you have to the user-space address of the pthread entry point.  That is not knowable in the cases where the OS is separately linked.  So this could not be done by the core OS as a general solution.  It could be done in some library function if we had a user-space crt0.o to start the task.

There is already a crt0.o for ELF modules and it could start such a thread.

Or is there a way for an lpwork thread to temporarily get into a task's 
environment?
No, because an LP thread is a kernel thread.  It is privileged and if it were to run user code in supervisor mode, that would be a major security hole.
BTW, for C++ global constructors I think there's also the issue that they are 
only called at boot and not each time a task starts. At least I had that 
problem in the past.

This would require a different build model with tasks (or at least task-related constructors/destructors) that are separately built and a crt0.o to start any threads.

So one solution to both problems is to make all tasks into separately linked ELF modules.


Reply via email to