Bug 372546 - Mark pipe input/output streams as threadsafe. r=bsmedberg

This commit is contained in:
jwalden@mit.edu 2007-03-25 00:31:45 -07:00
parent a300262180
commit 093b1f6231
3 changed files with 124 additions and 10 deletions

View File

@ -1468,4 +1468,63 @@ NS_CI_INTERFACE_GETTER_NAME(_class)(PRUint32 *count, nsIID ***array) \
#define NS_INTERFACE_MAP_END_THREADSAFE NS_IMPL_QUERY_TAIL_GUTS
/**
* Macro to generate nsIClassInfo methods for classes which do not have
* corresponding nsIFactory implementations.
*/
#define NS_IMPL_THREADSAFE_CI(_class) \
NS_IMETHODIMP \
_class::GetInterfaces(PRUint32* _count, nsIID*** _array) \
{ \
return NS_CI_INTERFACE_GETTER_NAME(_class)(_count, _array); \
} \
\
NS_IMETHODIMP \
_class::GetHelperForLanguage(PRUint32 _language, nsISupports** _retval) \
{ \
*_retval = nsnull; \
return NS_OK; \
} \
\
NS_IMETHODIMP \
_class::GetContractID(char** _contractID) \
{ \
*_contractID = nsnull; \
return NS_OK; \
} \
\
NS_IMETHODIMP \
_class::GetClassDescription(char** _classDescription) \
{ \
*_classDescription = nsnull; \
return NS_OK; \
} \
\
NS_IMETHODIMP \
_class::GetClassID(nsCID** _classID) \
{ \
*_classID = nsnull; \
return NS_OK; \
} \
\
NS_IMETHODIMP \
_class::GetImplementationLanguage(PRUint32* _language) \
{ \
*_language = nsIProgrammingLanguage::CPLUSPLUS; \
return NS_OK; \
} \
\
NS_IMETHODIMP \
_class::GetFlags(PRUint32* _flags) \
{ \
*_flags = nsIClassInfo::THREADSAFE; \
return NS_OK; \
} \
\
NS_IMETHODIMP \
_class::GetClassIDNoAlloc(nsCID* _classIDNoAlloc) \
{ \
return NS_ERROR_NOT_AVAILABLE; \
}
#endif

View File

