/************************************************************************
 *
 * 22.locale.ctype.mt.cpp
 *
 * test exercising the thread safety of the ctype facet
 *
 * $Id$
 *
 ***************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you under  the Apache
 * License, Version  2.0 (the  "License"); you may  not use  this file
 * except in  compliance with the License.   You may obtain  a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the  License is distributed on an  "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
 * implied.   See  the License  for  the  specific language  governing
 * permissions and limitations under the License.
 *
 **************************************************************************/

#include <locale>     // for locale, ctype

#include <clocale>    // for lconv, localeconv()
#include <cstdlib>    // for mbstowcs()
#include <cstring>    // for size_t, strcpy()

#include <rw_locale.h>
#include <rw_thread.h>
#include <rw_driver.h>
#include <rw_valcmp.h>


// maximum number of threads allowed by the command line interface
#define MAX_THREADS   16

// default number of threads (will be adjusted to the number
// of processors/cores later)
int opt_nthreads = 1;

// the number of times each thread should iterate (unless specified
// otherwise on the command line)
int opt_nloops = 200000;

#if !defined (_RWSTD_OS_HP_UX) || defined (_ILP32)

// number of locales to use
int opt_nlocales = MAX_THREADS;

#else   // HP-UX in LP64 mode

// work around an inefficiency (small cache size?) on HP-UX
// in LP64 mode (see STDCXX-812)
int opt_nlocales = 10;

#endif   // HP-UX 32/64 bit mode

// should all threads share the same set of locale objects instead
// of creating their own?
int opt_shared_locale;

// default timeout used by each threaded section of this test
int opt_timeout = 60;

/**************************************************************************/

// array of locale names to use for testing
static const char*
locales [MAX_THREADS];

// number of locale names in the array
static std::size_t
nlocales;

/**************************************************************************/

struct CtypeData
{
    // the name of the locale the data corresponds to
    const char *locale_name_;

    // optionally set to the named locale for the threads to share
    std::locale locale_;

    // results of ctype<charT>::widen(char) for char and wchar_t
    char    widened_ [256];
    wchar_t wwidened_ [256];

    // array of wide characters to narrow and the number
    // of valid elements in the array
    wchar_t wide_ [1024];
    std::size_t nwide_;

    // results of ctype<charT>::narrow(charT, char) for char
    // and wchar_t values of wide_ [i]
    char narrowed_ [256];
    char wnarrowed_ [1024];

} ctype_data [MAX_THREADS];


extern "C" {

bool test_char;    // exercise num_put<char>
bool test_wchar;   // exercise num_put<wchar_t>


static void*
thread_func (void*)
{
    // number of narrow characters to test (should be 256)
    const std::size_t nchars =
        sizeof ctype_data->widened_ / sizeof *ctype_data->widened_;

    for (int i = 0; i != opt_nloops; ++i) {

        if (rw_thread_pool_timeout_expired ())
            break;

        const std::size_t inx = std::size_t (i) % nlocales;

        // save the name of the locale
        const char* const locale_name = locales [inx];

        const CtypeData* const data = ctype_data + inx;

        // construct a named locale
        const std::locale loc =
            opt_shared_locale ? data->locale_ : std::locale (locale_name);

        // "random" index/character value
        const std::size_t cinx = std::size_t (i) % nchars;

        if (test_char) {
            // exercise the narrow char specialization of the facet

            const std::ctype<char> &ct =
                std::use_facet<std::ctype<char> >(loc);

            const char wc = ct.widen (char (cinx));

            RW_ASSERT (wc == data->widened_ [cinx]);

            const char nc = ct.narrow (char (cinx), '\0');

            RW_ASSERT (nc == data->narrowed_ [cinx]);
        }

        // both specializations may be tested at the same time

        if (test_wchar) {
            // exercise the wide char specialization of the facet

#ifndef _RWSTD_NO_WCHAR_T

            const std::ctype<wchar_t> &wct =
                std::use_facet<std::ctype<wchar_t> >(loc);

            // "random" index into the wide character array
            const std::size_t winx =
                std::size_t (i) % data->nwide_;

            const wchar_t wc = wct.widen (char (cinx));

            RW_ASSERT (wc == data->wwidened_ [cinx]);

            const char nc = wct.narrow (data->wide_ [winx], L'\0');

            RW_ASSERT (nc == data->wnarrowed_ [winx]);

#endif   // _RWSTD_NO_WCHAR_T

        }
    }

    return 0;
}

}   // extern "C"

/**************************************************************************/

