/*
 * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef WebCoreThread_h
#define WebCoreThread_h

#if TARGET_OS_IPHONE

#import <CoreGraphics/CoreGraphics.h>

// Use __has_include here so that things work when rewritten into WebKitLegacy headers.
#if __has_include(<WebCore/PlatformExportMacros.h>)
#import <WebCore/PlatformExportMacros.h>
#endif

#if defined(__cplusplus)
extern "C" {
#endif    
        
typedef struct {
    CGContextRef currentCGContext;
} WebThreadContext;
    
extern volatile bool webThreadShouldYield;

#ifdef __OBJC__
@class NSRunLoop;
#else
class NSRunLoop;
#endif

// The lock is automatically freed at the bottom of the runloop. No need to unlock.
// Note that calling this function may hang your UI for several seconds. Don't use
// unless you have to.
WEBCORE_EXPORT void WebThreadLock(void);
    
// This is a no-op for compatibility only. It will go away. Please don't use.
WEBCORE_EXPORT void WebThreadUnlock(void);
    
// Please don't use anything below this line unless you know what you are doing. If unsure, ask.
// ---------------------------------------------------------------------------------------------
WEBCORE_EXPORT bool WebThreadIsLocked(void);
WEBCORE_EXPORT bool WebThreadIsLockedOrDisabled(void);
    
WEBCORE_EXPORT void WebThreadLockPushModal(void);
WEBCORE_EXPORT void WebThreadLockPopModal(void);

WEBCORE_EXPORT void WebThreadEnable(void);
WEBCORE_EXPORT bool WebThreadIsEnabled(void);
WEBCORE_EXPORT bool WebThreadIsCurrent(void);
WEBCORE_EXPORT bool WebThreadNotCurrent(void);
    
// These are for <rdar://problem/6817341> Many apps crashing calling -[UIFieldEditor text] in secondary thread
// Don't use them to solve any random problems you might have.
WEBCORE_EXPORT void WebThreadLockFromAnyThread(void);
WEBCORE_EXPORT void WebThreadLockFromAnyThreadNoLog(void);
WEBCORE_EXPORT void WebThreadUnlockFromAnyThread(void);

// This is for <rdar://problem/8005192> Mail entered a state where message subject and content isn't displayed.
// It should only be used for MobileMail to work around <rdar://problem/8005192>.
WEBCORE_EXPORT void WebThreadUnlockGuardForMail(void);

static inline bool WebThreadShouldYield(void) { return webThreadShouldYield; }
static inline void WebThreadSetShouldYield(void) { webThreadShouldYield = true; }

WEBCORE_EXPORT NSRunLoop* WebThreadNSRunLoop(void);

#if defined(__cplusplus)
}
#endif

#endif // TARGET_OS_IPHONE

#endif // WebCoreThread_h
