1 - Ported some of IPV6 code to 1.6.7.
2 - Backport of svn revision 527: * Added API to ithread, created the following functions: - int ithread_initialize_library(void); - int ithread_cleanup_library(void); - int ithread_initialize_thread(void); - int ithread_cleanup_thread(void); * SF Bug Tracker [ 2876374 ] Access Violation when compiling with Visual Studio 2008 Submitted: Stulle ( stulleamgym ) - 2009-10-10 19:05 Hi, I am one of the devs of the MorphXT project and I use this lib in some other of my projects, too. When I tried to upgrade the lib earlier for one of my projects I had to realise that something did not work at first and while most of the things were reasonably ease to be fixed. Now, the last thing I encountered was not so easy to fix and I am uncertain if my fix is any good so I'll just post it here and wait for some comments. The problem was that I got an Access Violation when calling "UpnpInit". It would call "ithread_rwlock_init(&GlobalHndRWLock, NULL)" which eventually led to calling "pthread_cond_init" and I got the error notice at "EnterCriticalSection (&ptw32_cond_list_lock);". It appeared that "ptw32_cond_list_lock" was NULL. Now, I found two ways to fix this. Firstly moving the whole block after at least one of the "ThreadPoolInit" calls will fix the issue. Secondly, you could add: #ifdef WIN32 #ifdef PTW32_STATIC_LIB // to get the following working we need this... is it a good patch or not... I do not know! pthread_win32_process_attach_np(); #endif #endif right before "ithread_rwlock_init(&GlobalHndRWLock, NULL)". Just so you know, I am using libupnp 1.6.6 and libpthreads 2.8.0 and both are linked static into the binaries. I am currently using Visual Studio 2008 for development with Windows being the target OS. Any comment at your end? Regards, Stulle git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.6.x@529 119443c7-1b9e-41f8-b6fc-b9c35fce742c
This commit is contained in:
@@ -7,12 +7,12 @@
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice,
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* * Neither name of Intel Corporation nor the names of its contributors
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
@@ -33,25 +33,34 @@
|
||||
#ifndef UPNP_DEBUG_H
|
||||
#define UPNP_DEBUG_H
|
||||
|
||||
#include "upnp.h"
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#include "ThreadPool.h"
|
||||
#include "upnpconfig.h"
|
||||
#include "UpnpGlobal.h" /* for UPNP_INLINE */
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/** @name Other debugging features
|
||||
The UPnP SDK contains other features to aid in debugging.
|
||||
/** \name Other debugging features
|
||||
*
|
||||
* The UPnP SDK contains other features to aid in debugging.
|
||||
*/
|
||||
/*@{*/
|
||||
|
||||
/*! @{ */
|
||||
|
||||
/** @name Upnp_LogLevel
|
||||
/** \name Upnp_LogLevel
|
||||
* The user has the option to select 4 different types of debugging levels,
|
||||
* see {\tt UpnpSetLogLevel}.
|
||||
* see \c UpnpSetLogLevel.
|
||||
* The critical level will show only those messages
|
||||
* which can halt the normal processing of the library, like memory
|
||||
* allocation errors. The remaining three levels are just for debugging
|
||||
@@ -60,14 +69,11 @@ extern "C" {
|
||||
* Info Level displays the other important operational information
|
||||
* regarding the working of the library. If the user selects All,
|
||||
* then the library displays all the debugging information that it has.
|
||||
* \begin{itemize}
|
||||
* \item {\tt UPNP_CRITICAL [0]}
|
||||
* \item {\tt UPNP_PACKET [1]}
|
||||
* \item {\tt UPNP_INFO [2]}
|
||||
* \item {\tt UPNP_ALL [3]}
|
||||
* \end{itemize}
|
||||
* \li \c UPNP_CRITICAL [0]
|
||||
* \li \c UPNP_PACKET [1]
|
||||
* \li \c UPNP_INFO [2]
|
||||
* \li \c UPNP_ALL [3]
|
||||
*/
|
||||
|
||||
typedef enum Upnp_Module {
|
||||
SSDP,
|
||||
SOAP,
|
||||
@@ -79,67 +85,54 @@ typedef enum Upnp_Module {
|
||||
HTTP
|
||||
} Dbg_Module;
|
||||
|
||||
/*! @{ */
|
||||
|
||||
/*@{*/
|
||||
typedef enum Upnp_LogLevel_e {
|
||||
UPNP_CRITICAL,
|
||||
UPNP_PACKET,
|
||||
UPNP_INFO,
|
||||
UPNP_ALL
|
||||
} Upnp_LogLevel;
|
||||
/*! @} */
|
||||
/*@}*/
|
||||
|
||||
|
||||
/**
|
||||
* Default log level : see {\tt Upnp_LogLevel}
|
||||
* Default log level : see \c Upnp_LogLevel
|
||||
*/
|
||||
#define UPNP_DEFAULT_LOG_LEVEL UPNP_ALL
|
||||
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Function : UpnpInitLog
|
||||
/*!
|
||||
* \brief Initialize the log files.
|
||||
*
|
||||
* Parameters: void
|
||||
*
|
||||
* Description:
|
||||
* This functions initializes the log files
|
||||
*
|
||||
* Returns: int
|
||||
* -1 : If fails
|
||||
* UPNP_E_SUCCESS : if success
|
||||
***************************************************************************/
|
||||
* \return -1 if fails or UPNP_E_SUCCESS if succeeds.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
int UpnpInitLog(void);
|
||||
#else
|
||||
static UPNP_INLINE int UpnpInitLog(void) { return UPNP_E_SUCCESS; }
|
||||
static UPNP_INLINE int UpnpInitLog(void)
|
||||
{
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Function : UpnpSetLogLevel
|
||||
*
|
||||
* Parameters: Upnp_LogLevel log_level
|
||||
*
|
||||
* Description:
|
||||
* This functions set the log level (see {\tt Upnp_LogLevel}
|
||||
* Returns: void
|
||||
***************************************************************************/
|
||||
/*!
|
||||
* \brief Set the log level (see \c Upnp_LogLevel).
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
void UpnpSetLogLevel(Upnp_LogLevel log_level);
|
||||
void UpnpSetLogLevel(
|
||||
/*! [in] Log level. */
|
||||
Upnp_LogLevel log_level);
|
||||
#else
|
||||
static UPNP_INLINE void UpnpSetLogLevel(Upnp_LogLevel log_level) {}
|
||||
#endif
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Function : UpnpCloseLog
|
||||
*
|
||||
* Parameters: void
|
||||
*
|
||||
* Description:
|
||||
* This functions closes the log files
|
||||
* Returns: void
|
||||
***************************************************************************/
|
||||
/*!
|
||||
* \brief Closes the log files.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
void UpnpCloseLog(void);
|
||||
#else
|
||||
@@ -147,23 +140,14 @@ static UPNP_INLINE void UpnpCloseLog(void) {}
|
||||
#endif
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Function : UpnpSetLogFileNames
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char* ErrFileName: name of the error file
|
||||
* IN const char *InfoFileName: name of the information file
|
||||
* IN int size: Size of the buffer
|
||||
* IN int starLength: This parameter provides the width of the banner
|
||||
*
|
||||
* Description:
|
||||
* This functions takes the buffer and writes the buffer in the file as
|
||||
* per the requested banner
|
||||
* Returns: void
|
||||
***************************************************************************/
|
||||
/*!
|
||||
* \brief Set the name for error and information files, respectively.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
void UpnpSetLogFileNames(
|
||||
/*! [in] Name of the error file. */
|
||||
const char *ErrFileName,
|
||||
/*! [in] Name of the information file. */
|
||||
const char *InfoFileName);
|
||||
#else
|
||||
static UPNP_INLINE void UpnpSetLogFileNames(
|
||||
@@ -172,24 +156,20 @@ static UPNP_INLINE void UpnpSetLogFileNames(
|
||||
#endif
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Function : UpnpGetDebugFile
|
||||
*
|
||||
* Parameters:
|
||||
* IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide
|
||||
* whether debug statement will go to standard output,
|
||||
* or any of the log files.
|
||||
* IN Dbg_Module Module: debug will go in the name of this module
|
||||
*
|
||||
* Description:
|
||||
* This function checks if the module is turned on for debug
|
||||
* and returns the file descriptor corresponding to the debug level
|
||||
* Returns: FILE *
|
||||
* NULL : if the module is turn off for debug
|
||||
* else returns the right file descriptor
|
||||
***************************************************************************/
|
||||
/*!
|
||||
* \brief Check if the module is turned on for debug and returns the file
|
||||
* descriptor corresponding to the debug level
|
||||
*
|
||||
* \return NULL if the module is turn off for debug otheriwse returns the
|
||||
* right file descriptor.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
FILE *UpnpGetDebugFile(Upnp_LogLevel level, Dbg_Module module);
|
||||
FILE *UpnpGetDebugFile(
|
||||
/*! [in] The level of the debug logging. It will decide whether debug
|
||||
* statement will go to standard output, or any of the log files. */
|
||||
Upnp_LogLevel level,
|
||||
/*! [in] debug will go in the name of this module. */
|
||||
Dbg_Module module);
|
||||
#else
|
||||
static UPNP_INLINE FILE *UpnpGetDebugFile(Upnp_LogLevel level, Dbg_Module module)
|
||||
{
|
||||
@@ -198,60 +178,47 @@ static UPNP_INLINE FILE *UpnpGetDebugFile(Upnp_LogLevel level, Dbg_Module module
|
||||
#endif
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Function : DebugAtThisLevel
|
||||
*
|
||||
* Parameters:
|
||||
* IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide
|
||||
* whether debug statement will go to standard output,
|
||||
* or any of the log files.
|
||||
* IN Dbg_Module Module: debug will go in the name of this module
|
||||
*
|
||||
* Description:
|
||||
* This functions returns true if debug output should be done in this
|
||||
* module.
|
||||
/*!
|
||||
* \brief Returns true if debug output should be done in this module.
|
||||
*
|
||||
* Returns: int
|
||||
***************************************************************************/
|
||||
* \return Nonzero value if true, zero if false.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
int DebugAtThisLevel(
|
||||
IN Upnp_LogLevel DLevel,
|
||||
IN Dbg_Module Module);
|
||||
/*! [in] The level of the debug logging. It will decide whether debug
|
||||
* statement will go to standard output, or any of the log files. */
|
||||
Upnp_LogLevel DLevel,
|
||||
/*! [in] Debug will go in the name of this module. */
|
||||
Dbg_Module Module);
|
||||
#else
|
||||
static UPNP_INLINE int DebugAtThisLevel(
|
||||
IN Upnp_LogLevel DLevel,
|
||||
IN Dbg_Module Module) { return 0; }
|
||||
Upnp_LogLevel DLevel,
|
||||
Dbg_Module Module)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Function : UpnpPrintf
|
||||
*
|
||||
* Parameters:
|
||||
* IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide
|
||||
* whether debug statement will go to standard output,
|
||||
* or any of the log files.
|
||||
* IN Dbg_Module Module: debug will go in the name of this module
|
||||
* IN char *DbgFileName: Name of the file from where debug statement is
|
||||
* coming
|
||||
* IN int DbgLineNo : Line number of the file from where debug statement
|
||||
* is coming
|
||||
* IN char * FmtStr, ...: Variable number of arguments that will go
|
||||
* in the debug statement
|
||||
*
|
||||
* Description:
|
||||
* This functions prints the debug statement either on the startdard
|
||||
* output or log file along with the information from where this
|
||||
* debug statement is coming
|
||||
* Returns: void
|
||||
***************************************************************************/
|
||||
/*!
|
||||
* \brief Prints the debug statement either on the standard output or log file
|
||||
* along with the information from where this debug statement is coming.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
void UpnpPrintf(
|
||||
/*! [in] The level of the debug logging. It will decide whether debug
|
||||
* statement will go to standard output, or any of the log files. */
|
||||
Upnp_LogLevel DLevel,
|
||||
/*! [in] debug will go in the name of this module. */
|
||||
Dbg_Module Module,
|
||||
/*! [in] Name of the file from where debug statement is coming. */
|
||||
const char* DbgFileName,
|
||||
/*! [in] Line number of the file from where debug statement is coming. */
|
||||
int DbgLineNo,
|
||||
/*! [in] Printf like format specification. */
|
||||
const char* FmtStr,
|
||||
/*! [in] Printf like Variable number of arguments that will go in the debug
|
||||
* statement. */
|
||||
...)
|
||||
#if (__GNUC__ >= 3)
|
||||
/* This enables printf like format checking by the compiler */
|
||||
@@ -265,29 +232,44 @@ static UPNP_INLINE void UpnpPrintf(
|
||||
const char* DbgFileName,
|
||||
int DbgLineNo,
|
||||
const char* FmtStr,
|
||||
...) {}
|
||||
...)
|
||||
{
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Function : UpnpDisplayBanner
|
||||
*
|
||||
* Parameters:
|
||||
* IN FILE *fd: file descriptor where the banner will be written
|
||||
* IN char **lines: The buffer that will be written
|
||||
* IN int size: Size of the buffer
|
||||
* IN int starLength: This parameter provides the width of the banner
|
||||
*
|
||||
* Description:
|
||||
* This functions takes the buffer and writes the buffer in the file as
|
||||
* per the requested banner
|
||||
* Returns: void
|
||||
***************************************************************************/
|
||||
/*!
|
||||
* \brief Writes the file name and file number from where debug statement is
|
||||
* coming to the log file.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
void UpnpDisplayFileAndLine(
|
||||
/*! [in] File descriptor where line number and file name will be written. */
|
||||
FILE *fd,
|
||||
/*! [in] Name of the file. */
|
||||
const char *DbgFileName,
|
||||
/*! [in] Line number of the file. */
|
||||
int DbgLineNo);
|
||||
#else
|
||||
static UPNP_INLINE void UpnpDisplayFileAndLine(
|
||||
FILE *fd,
|
||||
const char *DbgFileName,
|
||||
int DbgLineNo) {}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Writes the buffer in the file as per the requested banner
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
void UpnpDisplayBanner(
|
||||
/*! [in] file descriptor where the banner will be written. */
|
||||
FILE *fd,
|
||||
/*! [in] The buffer that will be written. */
|
||||
const char **lines,
|
||||
/*! [in] Size of the buffer. */
|
||||
size_t size,
|
||||
/*! [in] This parameter provides the width of the banner. */
|
||||
int starlength);
|
||||
#else
|
||||
static UPNP_INLINE void UpnpDisplayBanner(
|
||||
@@ -298,33 +280,49 @@ static UPNP_INLINE void UpnpDisplayBanner(
|
||||
#endif
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Function : UpnpDisplayFileAndLine
|
||||
*
|
||||
* Parameters:
|
||||
* IN FILE *fd: File descriptor where line number and file name will be
|
||||
* written
|
||||
* IN char *DbgFileName: Name of the file
|
||||
* IN int DbgLineNo : Line number of the file
|
||||
*
|
||||
* Description:
|
||||
* This function writes the file name and file number from where
|
||||
* debug statement is coming to the log file
|
||||
* Returns: void
|
||||
***************************************************************************/
|
||||
/*!
|
||||
* \brief Prints thread pool statistics.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
void UpnpDisplayFileAndLine(
|
||||
FILE *fd,
|
||||
void PrintThreadPoolStats(
|
||||
/*! [in] The thread pool. */
|
||||
ThreadPool *tp,
|
||||
/*! [in] The file name that called this function, use the macro __FILE__. */
|
||||
const char *DbgFileName,
|
||||
int DbgLineNo);
|
||||
/*! [in] The line number that the function was called, use the macro __LINE__. */
|
||||
int DbgLineNo,
|
||||
/*! [in] The message. */
|
||||
const char *msg);
|
||||
#else
|
||||
static UPNP_INLINE void UpnpDisplayFileAndLine(
|
||||
FILE *fd,
|
||||
static UPNP_INLINE void PrintThreadPoolStats(
|
||||
ThreadPool *tp,
|
||||
const char *DbgFileName,
|
||||
int DbgLineNo) {}
|
||||
int DbgLineNo,
|
||||
const char *msg)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
/*! @} */
|
||||
|
||||
/*!
|
||||
* \brief Print the node names and values of a XML tree.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
void printNodes(
|
||||
/*! [in] The root of the tree to print. */
|
||||
IXML_Node *tmpRoot,
|
||||
/*! [in] The depth to print. */
|
||||
int depth);
|
||||
#else
|
||||
static UPNP_INLINE void printNodes(
|
||||
IXML_Node *tmpRoot,
|
||||
int depth)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
Reference in New Issue
Block a user