/*
 * Copyright 2002, Log4cpp Project. All rights reserved.
 *
 * See the COPYING file for the terms of usage and distribution.
 */

#include <cstdlib>
#include <log4cpp/threading/Threading.hh>

#if defined(LOG4CPP_HAVE_THREADING) && defined(LOG4CPP_USE_PTHREADS)

namespace log4cpp {
    namespace threading {

        std::string getThreadId() {
            char buffer[4 * sizeof(long)];
            int bufsize = sizeof(buffer) / sizeof(buffer[0]);
            int n = ::snprintf(buffer, bufsize, "%lu", pthread_self()); // thread id unsigned
            if (n >= bufsize) {
                // escape to heap allocation
                char* buff_alloc;
                int size = ::asprintf(&buff_alloc, "%lu", pthread_self()); // thread id unsigned
                if (size < 0) {
                    throw std::bad_alloc();
                }
                std::string res(buff_alloc);
                free(buff_alloc);
                return res;
            }
            return std::string(buffer);
        }

    } // namespace threading
} // namespace log4cpp

#endif // LOG4CPP_HAVE_THREADING && LOG4CPP_USE_PTHREADS