static int
run_test (int, char**)
{
    // find all installed locales for which setlocale(LC_ALL) succeeds
    const char* const locale_list =
        rw_opt_locales ? rw_opt_locales : rw_locales (_RWSTD_LC_ALL);

    const std::size_t maxinx = sizeof locales / sizeof *locales;

    // iterate over locales, initializing a global ctype_data array
    // with LC_CTYPE data obtained from each locale
    for (const char *name = locale_list; *name;
         name += std::strlen (name) + 1) {

        const std::size_t inx = nlocales;

        locales [inx] = name;

        CtypeData* const pdata = ctype_data + nlocales;

        // compute the number of wide characters to populate
        const std::size_t nwide =
            sizeof pdata->wide_ / sizeof pdata->wide_ [0];

        try {
            const std::locale loc (name);

            const std::ctype<char> &ct =
                std::use_facet<std::ctype<char> >(loc);

            const std::ctype<wchar_t> &wct =
                std::use_facet<std::ctype<wchar_t> >(loc);

            pdata->locale_name_ = name;

            const std::size_t nchars =
                sizeof pdata->widened_ / sizeof *pdata->widened_;

            for (std::size_t i = 0; i != nchars; ++i) {
                pdata->widened_  [i] = ct.widen (char (i));
                pdata->wwidened_ [i] = wct.widen (char (i));
                pdata->narrowed_ [i] = ct.narrow (char (i), '\0');
            }

            pdata->nwide_ = rw_get_wchars (pdata->wide_, nwide);
            for (std::size_t i = 0; i != pdata->nwide_; ++i)
                pdata->wnarrowed_ [i] = wct.narrow (pdata->wide_ [i], L'\0');

            if (opt_shared_locale)
                pdata->locale_ = loc;

            ++nlocales;
        }
        catch (...) {
            // skip over a bad locale
        }

        if (nlocales == maxinx || nlocales == std::size_t (opt_nlocales))
            break;
    }

    // avoid divide by zero in thread if there are no locales to test
    rw_fatal (nlocales != 0, 0, __LINE__,
              "failed to create one or more usable locales!");

    rw_info (0, 0, 0,
             "testing std::ctype<charT> with %d thread%{?}s%{;}, "
             "%d iteration%{?}s%{;} each, in %zu locales { %{ .*A@} }",
             opt_nthreads, 1 != opt_nthreads,
             opt_nloops, 1 != opt_nloops,
             nlocales, int (nlocales), "%#s", locales);

    rw_info (0, 0, 0, "exercising std::ctype<char>");

    test_char  = true;
    test_wchar = false;

    // create and start a pool of threads and wait for them to finish
    int result =
        rw_thread_pool (0, std::size_t (opt_nthreads), 0,
                        thread_func, 0, std::size_t (opt_timeout));

    rw_error (result == 0, 0, __LINE__,
              "rw_thread_pool(0, %d, 0, %{#f}, 0) failed",
              opt_nthreads, thread_func);

#ifndef _RWSTD_NO_WCHAR_T

    rw_info (0, 0, 0, "exercising std::ctype<wchar_t>");

    test_char  = false;
    test_wchar = true;

    // start a pool of threads to exercise the thread safety
    // of the wchar_t specialization
    result =
        rw_thread_pool (0, std::size_t (opt_nthreads), 0,
                        thread_func, 0, std::size_t (opt_timeout));

    rw_error (result == 0, 0, __LINE__,
              "rw_thread_pool(0, %d, 0, %{#f}, 0) failed",
              opt_nthreads, thread_func);

    // exercise both the char and the wchar_t specializations
    // at the same time

    rw_info (0, 0, 0,
             "exercising both std::ctype<char> and std::ctype<wchar_t>");

    test_char  = true;
    test_wchar = true;

    // start a pool of threads to exercise wstring thread safety
    result =
        rw_thread_pool (0, std::size_t (opt_nthreads), 0,
                        thread_func, 0, std::size_t (opt_timeout));

    rw_error (result == 0, 0, __LINE__,
              "rw_thread_pool(0, %d, 0, %{#f}, 0) failed",
              opt_nthreads, thread_func);

#endif   // _RWSTD_NO_WCHAR_T

    return result;
}

/**************************************************************************/

int main (int argc, char *argv[])
{
#ifdef _RWSTD_REENTRANT

    // set nthreads to the greater of the number of processors
    // and 2 (for uniprocessor systems) by default
    opt_nthreads = rw_get_cpus ();
    if (opt_nthreads < 2)
        opt_nthreads = 2;

#endif   // _RWSTD_REENTRANT

    return rw_test (argc, argv, __FILE__,
                    "lib.locale.ctype",
                    "thread safety", run_test,
                    "|-soft-timeout#0 "  // must be non-negative
                    "|-nloops#0 "        // arg must be non-negative
                    "|-nthreads#0-* "    // arg must be in [0, MAX_THREADS]
                    "|-nlocales#0 "      // arg must be non-negative
                    "|-locales= "        // arg must be provided
                    "|-shared-locale# ",
                    &opt_timeout,
                    &opt_nloops,
                    int (MAX_THREADS),
                    &opt_nthreads,
                    &opt_nlocales,
                    &rw_opt_setlocales,
                    &opt_shared_locale);
}
