Re: GCIC Fullscreen applications
"mfnoel" <[email protected]>
| Newsgroups | gmane.comp.emulators.hercules390.vm |
|---|---|
| Message-ID | <[email protected]> |
OK, understand that. But I hadn't seen that kind of thing going on in pdpclib. Maybe I need to check the source more carefully! --- In [email protected], Ivan Warren <ivan@...> wrote: > > mfnoel wrote: > > I rely mostly on testing, but could you elaborate a bit on how reentrancy is a problem when recursion is OK? Want to know what to stay away from... > > > > Well.. > > I think because a function or module can be recursive without being > reentrant. > > *************** > char foo[10]; > > int bar(char x) > { > static char z[2]; > if(x!=0) > { > foo[0]=0; > z[0]=x; > z[1]=0; > } > if(strlen(foo)==(sizeof(foo)-1)) return 0; > strcat(foo,z); > return bar(0); > } > *************** > > That's recursive, but not reentrant. If the task becomes interrupted and > another task with another context invokes bar(), then unexpected results > will occur - because both the external symbol "foo" and the internal "z" > are shared between multiple contexts. > > Task 1 invokes bar("A").. Expects foo to be a bunch of 'A's.. > Task 1 is interrupt midflight > Task 2 invokes bar("B") and the function completes > Task 1 resumes and bar() completes. foo contains a bunch of 'B's > > Of course, the example is totally trivial and useless - it's just an > example. > > So, to stay away from the "problem" : > > - Keep information in task owned contexts (a stack or a chained list of > buffers and registers) > - Serialize access to shared resources (lock/unlock mechanism for example). > > --Ivan >