- Fixed a double-fclose and memory leaks in zipdir.

- Fixed building of LZMA SDK on Linux with some help from p7zip.



SVN r1469 (trunk)
This commit is contained in:
Randy Heit 2009-03-10 23:56:47 +00:00
parent 75b7db858f
commit 1e57e07926
6 changed files with 268 additions and 13 deletions

View file

@ -4,6 +4,8 @@ Igor Pavlov
Public domain */ Public domain */
#include "Threads.h" #include "Threads.h"
#ifdef _WIN32
#include <process.h> #include <process.h>
static WRes GetError() static WRes GetError()
@ -111,3 +113,180 @@ WRes CriticalSection_Init(CCriticalSection *p)
return 0; return 0;
} }
#else
#include <pthread.h>
#include <stdlib.h>
#include <errno.h>
#if defined(__linux__)
#define PTHREAD_MUTEX_ERRORCHECK PTHREAD_MUTEX_ERRORCHECK_NP
#endif
WRes Thread_Create(CThread *thread, THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE *startAddress)(void *), void *parameter)
{
pthread_attr_t attr;
int ret;
thread->_created = 0;
ret = pthread_attr_init(&attr);
if (ret) return ret;
ret = pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
if (ret) return ret;
ret = pthread_create(&thread->_tid, &attr, (void * (*)(void *))startAddress, parameter);
/* ret2 = */ pthread_attr_destroy(&attr);
if (ret) return ret;
thread->_created = 1;
return 0; // SZ_OK;
}
WRes Thread_Wait(CThread *thread)
{
void *thread_return;
int ret;
if (thread->_created == 0)
return EINVAL;
ret = pthread_join(thread->_tid,&thread_return);
thread->_created = 0;
return ret;
}
WRes Thread_Close(CThread *thread)
{
if (!thread->_created) return SZ_OK;
pthread_detach(thread->_tid);
thread->_tid = 0;
thread->_created = 0;
return SZ_OK;
}
WRes Event_Create(CEvent *p, BOOL manualReset, int initialSignaled)
{
pthread_mutex_init(&p->_mutex,0);
pthread_cond_init(&p->_cond,0);
p->_manual_reset = manualReset;
p->_state = (initialSignaled ? TRUE : FALSE);
p->_created = 1;
return 0;
}
WRes Event_Set(CEvent *p) {
pthread_mutex_lock(&p->_mutex);
p->_state = TRUE;
pthread_cond_broadcast(&p->_cond);
pthread_mutex_unlock(&p->_mutex);
return 0;
}
WRes Event_Reset(CEvent *p) {
pthread_mutex_lock(&p->_mutex);
p->_state = FALSE;
pthread_mutex_unlock(&p->_mutex);
return 0;
}
WRes Event_Wait(CEvent *p) {
pthread_mutex_lock(&p->_mutex);
while (p->_state == FALSE)
{
pthread_cond_wait(&p->_cond, &p->_mutex);
}
if (p->_manual_reset == FALSE)
{
p->_state = FALSE;
}
pthread_mutex_unlock(&p->_mutex);
return 0;
}
WRes Event_Close(CEvent *p) {
if (p->_created)
{
p->_created = 0;
pthread_mutex_destroy(&p->_mutex);
pthread_cond_destroy(&p->_cond);
}
return 0;
}
WRes Semaphore_Create(CSemaphore *p, UInt32 initiallyCount, UInt32 maxCount)
{
pthread_mutex_init(&p->_mutex,0);
pthread_cond_init(&p->_cond,0);
p->_count = initiallyCount;
p->_maxCount = maxCount;
p->_created = 1;
return 0;
}
WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 releaseCount)
{
UInt32 newCount;
if (releaseCount < 1) return EINVAL;
pthread_mutex_lock(&p->_mutex);
newCount = p->_count + releaseCount;
if (newCount > p->_maxCount)
{
pthread_mutex_unlock(&p->_mutex);
return EINVAL;
}
p->_count = newCount;
pthread_cond_broadcast(&p->_cond);
pthread_mutex_unlock(&p->_mutex);
return 0;
}
WRes Semaphore_Wait(CSemaphore *p) {
pthread_mutex_lock(&p->_mutex);
while (p->_count < 1)
{
pthread_cond_wait(&p->_cond, &p->_mutex);
}
p->_count--;
pthread_mutex_unlock(&p->_mutex);
return 0;
}
WRes Semaphore_Close(CSemaphore *p) {
if (p->_created)
{
p->_created = 0;
pthread_mutex_destroy(&p->_mutex);
pthread_cond_destroy(&p->_cond);
}
return 0;
}
WRes CriticalSection_Init(CCriticalSection * lpCriticalSection)
{
return pthread_mutex_init(&(lpCriticalSection->_mutex),0);
}
WRes ManualResetEvent_Create(CManualResetEvent *p, int initialSignaled)
{ return Event_Create(p, TRUE, initialSignaled); }
WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p)
{ return ManualResetEvent_Create(p, 0); }
WRes AutoResetEvent_Create(CAutoResetEvent *p, int initialSignaled)
{ return Event_Create(p, FALSE, initialSignaled); }
WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p)
{ return AutoResetEvent_Create(p, 0); }
#endif

