18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2009 Jian Li <jianli@chromium.org>
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "ThreadSpecific.h"
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if USE(PTHREADS)
26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#error This file should not be compiled by ports that do not use Windows native ThreadSpecific implementation.
27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WTF {
30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianlong& tlsKeyCount()
328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    static long count;
348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return count;
358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianDWORD* tlsKeys()
388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    static DWORD keys[kMaxTlsKeySize];
408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return keys;
418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid ThreadSpecificThreadExit()
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    for (long i = 0; i < tlsKeyCount(); i++) {
46635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // The layout of ThreadSpecific<T>::Data does not depend on T. So we are safe to do the static cast to ThreadSpecific<int> in order to access its data member.
478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        ThreadSpecific<int>::Data* data = static_cast<ThreadSpecific<int>::Data*>(TlsGetValue(tlsKeys()[i]));
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (data)
49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            data->destructor(data);
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
53635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} // namespace WTF
54