@ -38,6 +38,7 @@
#include "nsIPipe.h"
#include "nsIEventTarget.h"
#include "nsISeekableStream.h"
#include "nsIProgrammingLanguage.h"
#include "nsSegmentedBuffer.h"
#include "nsStreamUtils.h"
#include "nsAutoLock.h"
@ -104,6 +105,7 @@ private:
class nsPipeInputStream : public nsIAsyncInputStream
, public nsISeekableStream
, public nsISearchableInputStream
, public nsIClassInfo
{
public:
// since this class will be allocated as a member of the pipe, we do not
@ -117,6 +119,7 @@ public:
NS_DECL_NSIASYNCINPUTSTREAM
NS_DECL_NSISEEKABLESTREAM
NS_DECL_NSISEARCHABLEINPUTSTREAM
NS_DECL_NSICLASSINFO
nsPipeInputStream(nsPipe *pipe)
: mPipe(pipe)
@ -162,6 +165,7 @@ private:
// the output end of a pipe (allocated as a member of the pipe).
class nsPipeOutputStream : public nsIAsyncOutputStream
, public nsISeekableStream
, public nsIClassInfo
{
public:
// since this class will be allocated as a member of the pipe, we do not
@ -174,6 +178,7 @@ public:
NS_DECL_NSIOUTPUTSTREAM
NS_DECL_NSIASYNCOUTPUTSTREAM
NS_DECL_NSISEEKABLESTREAM
NS_DECL_NSICLASSINFO
nsPipeOutputStream(nsPipe *pipe)
: mPipe(pipe)
@ -598,6 +603,21 @@ nsPipeEvents::~nsPipeEvents()
// nsPipeInputStream methods:
//-----------------------------------------------------------------------------
NS_IMPL_QUERY_INTERFACE5(nsPipeInputStream,
nsIInputStream,
nsIAsyncInputStream,
nsISeekableStream,
nsISearchableInputStream,
nsIClassInfo)
NS_IMPL_CI_INTERFACE_GETTER4(nsPipeInputStream,
nsIInputStream,
nsIAsyncInputStream,
nsISeekableStream,
nsISearchableInputStream)
NS_IMPL_THREADSAFE_CI(nsPipeInputStream)
nsresult
nsPipeInputStream::Wait()
{
@ -676,12 +696,6 @@ nsPipeInputStream::Release(void)
return mPipe->Release();
}
NS_IMPL_QUERY_INTERFACE4(nsPipeInputStream,
nsIInputStream,
nsIAsyncInputStream,
nsISeekableStream,
nsISearchableInputStream)
NS_IMETHODIMP
nsPipeInputStream::CloseWithStatus(nsresult reason)
{
@ -952,6 +966,18 @@ nsPipeInputStream::Search(const char *forString,
// nsPipeOutputStream methods:
//-----------------------------------------------------------------------------
NS_IMPL_QUERY_INTERFACE3(nsPipeOutputStream,
nsIOutputStream,
nsIAsyncOutputStream,
nsIClassInfo)
NS_IMPL_CI_INTERFACE_GETTER3(nsPipeOutputStream,
nsIOutputStream,
nsIAsyncOutputStream,
nsISeekableStream)
NS_IMPL_THREADSAFE_CI(nsPipeOutputStream)
nsresult
nsPipeOutputStream::Wait()
{
@ -1027,10 +1053,6 @@ nsPipeOutputStream::Release()
return mPipe->Release();
}
NS_IMPL_QUERY_INTERFACE2(nsPipeOutputStream,
nsIOutputStream,
nsIAsyncOutputStream)
NS_IMETHODIMP
nsPipeOutputStream::CloseWithStatus(nsresult reason)
{

View File

@ -39,10 +39,14 @@
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cr = Components.results;
const CC = Components.Constructor;
var Pipe = CC("@mozilla.org/pipe;1", "nsIPipe", "init");
function run_test()
{
test_not_initialized();
test_ends_are_threadsafe();
}
function test_not_initialized()
@ -60,3 +64,32 @@ function test_not_initialized()
do_throw("using a pipe before initializing it should throw NS_ERROR_NOT_INITIALIZED");
}
}
function test_ends_are_threadsafe()
{
var p, is, os;
p = new Pipe(true, true, 1024, 1, null);
is = p.inputStream.QueryInterface(Ci.nsIClassInfo);
os = p.outputStream.QueryInterface(Ci.nsIClassInfo);
do_check_true(Boolean(is.flags & Ci.nsIClassInfo.THREADSAFE));
do_check_true(Boolean(os.flags & Ci.nsIClassInfo.THREADSAFE));
p = new Pipe(true, false, 1024, 1, null);
is = p.inputStream.QueryInterface(Ci.nsIClassInfo);
os = p.outputStream.QueryInterface(Ci.nsIClassInfo);
do_check_true(Boolean(is.flags & Ci.nsIClassInfo.THREADSAFE));
do_check_true(Boolean(os.flags & Ci.nsIClassInfo.THREADSAFE));
p = new Pipe(false, true, 1024, 1, null);
is = p.inputStream.QueryInterface(Ci.nsIClassInfo);
os = p.outputStream.QueryInterface(Ci.nsIClassInfo);
do_check_true(Boolean(is.flags & Ci.nsIClassInfo.THREADSAFE));
do_check_true(Boolean(os.flags & Ci.nsIClassInfo.THREADSAFE));
p = new Pipe(false, false, 1024, 1, null);
is = p.inputStream.QueryInterface(Ci.nsIClassInfo);
os = p.outputStream.QueryInterface(Ci.nsIClassInfo);
do_check_true(Boolean(is.flags & Ci.nsIClassInfo.THREADSAFE));
do_check_true(Boolean(os.flags & Ci.nsIClassInfo.THREADSAFE));
}