View file

@ -6,13 +6,7 @@
#ifdef _WIN32 #ifdef _WIN32
#include <windows.h> #include <windows.h>
#endif
#ifdef _WIN32
typedef DWORD WRes; typedef DWORD WRes;
#else
typedef int WRes;
#endif
#include "Types.h" #include "Types.h"
@ -74,5 +68,84 @@ WRes CriticalSection_Init(CCriticalSection *p);
#define CriticalSection_Enter(p) EnterCriticalSection(p) #define CriticalSection_Enter(p) EnterCriticalSection(p)
#define CriticalSection_Leave(p) LeaveCriticalSection(p) #define CriticalSection_Leave(p) LeaveCriticalSection(p)
#else
typedef int WRes;
#include "Types.h"
#include <pthread.h>
/* #define DEBUG_SYNCHRO 1 */
typedef struct _CThread
{
pthread_t _tid;
int _created;
} CThread;
#define Thread_Construct(thread) (thread)->_created = 0
#define Thread_WasCreated(thread) ((thread)->_created != 0)
typedef unsigned THREAD_FUNC_RET_TYPE;
#define THREAD_FUNC_CALL_TYPE
#define THREAD_FUNC_DECL THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE
WRes Thread_Create(CThread *thread, THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE *startAddress)(void *), void *parameter);
WRes Thread_Wait(CThread *thread);
WRes Thread_Close(CThread *thread);
typedef struct _CEvent
{
int _created;
int _manual_reset;
int _state;
pthread_mutex_t _mutex;
pthread_cond_t _cond;
} CEvent;
typedef CEvent CAutoResetEvent;
typedef CEvent CManualResetEvent;
#define Event_Construct(event) (event)->_created = 0
#define Event_IsCreated(event) ((event)->_created)
WRes ManualResetEvent_Create(CManualResetEvent *event, int initialSignaled);
WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *event);
WRes AutoResetEvent_Create(CAutoResetEvent *event, int initialSignaled);
WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *event);
WRes Event_Set(CEvent *event);
WRes Event_Reset(CEvent *event);
WRes Event_Wait(CEvent *event);
WRes Event_Close(CEvent *event);
typedef struct _CSemaphore
{
int _created;
UInt32 _count;
UInt32 _maxCount;
pthread_mutex_t _mutex;
pthread_cond_t _cond;
} CSemaphore;
#define Semaphore_Construct(p) (p)->_created = 0
WRes Semaphore_Create(CSemaphore *p, UInt32 initiallyCount, UInt32 maxCount);
WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num);
#define Semaphore_Release1(p) Semaphore_ReleaseN(p, 1)
WRes Semaphore_Wait(CSemaphore *p);
WRes Semaphore_Close(CSemaphore *p);
typedef struct {
pthread_mutex_t _mutex;
} CCriticalSection;
WRes CriticalSection_Init(CCriticalSection *p);
#define CriticalSection_Delete(p) pthread_mutex_destroy(&((p)->_mutex))
#define CriticalSection_Enter(p) pthread_mutex_lock(&((p)->_mutex))
#define CriticalSection_Leave(p) pthread_mutex_unlock(&((p)->_mutex))
#endif
#endif #endif

View file

