From 021087f6017b0b01fb2139ab409b44906603c162 Mon Sep 17 00:00:00 2001 From: "pavlov%netscape.com" Date: Tue, 8 May 2001 03:38:35 +0000 Subject: [PATCH] adding some new files... not part of the build --- modules/libpr0n/src/imgThread.cpp | 124 ++++++++++++++++++++++++++++++ modules/libpr0n/src/imgThread.h | 65 ++++++++++++++++ 2 files changed, 189 insertions(+) create mode 100644 modules/libpr0n/src/imgThread.cpp create mode 100644 modules/libpr0n/src/imgThread.h diff --git a/modules/libpr0n/src/imgThread.cpp b/modules/libpr0n/src/imgThread.cpp new file mode 100644 index 00000000000..b43240f2f6e --- /dev/null +++ b/modules/libpr0n/src/imgThread.cpp @@ -0,0 +1,124 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 2001 Netscape Communications Corporation. + * All Rights Reserved. + * + * Contributor(s): + * Stuart Parmenter + */ + +#include "imgThread.h" + +#include "nsIEventQueueService.h" + +#include "nsIComponentManager.h" +#include "nsIServiceManager.h" + +#include "prlock.h" + +#include "nsAutoLock.h" + +NS_IMPL_THREADSAFE_ISUPPORTS1(imgThread, nsIRunnable) + +imgThread::imgThread() +{ + NS_INIT_ISUPPORTS(); + /* member initializers and constructor code */ + mLock = PR_NewLock(); + mMonitor = PR_NewMonitor(); +} + +imgThread::~imgThread() +{ + /* destructor code */ + PR_DestroyLock(mLock); + PR_DestroyMonitor(mMonitor); +} + +nsresult imgThread::Init() +{ + if (!mThread) { + nsresult rv = NS_NewThread(getter_AddRefs(mThread), + NS_STATIC_CAST(nsIRunnable*, this), + 0, + PR_UNJOINABLE_THREAD, + PR_PRIORITY_NORMAL, + PR_GLOBAL_THREAD); + if (NS_FAILED(rv)) + return rv; + } + + return NS_OK; +} + +nsresult imgThread::GetEventQueue(nsIEventQueue **aEventQueue) +{ + PR_EnterMonitor(mMonitor); + + if (!mEventQueue) + PR_Wait(mMonitor, PR_INTERVAL_NO_TIMEOUT); + + *aEventQueue = mEventQueue; + NS_ADDREF(*aEventQueue); + + PR_ExitMonitor(mMonitor); + return NS_OK; +} + + +/** nsIRunnable methods **/ + +/* void Run(); */ +NS_IMETHODIMP imgThread::Run() +{ + nsresult rv; + + nsCOMPtr currentThreadQ; + + PR_EnterMonitor(mMonitor); + + nsCOMPtr eventService(do_GetService("@mozilla.org/event-queue-service;1", &rv)); + if (NS_FAILED(rv)) return rv; + + rv = eventService->CreateMonitoredThreadEventQueue(); + if (NS_FAILED(rv)) return rv; + + rv = eventService->GetThreadEventQueue(NS_CURRENT_THREAD, getter_AddRefs(mEventQueue)); + + NS_ASSERTION(NS_SUCCEEDED(rv), "unable to create event queue"); + if (NS_FAILED(rv)) return rv; + + PR_Notify(mMonitor); + + PR_ExitMonitor(mMonitor); + + PLEvent *event; + while (1) { + rv = mEventQueue->WaitForEvent(&event); + if (NS_FAILED(rv)) return rv; + + rv = mEventQueue->HandleEvent(event); + if (NS_FAILED(rv)) return rv; + } + + rv = eventService->DestroyThreadEventQueue(); + if (NS_FAILED(rv)) return rv; + + mEventQueue = nsnull; + + return NS_OK; +} diff --git a/modules/libpr0n/src/imgThread.h b/modules/libpr0n/src/imgThread.h new file mode 100644 index 00000000000..b8d7589839e --- /dev/null +++ b/modules/libpr0n/src/imgThread.h @@ -0,0 +1,65 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 2001 Netscape Communications Corporation. + * All Rights Reserved. + * + * Contributor(s): + * Stuart Parmenter + */ + +#ifndef imgThread_h__ +#define imgThread_h__ + +#include "nsCOMPtr.h" + +#include "nsIRunnable.h" +#include "nsIThread.h" +#include "nsIEventQueue.h" + +#include "prmon.h" + +#define NS_IMGTHREAD_CID \ +{ /* dfc3d8ba-1dd1-11b2-be51-e90c9f8718d5 */ \ + 0xdfc3d8ba, \ + 0x1dd1, \ + 0x11b2, \ + {0xbe, 0x51, 0xe9, 0x0c, 0x9f, 0x87, 0x18, 0xd5} \ +} + +class imgThread : public nsIRunnable +{ +public: + imgThread(); + virtual ~imgThread(); + + NS_DECL_ISUPPORTS + NS_DECL_NSIRUNNABLE + + /* additional members */ + nsresult Init(); + nsresult GetEventQueue(nsIEventQueue **aEventQueue); + +private: + nsCOMPtr mThread; + + nsCOMPtr mEventQueue; + + PRLock *mLock; + PRMonitor *mMonitor; +}; + +#endif