Hello Arno,

Per your advice, I coded the following but in the first time there
needs to be a wait for other thread, it times out! I wonder why?

void inline __fastcall lockCriticalSection(TCriticalSection *criticalSection)
{
                HANDLE hMutex;

                // Create a mutex with no initial owner.

                hMutex = CreateMutex(
                        NULL,                       // no security attributes
                        true,                      // initially owned
                        String((int)(void*)criticalSection).c_str());  // name 
of mutex

                DWORD dwWaitResult;

                // Request ownership of mutex.

                if(hMutex)
                {
                        dwWaitResult = WaitForSingleObject(
                        hMutex,   // handle to mutex
                        5000L);   // five-second time-out interval

                        switch(dwWaitResult)
                        {
                                // Cannot get mutex ownership due to time-out.
                                case WAIT_TIMEOUT:
                                        throw Exception("BUG FOUND, CHECK CALL 
STACK!");

                                // Got ownership of the abandoned mutex object.
                                case WAIT_ABANDONED:
                                        break;
                        }
                }

                criticalSection->Acquire();
};

void inline __fastcall releaseCriticalSection(TCriticalSection *criticalSection)
{
                criticalSection->Release();

                HANDLE hMutex;

                // Create a mutex with no initial owner.

                hMutex = OpenMutex(
                  MUTEX_ALL_ACCESS,
                  false,
                  String((int)(void*)criticalSection).c_str()
                );  // name of mutex

                if(hMutex)
                {
                        DWORD dwWaitResult;

                        // Request ownership of mutex.

                        dwWaitResult = WaitForSingleObject(
                                hMutex,   // handle to mutex
                                5000L);   // five-second time-out interval

                        switch(dwWaitResult)
                        {
                                // The thread got mutex ownership.
                                case WAIT_OBJECT_0:
                                        // Release ownership of the mutex 
object.
                                        if(!ReleaseMutex(hMutex))
                                        {
                                                // Deal with error.
                                        }

                                        break;

                                // Cannot get mutex ownership due to time-out.
                                case WAIT_TIMEOUT:
                                        break;

                                // Got ownership of the abandoned mutex object.
                                case WAIT_ABANDONED:
                                        break;
                        }
                }
};

PLEASE HELP! The technique I used is called named mutex. What I am
trying to do is to complete the job in these two functions.

Best Regards,

SZ


On 4/28/07, Arno Garrels <[EMAIL PROTECTED]> wrote:
> Fastream Technologies wrote:
> > For example, perhaps we can implement a single global mutex for the
> > lock... function.
>
> No good idea. That would change a lot.
>
> > This would slow down the execution for sure but
> > would it create the exception?
>
> You have to raise the exception if the wait returns WAIT_TIMEOUT.
>
> > Can you provide some source code
> > snippet for this please?
>
> Please search the internet there should be tons of snippets
> around, or ask your question in newsgroup:
> borland.public.delphi.nativeapi.win32.
>
> --
> Arno Garrels [TeamICS]
> http://www.overbyte.be/eng/overbyte/teamics.html
>
> >
> > Best Regards,
> >
> > SZ
> >
> > On 4/28/07, Fastream Technologies <[EMAIL PROTECTED]> wrote:
> >> Arno,
> >>
> >> I have THOUSANDS of critical sections passed to this function as
> >> parameter! Isn't there a simpler way to implement??
> >>
> >> Regards,
> >>
> >> SZ
> >>
> >> On 4/28/07, Arno Garrels <[EMAIL PROTECTED]> wrote:
> >>> Fastream Technologies wrote:
> >>>> This sounds reasonable. Can you give an example? Since all my cs
> >>>> are of TCriticalSection type, can I do it in this function:
> >>>
> >>> I thought of using mutexes. That's not very difficult to change.
> >>> Have an array of mutex handles, then pass the index to your
> >>> function. Search for CreateMutex etc. in the SDK. When the wait
> >>> returned WAIT_TIMEOUT and you raise an exception MadExcept will
> >>> report the callstacks of each thread.
> >>> I don't have any idea how one can raise an exception in a thread
> >>> or get to thread's callstack when it hangs around in
> >>> CriticalSection->Acquire.
> >>>
> >>> --
> >>> Arno Garrels [TeamICS]
> >>> http://www.overbyte.be/eng/overbyte/teamics.html
> >>>
> >>>>
> >>>> void __fastcall lockCriticalSection(TCriticalSection *CS)
> >>>> {
> >>>>        // currently it is:
> >>>>        CS->Acquire();
> >>>>
> >>>>        // what should it be?
> >>>> }
> >>>>
> >>>> Best Regards,
> >>>>
> >>>> SZ
> >>>>
> >>>> On 4/28/07, Arno Garrels <[EMAIL PROTECTED]> wrote:
> >>>>> Fastream Technologies wrote:
> >>>>>> Hello,
> >>>>>>
> >>>>>> I have a very difficult bug: the program includes lots of
> >>>>>> critical sections and it suddenly stops responding!
> >>>>>
> >>>>> Sounds like deadlock.
> >>>>>
> >>>>>> I have a wrapper global
> >>>>>> function called lockCriticalSection(TCriticalSection *cs) which
> >>>>>> calls acquire. I want to log inside this but need to record the
> >>>>>> call stack so that I can see which call is the lastest. Any idea?
> >>>>>
> >>>>> AFAIK Jedi gives you the callstack only upon an exception.
> >>>>> My idea is to use a different synchronization method with a
> >>>>> timeout parameter, when the wait timed out you can raise an
> >>>>> exception.
> >>>>>
> >>>>> Would that help?
> >>>>>
> >>>>> --
> >>>>> Arno Garrels [TeamICS]
> >>>>> http://www.overbyte.be/eng/overbyte/teamics.html
> >>>>>
> >>>>>>
> >>>>>> Best Regards,
> >>>>>>
> >>>>>> SZ
> >>>>> --
> >>>>> To unsubscribe or change your settings for TWSocket mailing list
> >>>>> please goto http://www.elists.org/mailman/listinfo/twsocket
> >>>>> Visit our website at http://www.overbyte.be
> >>>>>
> >>>>
> >>>>
> >>>> --
> >>>> CSA, Fastream Technologies
> >>>> Software IQ: Innovation & Quality
> >>>> www.fastream.com | Email: [EMAIL PROTECTED] | Tel: +90-312-223-
> >>>> 2830 Join IQWF Server Yahoo group at
> >>>> http://groups.yahoo.com/group/IQWFServer Join IQ Reverse Proxy
> >>>> Yahoo group at http://groups.yahoo.com/group/IQReverseProxy
> >>> --
> >>> To unsubscribe or change your settings for TWSocket mailing list
> >>> please goto http://www.elists.org/mailman/listinfo/twsocket
> >>> Visit our website at http://www.overbyte.be
> --
> To unsubscribe or change your settings for TWSocket mailing list
> please goto http://www.elists.org/mailman/listinfo/twsocket
> Visit our website at http://www.overbyte.be
>
-- 
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be

Reply via email to