Kaydet (Commit) 97354578 authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Remove the obsolete functionality originally underlying osl/diagnose.h

...before that got rebased onto sal/log.hxx.  That functionality is considered
an implementation detail, so it should be safe to remove it from the URE
interface.  As usual, aborting stubs are retained for SONAME stability.

Change-Id: If948b9714c26a3871e38dea4d4d5b5466d6ee258
üst 86088dda
...@@ -87,50 +87,6 @@ ...@@ -87,50 +87,6 @@
#define OSL_DEBUG_LEVEL 0 #define OSL_DEBUG_LEVEL 0
#endif #endif
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/*
Diagnostic support
*/
SAL_DLLPUBLIC void SAL_CALL osl_breakDebug(void);
SAL_DLLPUBLIC sal_Bool SAL_CALL osl_assertFailedLine(const sal_Char* pszFileName, sal_Int32 nLine, const sal_Char* pszMessage);
SAL_DLLPUBLIC void SAL_CALL osl_trace(const sal_Char* pszFormat, ...);
SAL_DLLPUBLIC sal_Int32 SAL_CALL osl_reportError(sal_uInt32 nType, const sal_Char* pszErrorMessage);
/*
For message delivery
*/
/** a message delivery function which receives a pre-formatted message string
*/
typedef void (SAL_CALL *pfunc_osl_printDebugMessage)( const sal_Char * pszMessage );
/** a message delivery function which receives detailed information about where the message was triggered
*/
typedef void (SAL_CALL *pfunc_osl_printDetailedDebugMessage)( const sal_Char * pszFileName, sal_Int32 nLine, const sal_Char* pszMessage );
/** sets a message delivery function
The function set here is ignored if a function for detailed message information
(pfunc_osl_printDetailedDebugMessage) has been set.
The given message handler must be able to cope with a null message.
*/
SAL_DLLPUBLIC pfunc_osl_printDebugMessage SAL_CALL osl_setDebugMessageFunc( pfunc_osl_printDebugMessage pNewFunc );
/** sets a delivery function for detailed message information.
The given message handler must be able to cope with a null message.
*/
SAL_DLLPUBLIC pfunc_osl_printDetailedDebugMessage SAL_CALL osl_setDetailedDebugMessageFunc( pfunc_osl_printDetailedDebugMessage pNewFunc );
#ifdef __cplusplus
}
#endif
#define OSL_THIS_FILE __FILE__ #define OSL_THIS_FILE __FILE__
/* the macro OSL_LOG_PREFIX is intended to be an office internal macro for now /* the macro OSL_LOG_PREFIX is intended to be an office internal macro for now
......
...@@ -88,7 +88,6 @@ $(eval $(call gb_Library_add_exception_objects,sal,\ ...@@ -88,7 +88,6 @@ $(eval $(call gb_Library_add_exception_objects,sal,\
sal/osl/all/debugbase \ sal/osl/all/debugbase \
sal/osl/all/loadmodulerelative \ sal/osl/all/loadmodulerelative \
sal/osl/all/log \ sal/osl/all/log \
sal/osl/all/trace \
sal/osl/all/utility \ sal/osl/all/utility \
sal/rtl/alloc_arena \ sal/rtl/alloc_arena \
sal/rtl/alloc_cache \ sal/rtl/alloc_cache \
...@@ -154,7 +153,6 @@ endif ...@@ -154,7 +153,6 @@ endif
ifneq ($(OS),WNT) ifneq ($(OS),WNT)
$(eval $(call gb_Library_add_exception_objects,sal,\ $(eval $(call gb_Library_add_exception_objects,sal,\
sal/osl/unx/conditn \ sal/osl/unx/conditn \
sal/osl/unx/diagnose \
sal/osl/unx/file \ sal/osl/unx/file \
sal/osl/unx/file_error_transl \ sal/osl/unx/file_error_transl \
sal/osl/unx/file_misc \ sal/osl/unx/file_misc \
...@@ -250,7 +248,6 @@ $(eval $(call gb_Library_add_exception_objects,sal,\ ...@@ -250,7 +248,6 @@ $(eval $(call gb_Library_add_exception_objects,sal,\
)) ))
$(eval $(call gb_Library_add_cobjects,sal,\ $(eval $(call gb_Library_add_cobjects,sal,\
sal/osl/w32/conditn \ sal/osl/w32/conditn \
sal/osl/w32/diagnose \
sal/osl/w32/dllentry \ sal/osl/w32/dllentry \
sal/osl/w32/file_error \ sal/osl/w32/file_error \
sal/osl/w32/interlck \ sal/osl/w32/interlck \
......
...@@ -23,6 +23,16 @@ SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL osl_acquireSemaphore(void *) { ...@@ -23,6 +23,16 @@ SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL osl_acquireSemaphore(void *) {
for (;;) { std::abort(); } // avoid "must return a value" warnings for (;;) { std::abort(); } // avoid "must return a value" warnings
} }
SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL osl_assertFailedLine(
char const *, sal_Int32, char const *)
{
for (;;) { std::abort(); } // avoid "must return a value" warnings
}
SAL_DLLPUBLIC_EXPORT void SAL_CALL osl_breakDebug() {
std::abort();
}
SAL_DLLPUBLIC_EXPORT void * SAL_CALL osl_createSemaphore(sal_uInt32) { SAL_DLLPUBLIC_EXPORT void * SAL_CALL osl_createSemaphore(sal_uInt32) {
for (;;) { std::abort(); } // avoid "must return a value" warnings for (;;) { std::abort(); } // avoid "must return a value" warnings
} }
...@@ -39,6 +49,33 @@ SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL osl_releaseSemaphore(void *) { ...@@ -39,6 +49,33 @@ SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL osl_releaseSemaphore(void *) {
for (;;) { std::abort(); } // avoid "must return a value" warnings for (;;) { std::abort(); } // avoid "must return a value" warnings
} }
SAL_DLLPUBLIC_EXPORT sal_Int32 SAL_CALL osl_reportError(
sal_uInt32, char const *)
{
for (;;) { std::abort(); } // avoid "must return a value" warnings
}
namespace {
typedef void (SAL_CALL * pfunc_osl_printDebugMessage)(char const *);
}
SAL_DLLPUBLIC_EXPORT pfunc_osl_printDebugMessage SAL_CALL
osl_setDebugMessageFunc(pfunc_osl_printDebugMessage) {
for (;;) { std::abort(); } // avoid "must return a value" warnings
}
namespace {
typedef void (SAL_CALL * pfunc_osl_printDetailedDebugMessage)(
char const *, sal_Int32, char const *);
}
SAL_DLLPUBLIC_EXPORT pfunc_osl_printDetailedDebugMessage SAL_CALL
osl_setDetailedDebugMessageFunc(pfunc_osl_printDetailedDebugMessage) {
for (;;) { std::abort(); } // avoid "must return a value" warnings
}
SAL_DLLPUBLIC_EXPORT void SAL_CALL osl_trace(char const *, ...) {
std::abort();
}
SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL osl_tryToAcquireSemaphore(void *) { SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL osl_tryToAcquireSemaphore(void *) {
for (;;) { std::abort(); } // avoid "must return a value" warnings for (;;) { std::abort(); } // avoid "must return a value" warnings
} }
......
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include "sal/config.h"
#include <cstdarg>
#include "osl/diagnose.h"
#include "sal/detail/log.h"
#include "sal/log.hxx"
#include "logformat.hxx"
void osl_trace(char const * pszFormat, ...) {
std::va_list args;
va_start(args, pszFormat);
osl::detail::logFormat(
SAL_DETAIL_LOG_LEVEL_INFO, "legacy.osl", SAL_WHERE, pszFormat, args);
va_end(args);
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
#include "osl/diagnose.h"
#include "system.h"
#ifndef HAVE_DLFCN_H
#if defined(LINUX) || defined(SOLARIS)
#define HAVE_DLFCN_H
#endif /* LINUX || SOLARIS */
#endif /* HAVE_DLFCN_H */
#ifdef HAVE_DLFCN_H
#ifndef INCLUDED_DLFCN_H
#include <dlfcn.h>
#define INCLUDED_DLFCN_H
#endif
#endif /* HAVE_DLFCN_H */
#include <pthread.h>
#include <stddef.h>
/************************************************************************/
/* Internal data structures and functions */
/************************************************************************/
static pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
typedef pfunc_osl_printDebugMessage oslDebugMessageFunc;
static oslDebugMessageFunc volatile g_pDebugMessageFunc = 0;
typedef pfunc_osl_printDetailedDebugMessage oslDetailedDebugMessageFunc;
static oslDetailedDebugMessageFunc volatile g_pDetailedDebugMessageFunc = 0;
static void osl_diagnose_backtrace_Impl (
oslDebugMessageFunc f);
#define OSL_DIAGNOSE_OUTPUTMESSAGE(f, s) \
((f != 0) ? (*(f))((s)) : (void)fprintf(stderr, "%s", (s)))
#if defined (LINUX) || defined (SOLARIS)
static void osl_diagnose_frame_Impl (
oslDebugMessageFunc f,
int depth,
void * pc)
{
const char *fname = 0, *sname = 0;
void *fbase = 0, *saddr = 0;
ptrdiff_t offset;
char szMessage[1024];
#ifdef INCLUDED_DLFCN_H
Dl_info dli;
if (dladdr (pc, &dli) != 0)
{
fname = dli.dli_fname;
fbase = dli.dli_fbase;
sname = dli.dli_sname;
saddr = dli.dli_saddr;
}
#endif /* INCLUDED_DLFCN_H */
if (saddr)
offset = (ptrdiff_t)(pc) - (ptrdiff_t)(saddr);
else if (fbase)
offset = (ptrdiff_t)(pc) - (ptrdiff_t)(fbase);
else
offset = (ptrdiff_t)(pc);
snprintf (szMessage, sizeof(szMessage),
"Backtrace: [%d] %s: %s+0x%" SAL_PRI_PTRDIFFT "x\n",
depth,
fname ? fname : "<unknown>",
sname ? sname : "???",
offset);
OSL_DIAGNOSE_OUTPUTMESSAGE(f, szMessage);
}
#endif
#if defined(LINUX)
#include <execinfo.h>
#define FRAME_COUNT 64
#define FRAME_OFFSET 1
static void osl_diagnose_backtrace_Impl (oslDebugMessageFunc f)
{
void * ppFrames[FRAME_COUNT];
int i, n;
n = backtrace (ppFrames, FRAME_COUNT);
for (i = FRAME_OFFSET; i < n; i++)
{
osl_diagnose_frame_Impl (f, (i - FRAME_OFFSET), ppFrames[i]);
}
}
#elif defined(SOLARIS)
#include <setjmp.h>
#include <sys/frame.h>
#if defined(SPARC)
#if defined IS_LP64
#define FRAME_PTR_OFFSET 1
#define FRAME_OFFSET 0
#define STACK_BIAS 0x7ff
#else
#define FRAME_PTR_OFFSET 1
#define FRAME_OFFSET 0
#define STACK_BIAS 0
#endif
#elif defined(INTEL)
#define FRAME_PTR_OFFSET 3
#define FRAME_OFFSET 0
#define STACK_BIAS 0
#endif /* (SPARC || INTEL) */
static void osl_diagnose_backtrace_Impl (oslDebugMessageFunc f)
{
jmp_buf ctx;
long fpval;
struct frame * fp;
int i;
#if defined(SPARC)
asm("ta 3");
#endif /* SPARC */
setjmp (ctx);
fpval = ((long*)(ctx))[FRAME_PTR_OFFSET];
fp = (struct frame*)((char*)(fpval) + STACK_BIAS);
for (i = 0; (i < FRAME_OFFSET) && (fp != 0); i++)
fp = (struct frame*)((char*)(fp->fr_savfp) + STACK_BIAS);
for (i = 0; (fp != 0) && (fp->fr_savpc != 0); i++)
{
struct frame * prev = (struct frame*)((char*)(fp->fr_savfp) + STACK_BIAS);
osl_diagnose_frame_Impl (f, i, (void*)(fp->fr_savpc));
fp = (prev > fp) ? prev : 0;
}
}
#else /* (LINUX || SOLARIS) */
static void osl_diagnose_backtrace_Impl (oslDebugMessageFunc f)
{
(void) f;
/* not yet implemented */
}
#endif /* (LINUX || SOLARIS) */
namespace {
// getenv is not thread safe, so minimize use of result:
bool isEnv(char const * name) {
char * p = getenv(name);
return p != NULL && *p != '\0';
}
}
sal_Bool SAL_CALL osl_assertFailedLine (
const sal_Char* pszFileName,
sal_Int32 nLine,
const sal_Char* pszMessage)
{
oslDebugMessageFunc f = g_pDebugMessageFunc;
char szMessage[1024];
// after reporting the assertion, abort if told so by SAL_DIAGNOSE_ABORT, but *not* if
// assertions are routed to some external instance
static bool envAbort = isEnv( "SAL_DIAGNOSE_ABORT" );
static bool envBacktrace = isEnv( "SAL_DIAGNOSE_BACKTRACE" );
bool const doAbort = envAbort && f == NULL;
/* If there's a callback for detailed messages, use it */
if ( g_pDetailedDebugMessageFunc != NULL )
{
g_pDetailedDebugMessageFunc( pszFileName, nLine, pszMessage );
return sal_False;
}
/* format message into buffer */
if (pszMessage != 0)
{
snprintf(szMessage, sizeof(szMessage),
"Error: File %s, Line %" SAL_PRIdINT32 ": %s\n",
pszFileName, nLine, pszMessage);
}
else
{
snprintf(szMessage, sizeof(szMessage),
"Error: File %s, Line %" SAL_PRIdINT32 "\n",
pszFileName, nLine);
}
/* acquire lock to serialize output message(s) */
pthread_mutex_lock(&g_mutex);
/* output message buffer */
OSL_DIAGNOSE_OUTPUTMESSAGE(f, szMessage);
/* should we output backtrace? */
if( envBacktrace )
osl_diagnose_backtrace_Impl(f);
/* release lock and leave */
pthread_mutex_unlock(&g_mutex);
return doAbort;
}
void SAL_CALL osl_breakDebug()
{
abort();
}
sal_Int32 SAL_CALL osl_reportError (
sal_uInt32 nType,
const sal_Char* pszMessage)
{
(void) nType; /* unused */
fputs(pszMessage, stderr);
return 0;
}
oslDebugMessageFunc SAL_CALL osl_setDebugMessageFunc (
oslDebugMessageFunc pNewFunc)
{
oslDebugMessageFunc pOldFunc = g_pDebugMessageFunc;
g_pDebugMessageFunc = pNewFunc;
return pOldFunc;
}
pfunc_osl_printDetailedDebugMessage SAL_CALL osl_setDetailedDebugMessageFunc (
pfunc_osl_printDetailedDebugMessage pNewFunc)
{
oslDetailedDebugMessageFunc pOldFunc = g_pDetailedDebugMessageFunc;
g_pDetailedDebugMessageFunc = pNewFunc;
return pOldFunc;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
#include "system.h"
#include <stdio.h>
#include <osl/diagnose.h>
static pfunc_osl_printDebugMessage _pPrintDebugMessage = NULL;
static pfunc_osl_printDetailedDebugMessage _pPrintDetailedDebugMessage = NULL;
pfunc_osl_printDebugMessage SAL_CALL osl_setDebugMessageFunc( pfunc_osl_printDebugMessage pNewFunc )
{
pfunc_osl_printDebugMessage pOldFunc = _pPrintDebugMessage;
_pPrintDebugMessage = pNewFunc;
return pOldFunc;
}
pfunc_osl_printDetailedDebugMessage SAL_CALL osl_setDetailedDebugMessageFunc( pfunc_osl_printDetailedDebugMessage pNewFunc )
{
pfunc_osl_printDetailedDebugMessage pOldFunc = _pPrintDetailedDebugMessage;
_pPrintDetailedDebugMessage = pNewFunc;
return pOldFunc;
}
/*
Trace output
*/
void SAL_CALL osl_breakDebug(void)
{
if ( IsDebuggerPresent() )
DebugBreak();
else
abort ();
}
sal_Bool SAL_CALL osl_assertFailedLine(const sal_Char* pszFileName, sal_Int32 nLine, const sal_Char* pszMessage)
{
char const * env = getenv( "SAL_DIAGNOSE_ABORT" );
#if defined(_DEBUG) && !defined(NO_DEBUG_CRT)
_CrtDbgReport(_CRT_ASSERT, pszFileName, nLine, NULL, pszMessage);
return ( ( env != NULL ) && ( *env != '\0' ) );
#else
HWND hWndParent;
UINT nFlags;
int nCode;
/* get app name or NULL if unknown (don't call assert) */
LPCSTR lpszAppName = "Error";
sal_Char szMessage[512];
/* format message into buffer */
szMessage[sizeof(szMessage)-1] = '\0'; /* zero terminate always */
_snprintf(szMessage, sizeof(szMessage)-1, "%s: File %hs, Line %d\n:%s\n",
lpszAppName, pszFileName, nLine, pszMessage);
OutputDebugString(szMessage);
if ( _pPrintDetailedDebugMessage )
_pPrintDetailedDebugMessage( pszFileName, nLine, pszMessage );
else if ( _pPrintDebugMessage )
_pPrintDebugMessage( szMessage );
else
{
if ( !getenv( "DISABLE_SAL_DBGBOX" ) )
{
TCHAR szBoxMessage[1024];
/* active popup window for the current thread */
hWndParent = GetActiveWindow();
if (hWndParent != NULL)
hWndParent = GetLastActivePopup(hWndParent);
/* set message box flags */
nFlags = MB_TASKMODAL | MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON2 | MB_SETFOREGROUND;
if (hWndParent == NULL)
nFlags |= MB_SERVICE_NOTIFICATION;
/* display the assert */
szBoxMessage[sizeof(szBoxMessage)-1] = 0;
_snprintf(szBoxMessage, sizeof(szBoxMessage)-1, "%s\n( Yes=Abort / No=Ignore / Cancel=Debugger )",
szMessage);
nCode = MessageBox(hWndParent, szBoxMessage, "Assertion Failed!", nFlags);
if (nCode == IDYES)
FatalExit(-1);
if (nCode == IDNO)
return sal_False; /* ignore */
if (nCode == IDCANCEL)
return sal_True; /* will cause oslDebugBreak */
}
else
{
fputs(szMessage, stderr); // fall back
}
return ( ( env != NULL ) && ( *env != '\0' ) );
}
return sal_False;
#endif /* _DEBUG && !NO_DEBUG_CRT */
}
sal_Int32 SAL_CALL osl_reportError(sal_uInt32 nType, const sal_Char* pszMessage)
{
UINT nFlags;
int nDisposition;
// active popup window for the current thread
HWND hWndParent = GetActiveWindow();
if (hWndParent != NULL)
hWndParent = GetLastActivePopup(hWndParent);
/* set message box flags */
nFlags = MB_TASKMODAL | MB_ICONERROR | MB_YESNOCANCEL | MB_DEFBUTTON2 | MB_SETFOREGROUND;
if (hWndParent == NULL)
nFlags |= MB_SERVICE_NOTIFICATION;
// display the assert
nDisposition = MessageBox(hWndParent, pszMessage, "Exception!", nFlags);
(void)nType; //unused, but part of public API/ABI
return nDisposition;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment