public inbox for ecos-discuss@sourceware.org
 help / color / mirror / Atom feed
From: Robin Farine <acnrf@dial.eunet.ch>
To: Peter Graf <p.graf@itknet.de>
Cc: ecos-discuss@sources.redhat.com
Subject: Re: [ECOS] sscanf() vs. fgetc()
Date: Thu, 12 Jul 2001 03:28:00 -0000	[thread overview]
Message-ID: <86sng24g1c.fsf@halftrack.hq.acn-group.ch> (raw)
In-Reply-To: <3.0.5.32.20010712104805.00914420@128.128.128.220>

Hi Peter,

Peter Graf <p.graf@itknet.de> writes:

> Hi,
> 
> after problems in a large context, I have cut things down to a short
> example for a phenomenon I can't explain myself.
> 
> I create and resume a new thread which uses fgetc() on a serial port, in an
> infinite loop. 
> This new thread has a higher priority than the old one.
> If no characters are received, fgetc blocks and the old thread continues.
> 
> So far so good.
> 
> But when I use sscanf() in the old thread, it hangs.
> Even if the new process completes fgetc(), because characters are received,
> the old process won't get any further.

I suppose that only one thread at a time can read characters from a serial
port. When a thread wants to read, it probably has to obtain a mutex, then it
checks a condition such as input buffer not empty or waits on a condition
variable bound to this condition. When some characters come in, the condition
variable gets signalled and the thread with the higher priority runs and
consumes the available characters. Therefore, another thread with a lower
priority will never get a chance to see a non-empty buffer, or in one word:
starvation.

> My first explanation was, that fgetc() might poll and doesn't allow to
> schedule lower priority threads. Obviously, this was wrong, because the old
> thread runs fine, as long as it doesn't use sscanf(), even if it calls C
> Library functions like sprintf().
> 
> My second explanation was that there might be a resource conflict between
> fgetc() and sscanf(). (I have no idea why there should be such a conflict!)
> So I placed a scheduler lock around sscanf(). It still hangs. (And the
> higher priority task as well.)
> 
> I found two ways to keep sscanf() from hanging, which is giving the fgetc()
> thread a lower priority, or add a cyg_thread_delay() after the fgetc().

This confirms the hypothesis above.

Robin

  parent reply	other threads:[~2001-07-12  3:28 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-07-11 14:09 [ECOS] Linux over RedBoot Venkat Mynampati
2001-07-11 14:36 ` Jonathan Larmour
2001-07-11 14:53 ` Gary Thomas
2001-07-11 20:32   ` Fabrice Gautier
2001-07-11 23:37     ` Jesper Skov
2001-07-12  5:11       ` Gary Thomas
2001-07-12  5:30         ` Fabrice Gautier
2001-07-12  5:39           ` Gary Thomas
2001-07-12  5:45             ` Jesper Skov
2001-07-12  1:54 ` [ECOS] sscanf() vs. fgetc() Peter Graf
2001-07-12  3:23   ` Peter Graf
2001-07-12  3:28   ` Robin Farine [this message]
2001-07-12  3:42     ` Jonathan Larmour
2001-07-12  5:02       ` Robin Farine
2001-07-12  3:45     ` Peter Graf
2001-07-12  4:00   ` Jonathan Larmour
2001-07-12  5:57     ` Peter Graf
2001-07-12  6:13       ` Jonathan Larmour
2001-07-12  7:43         ` Peter Graf
2001-07-12 11:17           ` Robin Farine
2001-07-12 11:55             ` Jonathan Larmour
2001-07-13  2:33               ` Peter Graf
2001-07-13  2:33             ` Peter Graf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=86sng24g1c.fsf@halftrack.hq.acn-group.ch \
    --to=acnrf@dial.eunet.ch \
    --cc=ecos-discuss@sources.redhat.com \
    --cc=p.graf@itknet.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).