Back to index

lightning-sunbird  0.9+nobinonly
btsem.c
Go to the documentation of this file.
00001 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
00002 /* ***** BEGIN LICENSE BLOCK *****
00003  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00004  *
00005  * The contents of this file are subject to the Mozilla Public License Version
00006  * 1.1 (the "License"); you may not use this file except in compliance with
00007  * the License. You may obtain a copy of the License at
00008  * http://www.mozilla.org/MPL/
00009  *
00010  * Software distributed under the License is distributed on an "AS IS" basis,
00011  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00012  * for the specific language governing rights and limitations under the
00013  * License.
00014  *
00015  * The Original Code is the Netscape Portable Runtime (NSPR).
00016  *
00017  * The Initial Developer of the Original Code is
00018  * Netscape Communications Corporation.
00019  * Portions created by the Initial Developer are Copyright (C) 1998-2000
00020  * the Initial Developer. All Rights Reserved.
00021  *
00022  * Contributor(s):
00023  *
00024  * Alternatively, the contents of this file may be used under the terms of
00025  * either the GNU General Public License Version 2 or later (the "GPL"), or
00026  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00027  * in which case the provisions of the GPL or the LGPL are applicable instead
00028  * of those above. If you wish to allow use of your version of this file only
00029  * under the terms of either the GPL or the LGPL, and not to allow others to
00030  * use your version of this file under the terms of the MPL, indicate your
00031  * decision by deleting the provisions above and replace them with the notice
00032  * and other provisions required by the GPL or the LGPL. If you do not delete
00033  * the provisions above, a recipient may use your version of this file under
00034  * the terms of any one of the MPL, the GPL or the LGPL.
00035  *
00036  * ***** END LICENSE BLOCK ***** */
00037 
00038 #include <kernel/OS.h>
00039 
00040 #include "primpl.h"
00041 
00042 /*
00043 ** Create a new semaphore object.
00044 */
00045 PR_IMPLEMENT(PRSemaphore*)
00046     PR_NewSem (PRUintn value)
00047 {
00048        PRSemaphore *semaphore;
00049 
00050        if (!_pr_initialized) _PR_ImplicitInitialization();
00051 
00052        semaphore = PR_NEWZAP(PRSemaphore);
00053        if (NULL != semaphore) {
00054               if ((semaphore->sem = create_sem(value, "nspr_sem")) < B_NO_ERROR)
00055                      return NULL;
00056               else 
00057                      return semaphore;
00058        }
00059        return NULL;
00060 }
00061 
00062 /*
00063 ** Destroy the given semaphore object.
00064 **
00065 */
00066 PR_IMPLEMENT(void)
00067     PR_DestroySem (PRSemaphore *sem)
00068 {
00069        status_t result;
00070 
00071        PR_ASSERT(sem != NULL);
00072        result = delete_sem(sem->sem);
00073        PR_ASSERT(result == B_NO_ERROR);
00074        PR_DELETE(sem);
00075 } 
00076 
00077 /*
00078 ** Wait on a Semaphore.
00079 ** 
00080 ** This routine allows a calling thread to wait or proceed depending upon
00081 ** the state of the semahore sem. The thread can proceed only if the
00082 ** counter value of the semaphore sem is currently greater than 0. If the
00083 ** value of semaphore sem is positive, it is decremented by one and the
00084 ** routine returns immediately allowing the calling thread to continue. If
00085 ** the value of semaphore sem is 0, the calling thread blocks awaiting the
00086 ** semaphore to be released by another thread.
00087 ** 
00088 ** This routine can return PR_PENDING_INTERRUPT if the waiting thread 
00089 ** has been interrupted.
00090 */
00091 PR_IMPLEMENT(PRStatus)
00092     PR_WaitSem (PRSemaphore *sem)
00093 {
00094        PR_ASSERT(sem != NULL);
00095        if (acquire_sem(sem->sem) == B_NO_ERROR)
00096               return PR_SUCCESS;
00097        else
00098               return PR_FAILURE;
00099 }
00100 
00101 /*
00102 ** This routine increments the counter value of the semaphore. If other
00103 ** threads are blocked for the semaphore, then the scheduler will
00104 ** determine which ONE thread will be unblocked.
00105 */
00106 PR_IMPLEMENT(void)
00107     PR_PostSem (PRSemaphore *sem)
00108 {
00109        status_t result;
00110 
00111        PR_ASSERT(sem != NULL);
00112        result = release_sem_etc(sem->sem, 1, B_DO_NOT_RESCHEDULE);
00113        PR_ASSERT(result == B_NO_ERROR);
00114 }
00115 
00116 /*
00117 ** Returns the value of the semaphore referenced by sem without affecting
00118 ** the state of the semaphore.  The value represents the semaphore value
00119 ** at the time of the call, but may not be the actual value when the
00120 ** caller inspects it.
00121 */
00122 PR_IMPLEMENT(PRUintn)
00123     PR_GetValueSem (PRSemaphore *sem)
00124 {
00125        sem_info      info;
00126 
00127        PR_ASSERT(sem != NULL);
00128        get_sem_info(sem->sem, &info);
00129        return info.count;
00130 }