Allow PAL to log messages
[WebKit-https.git] / Source / WebCore / PAL / pal / Logging.cpp
1 /*
2  * Copyright (C) 2003, 2006, 2013, 2017 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  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "Logging.h"
28
29 #include "LogInitialization.h"
30
31 #include <wtf/StdLibExtras.h>
32 #include <wtf/text/CString.h>
33 #include <wtf/text/WTFString.h>
34
35 #if PLATFORM(COCOA)
36 #include <notify.h>
37 #include <wtf/BlockPtr.h>
38 #endif
39
40 namespace PAL {
41
42 #if !LOG_DISABLED || !RELEASE_LOG_DISABLED
43
44 #define DEFINE_PAL_LOG_CHANNEL(name) DEFINE_LOG_CHANNEL(name, LOG_CHANNEL_WEBKIT_SUBSYSTEM)
45 PAL_LOG_CHANNELS(DEFINE_PAL_LOG_CHANNEL)
46
47 static WTFLogChannel* logChannels[] = {
48     PAL_LOG_CHANNELS(LOG_CHANNEL_ADDRESS)
49 };
50
51 static const size_t logChannelCount = WTF_ARRAY_LENGTH(logChannels);
52
53 bool isLogChannelEnabled(const String& name)
54 {
55     WTFLogChannel* channel = WTFLogChannelByName(logChannels, logChannelCount, name.utf8().data());
56     if (!channel)
57         return false;
58     return channel->state != WTFLogChannelOff;
59 }
60
61 static bool logChannelsNeedInitialization = true;
62
63 void setLogChannelToAccumulate(const String& name)
64 {
65     WTFLogChannel* channel = WTFLogChannelByName(logChannels, logChannelCount, name.utf8().data());
66     if (!channel)
67         return;
68
69     channel->state = WTFLogChannelOnWithAccumulation;
70     logChannelsNeedInitialization = true;
71 }
72
73 void initializeLogChannelsIfNecessary(std::optional<String> logChannelString)
74 {
75     if (!logChannelsNeedInitialization && !logChannelString)
76         return;
77
78     logChannelsNeedInitialization = false;
79
80     String enabledChannelsString = logChannelString ? logChannelString.value() : logLevelString();
81     WTFInitializeLogChannelStatesFromString(logChannels, logChannelCount, enabledChannelsString.utf8().data());
82 }
83
84 #ifndef NDEBUG
85 void registerNotifyCallback(const String& notifyID, WTF::Function<void()>&& callback)
86 {
87 #if PLATFORM(COCOA)
88     int token;
89     notify_register_dispatch(notifyID.utf8().data(), &token, dispatch_get_main_queue(), BlockPtr<void(int)>::fromCallable([callback = WTFMove(callback)](int) {
90         callback();
91     }).get());
92 #else
93     UNUSED_PARAM(notifyID);
94     UNUSED_PARAM(callback);
95 #endif
96 }
97 #endif
98
99 #endif // !LOG_DISABLED || !RELEASE_LOG_DISABLED
100
101 } // namespace WebCore
102