genericopenlibs/openenvcore/libpthread/src/sem_microsleepwait_np.cpp
changeset 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/openenvcore/libpthread/src/sem_microsleepwait_np.cpp	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,81 @@
+// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Name     : sem_microsleepwait_np.cpp
+// Part of  : PThread library
+// sem_microsleepwait_np call is implemented.
+// Version:
+//
+
+
+
+#include <e32def.h>
+#include <errno.h>
+
+#include "semaphore.h"
+#include "semaphoretypes.h"
+#include "pthread.h"
+
+
+int sem_microsleepwait_np (sem_t* sem, const long aSleepTime)
+{
+    if (!sem || !(*sem) )
+    {
+        errno = EINVAL;
+        return -1;
+    }
+
+    _sem_t* lsem = *sem;
+    if(lsem->iState != _sem_t::EInitialized)
+    {
+        errno = EINVAL;
+        return -1;
+    }
+
+    if(_cancelable_mutex_wait(lsem) != 0)
+    {
+        return -1;
+    }
+
+    int count = --(lsem->iCount);
+    lsem->iMutex.Signal();
+
+    int retval = 0;
+    if(count <0)
+    {
+    //push to cleanup
+
+    retval = lsem->iSemaphore.Wait(aSleepTime);
+    if(retval != KErrNone)
+    {
+        //timeout
+        //the semaphore count goes up
+        lsem->iMutex.Wait();
+        if(lsem->iState != _sem_t::EInitialized)
+        {
+            errno = EINVAL;
+            return -1;
+        }
+        ++(lsem->iCount);
+        lsem->iMutex.Signal();
+        errno =  ETIMEDOUT;
+        return -1;
+    }
+
+    //pop from cleanup
+    }
+    return 0;
+
+}//sem_microsleepwait_np()
+
+//End of File