Groups > Novell > Novell Developers discussion > Re: Kernel detected unmatched call to EndSleepNotAllowed




Kernel detected unmatched call to EndSleepNotAllowed

Kernel detected unmatched call to EndSleepNotAllowed
Mon, 25 Sep 2006 09:28:32 GMT
Hi All:
   
   Our application cause a server abend in customer env. And from 
abend.log we found that:
   Abend 1 on P00: Server-5.70.02-6592: Kernel detected unmatched call to 
EndSleepNotAllowed.

Registers:
    CS = 0008 DS = 0068 ES = 0068 FS = 0068 GS = 007B SS = 0068
    EAX = 00626240 EBX = 00626248 ECX = A1E54C91 EDX = 48CD0440
    ESI = 016340A0 EDI = A1E54F08 EBP = A1E54CD4 ESP = A1E54CCC
    EIP = 00000000 FLAGS = 00000246 

    And from this link, we found Symantec have a crash resulted from same 
guilty API:
    http://support.novell.com/cgi-bin/search/searchtid.cgi?/10066151.htm
    
    Due to this document, before you call EndSleepNotAllowed, you need to 
check if Server.nlm|SleepNotAllowedUseCount greater than 0. If it is, call 
this function is allowed, else, it's prohibit.

    I can't find useful information than this anymore. However, I can't 
revise my code only according to information above mentioned, because in 
my application, such check is already done, please see the below snippet:
 void CloseFileCallBackExt(CloseFileCallBackStruct *cbs,int ccode)
{
    if (majorServerVersion >= 4) {
        if (majorServerVersion >= 6) {
            if (pSystemSleepNotAllowedUseCount &&
                *pSystemSleepNotAllowedUseCount > 0) {
	            EndSleepNotAllowed();  // novell says this is OK
                bCallEndSleepNotAllowed = 1;
        }
    }
    else {
	 EndSleepNotAllowed();  // novell says this is OK
            bCallEndSleepNotAllowed = 1;
         }
    }

    closeevent = &State[i].event.closeEvent;
    closeevent->ConnectionNumber = cbs->connection;
    closeevent->HandleNumber = cbs->fileHandle;
    closeevent->Task = cbs->task;

    MyCloseFileFunction(closeevent);

//	if (majorServerVersion >= 4 && majorServerVersion < 6)
//	{
    if (bCallEndSleepNotAllowed) {
	  StartSleepNotAllowed();
            bCallEndSleepNotAllowed = 0;
    }
//}

    These codes not written by me, but sustained by me. So I don't know 
why we need to call API EndSleepNotAllowed here, and but only when OS 
version is greater than 4. More strangely, it't different between netware 
5 and netware 6.

    Could anybody help me on these questions:
    1. Why need we call EndSleepNotAllowed/StartSleepNotAllowed pair? If 
we don't call it anyway, what'll happend? 
    2. Why the behaviour depends on different OS version? 
    3. Will a call to EndSleepNotAllowed change the value of 
Server.nlm|SleepNotAllowedUseCount? If so, in multiple thread, need we add 
thread mutually exclusive logic here?
   
    4.Customer's OS is:
    NetWare 5.70.02 11 June 2004
    But I found that Netware 6:
    NetWare 5.60 September 13, 2001
    If in customer's env, the OS is originally netware5, but patched to 
5.70, what happend? Should be treated as netware 5 or netware 6? 

    Thousands thanks!

Post Reply
Re: Kernel detected unmatched call to EndSleepNotAllowed
Wed, 27 Sep 2006 03:26:15 GMT
aaron_yang wrote:

   Could anybody help? Now I find it's not a OS version problem,
customer's OS is NW65 sp2, it should be 5.7

   But I still need to know:
   1. Why a call to EndSleepNotAllowed/StartSleepNotAllowed&#12288;is
needed? What'll happen if we don't call?
   2. Netware 6 is non-preemptive, so no mutex is need between thread, is
that right?

Post Reply
Re: Kernel detected unmatched call to EndSleepNotAllowed
Sun, 22 Oct 2006 03:21:21 GMT
You would get a better response by posting to either the libc or clib 
newsgroup ...

-- 


Peter
Post Reply
about | contact