JavaScriptCore/wtf/Threading.cpp
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     1 /*
       
     2  * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
       
     3  *
       
     4  * Redistribution and use in source and binary forms, with or without
       
     5  * modification, are permitted provided that the following conditions
       
     6  * are met:
       
     7  *
       
     8  * 1.  Redistributions of source code must retain the above copyright
       
     9  *     notice, this list of conditions and the following disclaimer. 
       
    10  * 2.  Redistributions in binary form must reproduce the above copyright
       
    11  *     notice, this list of conditions and the following disclaimer in the
       
    12  *     documentation and/or other materials provided with the distribution. 
       
    13  *
       
    14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
       
    15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
       
    16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
       
    17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
       
    18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
       
    19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
       
    20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
       
    21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
    22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
       
    23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
    24  */
       
    25 
       
    26 #include "config.h"
       
    27 #include "Threading.h"
       
    28 
       
    29 #include <string.h>
       
    30 
       
    31 namespace WTF {
       
    32 
       
    33 struct NewThreadContext : FastAllocBase {
       
    34     NewThreadContext(ThreadFunction entryPoint, void* data, const char* name)
       
    35         : entryPoint(entryPoint)
       
    36         , data(data)
       
    37         , name(name)
       
    38     {
       
    39     }
       
    40 
       
    41     ThreadFunction entryPoint;
       
    42     void* data;
       
    43     const char* name;
       
    44 
       
    45     Mutex creationMutex;
       
    46 };
       
    47 
       
    48 static void* threadEntryPoint(void* contextData)
       
    49 {
       
    50     NewThreadContext* context = reinterpret_cast<NewThreadContext*>(contextData);
       
    51 
       
    52     // Block until our creating thread has completed any extra setup work, including
       
    53     // establishing ThreadIdentifier.
       
    54     {
       
    55         MutexLocker locker(context->creationMutex);
       
    56     }
       
    57 
       
    58     initializeCurrentThreadInternal(context->name);
       
    59 
       
    60     // Grab the info that we need out of the context, then deallocate it.
       
    61     ThreadFunction entryPoint = context->entryPoint;
       
    62     void* data = context->data;
       
    63     delete context;
       
    64 
       
    65     return entryPoint(data);
       
    66 }
       
    67 
       
    68 ThreadIdentifier createThread(ThreadFunction entryPoint, void* data, const char* name)
       
    69 {
       
    70     // Visual Studio has a 31-character limit on thread names. Longer names will
       
    71     // be truncated silently, but we'd like callers to know about the limit.
       
    72 #if !LOG_DISABLED
       
    73     if (strlen(name) > 31)
       
    74         LOG_ERROR("Thread name \"%s\" is longer than 31 characters and will be truncated by Visual Studio", name);
       
    75 #endif
       
    76 
       
    77     NewThreadContext* context = new NewThreadContext(entryPoint, data, name);
       
    78 
       
    79     // Prevent the thread body from executing until we've established the thread identifier.
       
    80     MutexLocker locker(context->creationMutex);
       
    81 
       
    82     return createThreadInternal(threadEntryPoint, context, name);
       
    83 }
       
    84 
       
    85 #if PLATFORM(MAC) || PLATFORM(WIN)
       
    86 
       
    87 // This function is deprecated but needs to be kept around for backward
       
    88 // compatibility. Use the 3-argument version of createThread above.
       
    89 
       
    90 ThreadIdentifier createThread(ThreadFunction entryPoint, void* data);
       
    91 
       
    92 ThreadIdentifier createThread(ThreadFunction entryPoint, void* data)
       
    93 {
       
    94     return createThread(entryPoint, data, 0);
       
    95 }
       
    96 #endif
       
    97 
       
    98 } // namespace WTF