@ -378,7 +378,7 @@ FileReaderLZMA::FileReaderLZMA (FileReader &file, size_t uncompressed_size, bool
OutProcessed = 0; OutProcessed = 0;
// Read zip LZMA properties header // Read zip LZMA properties header
if (File.Read(header, sizeof(header)) < sizeof(header)) if (File.Read(header, sizeof(header)) < (long)sizeof(header))
{ {
I_Error("FileReaderLZMA: File too shart\n"); I_Error("FileReaderLZMA: File too shart\n");
} }

View file

@ -1300,7 +1300,7 @@ void FWeaponSlots::AddSlot(int slot, const PClass *type, bool feedback)
{ {
if (type != NULL && !Slots[slot].AddWeapon(type) && feedback) if (type != NULL && !Slots[slot].AddWeapon(type) && feedback)
{ {
Printf ("Could not add %s to slot %zu\n", type->TypeName.GetChars(), slot); Printf ("Could not add %s to slot %d\n", type->TypeName.GetChars(), slot);
} }
} }

View file

@ -632,7 +632,11 @@ file_sorted_t *sort_files(dir_tree_t *trees, int num_files)
void write_zip(const char *zipname, dir_tree_t *trees, int update) void write_zip(const char *zipname, dir_tree_t *trees, int update)
{ {
#ifdef _WIN32
char tempname[_MAX_PATH]; char tempname[_MAX_PATH];
#else
char tempname[PATH_MAX];
#endif
EndOfCentralDirectory dirend; EndOfCentralDirectory dirend;
int i, num_files; int i, num_files;
file_sorted_t *sorted; file_sorted_t *sorted;
@ -730,10 +734,6 @@ void write_zip(const char *zipname, dir_tree_t *trees, int update)
tempname, zipname, strerror(errno)); tempname, zipname, strerror(errno));
} }
} }
else
{
fclose(zip);
}
} }
} }
free(sorted); free(sorted);
@ -838,10 +838,12 @@ int append_to_zip(FILE *zip_file, file_sorted_t *filep, FILE *ozip, BYTE *odir)
i = copy_zip_file(zip_file, file, ozip, dirent); i = copy_zip_file(zip_file, file, ozip, dirent);
if (i > 0) if (i > 0)
{ {
free(readbuf);
return 0; return 0;
} }
if (i < 0) if (i < 0)
{ {
free(readbuf);
fprintf(stderr, "Unable to write %s to zip\n", file->path); fprintf(stderr, "Unable to write %s to zip\n", file->path);
return 1; return 1;
} }
@ -1426,6 +1428,7 @@ int copy_zip_file(FILE *zip, file_entry_t *file, FILE *ozip, CentralDirectoryEnt
free(buf); free(buf);
return -1; return -1;
} }
free(buf);
file->date = lfh.ModDate; file->date = lfh.ModDate;
file->time = lfh.ModTime; file->time = lfh.ModTime;
file->uncompressed_size = LittleLong(lfh.UncompressedSize); file->uncompressed_size = LittleLong(lfh.UncompressedSize);

View file

@ -6,7 +6,7 @@ add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated/dehsupp.lmp
DEPENDS dehsupp ${CMAKE_CURRENT_SOURCE_DIR}/sources/dehsupp.txt ) DEPENDS dehsupp ${CMAKE_CURRENT_SOURCE_DIR}/sources/dehsupp.txt )
add_custom_command( OUTPUT ${ZDOOM_OUTPUT_DIR}/zdoom.pk3 add_custom_command( OUTPUT ${ZDOOM_OUTPUT_DIR}/zdoom.pk3
COMMAND ${CMAKE_BINARY_DIR}/tools/zipdir/zipdir -u ${ZDOOM_OUTPUT_DIR}/zdoom.pk3 ${CMAKE_CURRENT_SOURCE_DIR}/static ${CMAKE_CURRENT_BINARY_DIR}/generated COMMAND ${CMAKE_BINARY_DIR}/tools/zipdir/zipdir -uf ${ZDOOM_OUTPUT_DIR}/zdoom.pk3 ${CMAKE_CURRENT_SOURCE_DIR}/static ${CMAKE_CURRENT_BINARY_DIR}/generated
DEPENDS zipdir ${CMAKE_CURRENT_BINARY_DIR}/generated/dehsupp.lmp ${CMAKE_CURRENT_SOURCE_DIR}/static ) DEPENDS zipdir ${CMAKE_CURRENT_BINARY_DIR}/generated/dehsupp.lmp ${CMAKE_CURRENT_SOURCE_DIR}/static )
add_custom_target( pk3 ALL add_custom_target( pk3 ALL