[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [lwip-members] Seems Error to me!!
From: |
Jack Carlson |
Subject: |
Re: [lwip-members] Seems Error to me!! |
Date: |
Thu, 26 Jun 2003 01:17:40 -0700 (PDT) |
Hi Kieran,
In the function first is set to 0. I am pasting the function below:-
void sys_mbox_post(struct sys_mbox *mbox, void *msg)
{
u8_t first;
sys_sem_wait(mbox->mutex);
DEBUGF(SYS_DEBUG, ("sys_mbox_post: mbox %p msg %p\n", (void *)mbox, (void *)msg));
while ((mbox->last + 1) >= (mbox->first + SYS_MBOX_SIZE)) {
mbox->wait_send++;
sys_sem_signal(mbox->mutex);
sys_arch_sem_wait(mbox->mail, 0);
sys_arch_sem_wait(mbox->mutex, 0);
mbox->wait_send--;
}
mbox->msgs[mbox->last % SYS_MBOX_SIZE] = msg;
if (mbox->last == mbox->first) {
first = 1;
} else {
first = 0;
}
mbox->last++;
if (first) {
sys_sem_signal(mbox->mail);
}
sys_sem_signal(mbox->mutex);
}
The resetting of first to zero don't u think would create problem???
Regards
Jack
Kieran Mansley <address@hidden> wrote:
On Wed, 25 Jun 2003, Jack Carlson wrote:
> Hi Kieran,
> I think we are singing two different songs.
Yep!
> Look what my doubt
> is:- that no body is decrementing the count of last so after posting
> more than SYS_MBOX_SIZE no. of messages the task which is posting the
> message will block each time it wants to post a message(irrespective of
> whether the TCPIP thread has read all the messages). Plz see the
> following code and kindly check if it matches ur code:-
It does match, but I think you're wrong about the blocking. See comments
below.
>
> void
> sys_mbox_post(struct sys_mbox *mbox, void *msg)
> {
> u8_t first;
>
> sys_sem_wait(mbox->mutex);
>
> DEBUGF(SYS_DEBUG, ("sys_mbox_post: mbox %p msg %p\n", (void *)mbox, (void *)msg));
>
>
while ((mbox->last + 1) >= (mbox->first + SYS_MBOX_SIZE)) {
This is the line that would cause it to block. Even if you have posted
more than SYS_MBOX_SIZE messages it won't block if the TCPIP thread has
read all the messages. This is because mbox->first will be equal to
mbox->last (if all the messages have been read, then the number of
messages posted and fetched is equal, so the variables are equal). As a
result (mbox->last + 1) is < (mbox->first + SYS_MBOX_SIZE) and it doesn't
block. Try putting some numbers in - if mbox->last and mbox->first are
the same the above inequality can never be true! It doesn't matter what
value you give them.
If we ever decremented mbox->first (but we don't!) we would also need to
decrement mbox->last like you suggest.
The only time I can envisage a problem is if the variables wrapped (and
maybe we should code for this) causing mbox->last to be less
than
mbox->first.
> In the while loop the message posting thread blocks each time after it
> exceeds the length. irrespective of if the TCPIP thread has already read
> the messages.(this is bcoz no one is decrementing the count). I really
> could understant the posting of message and fetching of the message. but
> this blocking seems a problem to me. Regards Jack
Are you actually seeing a problem when you run the code, or is it just
something you spotted while reading it through? If you do have a
real problem, then maybe I am wrong.
Can anyone else on the lwip-members list think of a better way of
explaining this (or point out what I'm missing) - I'm not having much
success!
Thanks
Kieran
Do you Yahoo!?
SBC Yahoo! DSL - Now only $29.95 per month!