Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
While this does not break anything I don't think it solves the problem.
evq->evq_task
is only set when task callsos_eventq_get()
this is blocking call so it's strange that same task can later callos_sem_pend()
.For me it more likely looks like memory corruption of task struct.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think I did not do a good job at explaining this. So, what is happening is that we have the default task waiting on a semaphore. The task actually wakes up when
os_eventq_put()
is called which should not happen, it should only wakeup whenos_sem_release()
is called on the pending semaphore. So, what this change does is it forces the scheduler to be blocked on the semaphore.The above code did the right thing back in 2015-2016 before we added
os_eventq_poll()
. You will have to go back intoincubator-mynewt-core
to look at the exact code. The functionality broke whenOS_TASK_SLEEP
flag was added I believe.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is exactly what's impossible here: task cannot be blocked on semaphore and wait for an event at the same time.
The condition you modify is only executed if
evq->evq_task != NULL
and this is only valid if task is blocked onos_eventq_get
. If you have task blocked on a semaphore which is also set asevq_task
in some eventq then something is broken elsewhere.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I read the code in more detail (which I should have done before approving admittedly) and yes you are correct. Checking evq_task first will guarantee the above situation does not occur. This is good :-) Thanks guys
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you, makes complete sense. We got a bit carried away by the semaphore behavior which contributed to the issue.