genericopenlibs/openenvcore/libpthread/src/pthread_setschedparam.cpp
changeset 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/openenvcore/libpthread/src/pthread_setschedparam.cpp	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,143 @@
+// 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     : pthread_setschedparam.cpp
+// Part of  : PThread library
+// pthread_setschedparam call implementation.
+// Version:
+//
+
+
+
+#include <pthread.h>
+#include <errno.h>
+#include "threadglobals.h"
+#include "threadcreate.h"
+#include "pthreadmisc.h"
+
+EXPORT_C int pthread_setschedparam(pthread_t thread, int policy, 
+                                   const struct sched_param *param)
+{
+    int priority;
+    _global_data_t *glbPtr;
+    _pthread_node_t *tempPtr;
+    _pthread_node_t *selfNodePtr;
+    _pthread_node_t *thHandle;
+    
+    THR_PRINTF("[pthread] Begin pthread_setschedparam\n");
+
+    if (NULL == param)
+    {
+        THR_PRINTF("[pthread] End of pthread_setschedparam\n");
+        return EINVAL;
+    }
+    /* Check the policy */
+    switch (policy) 
+    {
+        case SCHED_RR:
+            // Nothing has to be done.
+            THR_PRINTF("[pthread] End pthread_setschedparam\n");
+            break;
+            
+        default:
+            THR_PRINTF("[pthread] End pthread_setschedparam\n");        
+            return EINVAL;
+    }    
+
+    if ((param->sched_priority < MIN_RR_PRIORITY) ||
+        (param->sched_priority > MAX_RR_PRIORITY))
+    {
+        THR_PRINTF("[pthread] End of pthread_setschedparam\n");
+        return EINVAL;
+    }
+    
+    /*  Mapping POSIX priorities to Symbian Threads priorities 
+        POSIX     Symbian
+    ---------     ------------------
+      0 -  49  => EPriorityMuchLess
+     50 -  99  => EPriorityLess
+    100 - 149  => EPriorityNormal
+    150 - 199  => EPriorityMore
+    200 - 255  => EPriorityMuchMore
+    */
+    
+    switch (param->sched_priority / 50)
+    {
+        case 0:
+            priority = EPriorityMuchLess;
+            break;
+        case 1:
+            priority = EPriorityLess;
+            break;
+        case 2:
+            priority = EPriorityNormal;
+            break;
+        case 3:
+            priority = EPriorityMore;
+            break;
+        default:
+            priority = EPriorityMuchMore;
+            break;                                                
+    }
+
+    /* Verify the thread handle */
+
+    //Get the TLS value (self node pointer)
+    selfNodePtr = (_pthread_node_t*) _pthread_getTls();
+    //coverity[var_compare_op]
+    if (NULL == selfNodePtr)
+    {
+        THR_PRINTF("[pthread] FATAL :TLS is not initialized \n");
+        THR_PRINTF("[pthread] Terminating the process\n");
+        RProcess rp;
+        rp.Kill(0);                // Terminate the process
+    }
+
+    thHandle = (_pthread_node_t *)thread;
+
+	//coverity[var_deref_op]
+     
+    glbPtr = selfNodePtr->glbDataPtr;  // point to global struct
+    
+    glbPtr->lockThreadTable.Wait();    // Acquire the thread table lock
+    
+    // Traverse through the list, till destination node is reached
+    for (tempPtr = glbPtr->start; 
+         ((tempPtr != thHandle) && (tempPtr != NULL)); 
+         tempPtr = tempPtr->next)
+    {
+        ;             //Empty loop 
+    }
+    
+    if (NULL == tempPtr)              // Not found; 
+    {
+        THR_PRINTF("[pthread] End of pthread_setschedparam");
+        glbPtr->lockThreadTable.Signal();  //release global lock
+        return ESRCH;
+    }
+    
+    thHandle->lockNode.Wait(); // Acquire the node lock 
+                              
+    thHandle->rtHandle.SetPriority((TThreadPriority)priority);
+    thHandle->priority = priority;
+        
+    thHandle->lockNode.Signal();
+    glbPtr->lockThreadTable.Signal();  // release thread table lock
+
+    THR_PRINTF("[pthread] End pthread_setschedparam\n");
+    
+    return 0;
+}
+
+// End of File
+