Index: mozilla/nsprpub/pr/src/threads/prmon.c |
=================================================================== |
--- mozilla/nsprpub/pr/src/threads/prmon.c (revision 191424) |
+++ mozilla/nsprpub/pr/src/threads/prmon.c (working copy) |
@@ -1,199 +0,0 @@ |
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
-/* This Source Code Form is subject to the terms of the Mozilla Public |
- * License, v. 2.0. If a copy of the MPL was not distributed with this |
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
- |
-#include "primpl.h" |
- |
-/************************************************************************/ |
- |
-/* |
-** Create a new monitor. |
-*/ |
-PR_IMPLEMENT(PRMonitor*) PR_NewMonitor() |
-{ |
- PRMonitor *mon; |
- PRCondVar *cvar; |
- PRLock *lock; |
- |
- mon = PR_NEWZAP(PRMonitor); |
- if (mon) { |
- lock = PR_NewLock(); |
- if (!lock) { |
- PR_DELETE(mon); |
- return 0; |
- } |
- |
- cvar = PR_NewCondVar(lock); |
- if (!cvar) { |
- PR_DestroyLock(lock); |
- PR_DELETE(mon); |
- return 0; |
- } |
- mon->cvar = cvar; |
- mon->name = NULL; |
- } |
- return mon; |
-} |
- |
-PR_IMPLEMENT(PRMonitor*) PR_NewNamedMonitor(const char* name) |
-{ |
- PRMonitor* mon = PR_NewMonitor(); |
- if (mon) |
- mon->name = name; |
- return mon; |
-} |
- |
-/* |
-** Destroy a monitor. There must be no thread waiting on the monitor's |
-** condition variable. The caller is responsible for guaranteeing that the |
-** monitor is no longer in use. |
-*/ |
-PR_IMPLEMENT(void) PR_DestroyMonitor(PRMonitor *mon) |
-{ |
- PR_DestroyLock(mon->cvar->lock); |
- PR_DestroyCondVar(mon->cvar); |
- PR_DELETE(mon); |
-} |
- |
-/* |
-** Enter the lock associated with the monitor. |
-*/ |
-PR_IMPLEMENT(void) PR_EnterMonitor(PRMonitor *mon) |
-{ |
- if (mon->cvar->lock->owner == _PR_MD_CURRENT_THREAD()) { |
- mon->entryCount++; |
- } else { |
- PR_Lock(mon->cvar->lock); |
- mon->entryCount = 1; |
- } |
-} |
- |
-/* |
-** Test and then enter the lock associated with the monitor if it's not |
-** already entered by some other thread. Return PR_FALSE if some other |
-** thread owned the lock at the time of the call. |
-*/ |
-PR_IMPLEMENT(PRBool) PR_TestAndEnterMonitor(PRMonitor *mon) |
-{ |
- if (mon->cvar->lock->owner == _PR_MD_CURRENT_THREAD()) { |
- mon->entryCount++; |
- return PR_TRUE; |
- } else { |
- if (PR_TestAndLock(mon->cvar->lock)) { |
- mon->entryCount = 1; |
- return PR_TRUE; |
- } |
- } |
- return PR_FALSE; |
-} |
- |
-/* |
-** Exit the lock associated with the monitor once. |
-*/ |
-PR_IMPLEMENT(PRStatus) PR_ExitMonitor(PRMonitor *mon) |
-{ |
- if (mon->cvar->lock->owner != _PR_MD_CURRENT_THREAD()) { |
- return PR_FAILURE; |
- } |
- if (--mon->entryCount == 0) { |
- return PR_Unlock(mon->cvar->lock); |
- } |
- return PR_SUCCESS; |
-} |
- |
-/* |
-** Return the number of times that the current thread has entered the |
-** lock. Returns zero if the current thread has not entered the lock. |
-*/ |
-PR_IMPLEMENT(PRIntn) PR_GetMonitorEntryCount(PRMonitor *mon) |
-{ |
- return (mon->cvar->lock->owner == _PR_MD_CURRENT_THREAD()) ? |
- mon->entryCount : 0; |
-} |
- |
-/* |
-** If the current thread is in |mon|, this assertion is guaranteed to |
-** succeed. Otherwise, the behavior of this function is undefined. |
-*/ |
-PR_IMPLEMENT(void) PR_AssertCurrentThreadInMonitor(PRMonitor *mon) |
-{ |
- PR_ASSERT_CURRENT_THREAD_OWNS_LOCK(mon->cvar->lock); |
-} |
- |
-/* |
-** Wait for a notify on the condition variable. Sleep for "ticks" amount |
-** of time (if "tick" is 0 then the sleep is indefinite). While |
-** the thread is waiting it exits the monitors lock (as if it called |
-** PR_ExitMonitor as many times as it had called PR_EnterMonitor). When |
-** the wait has finished the thread regains control of the monitors lock |
-** with the same entry count as before the wait began. |
-** |
-** The thread waiting on the monitor will be resumed when the monitor is |
-** notified (assuming the thread is the next in line to receive the |
-** notify) or when the "ticks" elapses. |
-** |
-** Returns PR_FAILURE if the caller has not locked the lock associated |
-** with the condition variable. |
-** This routine can return PR_PENDING_INTERRUPT if the waiting thread |
-** has been interrupted. |
-*/ |
-PR_IMPLEMENT(PRStatus) PR_Wait(PRMonitor *mon, PRIntervalTime ticks) |
-{ |
- PRUintn entryCount; |
- PRStatus status; |
- PRThread *me = _PR_MD_CURRENT_THREAD(); |
- |
- if (mon->cvar->lock->owner != me) return PR_FAILURE; |
- |
- entryCount = mon->entryCount; |
- mon->entryCount = 0; |
- |
- status = _PR_WaitCondVar(me, mon->cvar, mon->cvar->lock, ticks); |
- |
- mon->entryCount = entryCount; |
- |
- return status; |
-} |
- |
-/* |
-** Notify the highest priority thread waiting on the condition |
-** variable. If a thread is waiting on the condition variable (using |
-** PR_Wait) then it is awakened and begins waiting on the monitor's lock. |
-*/ |
-PR_IMPLEMENT(PRStatus) PR_Notify(PRMonitor *mon) |
-{ |
- PRThread *me = _PR_MD_CURRENT_THREAD(); |
- if (mon->cvar->lock->owner != me) return PR_FAILURE; |
- PR_NotifyCondVar(mon->cvar); |
- return PR_SUCCESS; |
-} |
- |
-/* |
-** Notify all of the threads waiting on the condition variable. All of |
-** threads are notified in turn. The highest priority thread will |
-** probably acquire the monitor first when the monitor is exited. |
-*/ |
-PR_IMPLEMENT(PRStatus) PR_NotifyAll(PRMonitor *mon) |
-{ |
- PRThread *me = _PR_MD_CURRENT_THREAD(); |
- if (mon->cvar->lock->owner != me) return PR_FAILURE; |
- PR_NotifyAllCondVar(mon->cvar); |
- return PR_SUCCESS; |
-} |
- |
-/************************************************************************/ |
- |
-PRUint32 _PR_MonitorToString(PRMonitor *mon, char *buf, PRUint32 buflen) |
-{ |
- PRUint32 nb; |
- |
- if (mon->cvar->lock->owner) { |
- nb = PR_snprintf(buf, buflen, "[%p] owner=%d[%p] count=%ld", |
- mon, mon->cvar->lock->owner->id, |
- mon->cvar->lock->owner, mon->entryCount); |
- } else { |
- nb = PR_snprintf(buf, buflen, "[%p]", mon); |
- } |
- return nb; |
-} |