This is the mail archive of the ecos-discuss@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RE: Fw: infinite loop in cyg_thread_create() function


I don't know if this is related to the issue brought up here, but I noticed
that in the example given:

static char tskstack[STACK_SIZE];        //Stack size is 5632 bytes

cyg_thread_create(10, (cyg_thread_entry_t
*)&contextStart,(cyg_addrword_t)this,
tasknm,&tskstack[STACK_SIZE],STACK_SIZE, &id1, &id);

It looks like the (stack top + 1) is being passed to cyg_thread_create(),
when it should be the stack base.  This would certainly cause some grief.

Jay

-----Original Message-----
From: Vijay Padiyar [mailto:vijaypadiyar@hotmail.com]
Sent: Friday, October 29, 2004 1:21 AM
To: eCos Support
Subject: [ECOS] Fw: infinite loop in cyg_thread_create() function


Hi

Just forwarding Aravind's reply to the mailing list.

Regards

Vijay




> On Thu, 2004-10-28 at 19:55, Chandrashekhar Padiyar wrote:
> > Hi Arvind
> >
> > You wrote about this problem on the eCos mailing list:
> >
>
> --------------------------------------------------------------------------
----
> >
> > > Thanks for ur kind reply
> > > After debugging i found that problem is in following code fragment in
> > > file thread.cxx:
> > >
> > > Cyg_Thread::add_to_list( void )
> > > - 127 {
> > >  128     // Add thread to housekeeping list
> > >  129     Cyg_Scheduler::lock();
> > >  130
> > > - 131     if( thread_list == 0 )
> > >  132         list_next = this;
> > >  133     else {prev != thread_list
> > >  134         Cyg_Thread *prev = thread_list;
> > > - 135         do {
> > > - 136             if ( this == prev )
> > >  137                 break; // found it already!
> > > - 138             prev = prev->list_next;
> > > - 139         } while ( prev != thread_list );
> > > - 140         if ( this != prev ) {
> > >  141             // insert it in the list:
> > > - 142             list_next = thread_list->list_next;
> > > - 143             thread_list->list_next = this;
> > >  144         }
> > >  145     }
> > >
> > > the control is in the while loop forever as prev == thread_list ( line
> > > 139 )ie prev has become NULL.
> >
>
> --------------------------------------------------------------------------
----
> >
> > Well we are facing the EXACT SAME problem now. Please tell us more about
how you solved it. We are calling the cyg_thread_create() function from a
function inside a class. It gets stuck the second time in the same while()
loop.
> >
> > Please tell us how exactly you modified the stack allocation.
> >
> > This is our function call:
> >
>
> --------------------------------------------------------------------------
----
> >
> > static char tskstack[STACK_SIZE];        //Stack size is 5632 bytes
> >
> > cyg_thread_create(10, (cyg_thread_entry_t
*)&contextStart,(cyg_addrword_t)this,
tasknm,&tskstack[STACK_SIZE],STACK_SIZE, &id1,
> >                                                 &id);
> >
>
> --------------------------------------------------------------------------
----
> >
> > Please help us out here.
> >
> > Regards
> >
> > Vijay
> >
> i think u have created single dimension array for "space to store the
thread data" and "for
> pointer to the stack base" . Looking at what you sent you created one
> thread with its stack stack[0] and the other thread with its stack
> stack[1]. try creating a seperate array for each thread.
>
> regards
> Aravind B
>
>
>

-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss

-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]