reorganized strjoin and related functions
added qse_thr_t
This commit is contained in:
@ -15,6 +15,7 @@ noinst_HEADERS = \
|
||||
fs.h \
|
||||
glob.h \
|
||||
mem.h \
|
||||
str-cat.h \
|
||||
str-dyn.h \
|
||||
str-fcpy.h \
|
||||
str-fmt.h \
|
||||
|
@ -458,6 +458,7 @@ noinst_HEADERS = \
|
||||
fs.h \
|
||||
glob.h \
|
||||
mem.h \
|
||||
str-cat.h \
|
||||
str-dyn.h \
|
||||
str-fcpy.h \
|
||||
str-fmt.h \
|
||||
|
@ -26,162 +26,42 @@
|
||||
|
||||
#include <qse/cmn/str.h>
|
||||
|
||||
qse_size_t qse_mbscat (qse_mchar_t* buf, const qse_mchar_t* str)
|
||||
{
|
||||
qse_mchar_t* org = buf;
|
||||
buf += qse_mbslen(buf);
|
||||
while ((*buf++ = *str++) != QSE_MT('\0'));
|
||||
return buf - org - 1;
|
||||
}
|
||||
#undef T
|
||||
#undef char_t
|
||||
#undef strcat
|
||||
#undef strncat
|
||||
#undef strcatn
|
||||
#undef strxcat
|
||||
#undef strxncat
|
||||
#undef strlen
|
||||
|
||||
qse_size_t qse_mbsncat (qse_mchar_t* buf, const qse_mchar_t* str, qse_size_t len)
|
||||
{
|
||||
qse_size_t x;
|
||||
const qse_mchar_t* end = str + len;
|
||||
#define T(x) QSE_MT(x)
|
||||
#define char_t qse_mchar_t
|
||||
#define strcat qse_mbscat
|
||||
#define strncat qse_mbsncat
|
||||
#define strcatn qse_mbscatn
|
||||
#define strxcat qse_mbsxcat
|
||||
#define strxncat qse_mbsxncat
|
||||
#define strlen qse_mbslen
|
||||
#include "str-cat.h"
|
||||
|
||||
x = qse_mbslen(buf); buf += x;
|
||||
while (str < end) *buf++ = *str++;
|
||||
*buf = QSE_MT('\0');
|
||||
return len + x;
|
||||
}
|
||||
/* ----------------------------------- */
|
||||
|
||||
qse_size_t qse_mbscatn (qse_mchar_t* buf, const qse_mchar_t* str, qse_size_t n)
|
||||
{
|
||||
qse_size_t x;
|
||||
qse_mchar_t* org = buf;
|
||||
const qse_mchar_t* end = str + n;
|
||||
|
||||
x = qse_mbslen(buf); buf += x;
|
||||
while (str < end)
|
||||
{
|
||||
if ((*buf++ = *str++) == QSE_MT('\0')) return buf - org - 1;
|
||||
}
|
||||
return n + x;
|
||||
}
|
||||
|
||||
|
||||
qse_size_t qse_mbsxcat (qse_mchar_t* buf, qse_size_t bsz, const qse_mchar_t* str)
|
||||
{
|
||||
qse_mchar_t* p, * p2;
|
||||
qse_size_t blen;
|
||||
|
||||
blen = qse_mbslen(buf);
|
||||
if (blen >= bsz) return blen; /* something wrong */
|
||||
|
||||
p = buf + blen;
|
||||
p2 = buf + bsz - 1;
|
||||
|
||||
while (p < p2)
|
||||
{
|
||||
if (*str == QSE_MT('\0')) break;
|
||||
*p++ = *str++;
|
||||
}
|
||||
|
||||
if (bsz > 0) *p = QSE_MT('\0');
|
||||
return p - buf;
|
||||
}
|
||||
|
||||
qse_size_t qse_mbsxncat (
|
||||
qse_mchar_t* buf, qse_size_t bsz, const qse_mchar_t* str, qse_size_t len)
|
||||
{
|
||||
qse_mchar_t* p, * p2;
|
||||
const qse_mchar_t* end;
|
||||
qse_size_t blen;
|
||||
|
||||
blen = qse_mbslen(buf);
|
||||
if (blen >= bsz) return blen; /* something wrong */
|
||||
|
||||
p = buf + blen;
|
||||
p2 = buf + bsz - 1;
|
||||
|
||||
end = str + len;
|
||||
|
||||
while (p < p2)
|
||||
{
|
||||
if (str >= end) break;
|
||||
*p++ = *str++;
|
||||
}
|
||||
|
||||
if (bsz > 0) *p = QSE_MT('\0');
|
||||
return p - buf;
|
||||
}
|
||||
|
||||
qse_size_t qse_wcscat (qse_wchar_t* buf, const qse_wchar_t* str)
|
||||
{
|
||||
qse_wchar_t* org = buf;
|
||||
buf += qse_wcslen(buf);
|
||||
while ((*buf++ = *str++) != QSE_WT('\0'));
|
||||
return buf - org - 1;
|
||||
}
|
||||
|
||||
qse_size_t qse_wcsncat (qse_wchar_t* buf, const qse_wchar_t* str, qse_size_t len)
|
||||
{
|
||||
qse_size_t x;
|
||||
const qse_wchar_t* end = str + len;
|
||||
|
||||
x = qse_wcslen(buf); buf += x;
|
||||
while (str < end) *buf++ = *str++;
|
||||
*buf = QSE_WT('\0');
|
||||
return len + x;
|
||||
}
|
||||
|
||||
qse_size_t qse_wcscatn (qse_wchar_t* buf, const qse_wchar_t* str, qse_size_t n)
|
||||
{
|
||||
qse_size_t x;
|
||||
qse_wchar_t* org = buf;
|
||||
const qse_wchar_t* end = str + n;
|
||||
|
||||
x = qse_wcslen(buf); buf += x;
|
||||
while (str < end)
|
||||
{
|
||||
if ((*buf++ = *str++) == QSE_WT('\0')) return buf - org - 1;
|
||||
}
|
||||
return n + x;
|
||||
}
|
||||
|
||||
qse_size_t qse_wcsxcat (qse_wchar_t* buf, qse_size_t bsz, const qse_wchar_t* str)
|
||||
{
|
||||
qse_wchar_t* p, * p2;
|
||||
qse_size_t blen;
|
||||
|
||||
blen = qse_wcslen(buf);
|
||||
if (blen >= bsz) return blen; /* something wrong */
|
||||
|
||||
p = buf + blen;
|
||||
p2 = buf + bsz - 1;
|
||||
|
||||
while (p < p2)
|
||||
{
|
||||
if (*str == QSE_WT('\0')) break;
|
||||
*p++ = *str++;
|
||||
}
|
||||
|
||||
if (bsz > 0) *p = QSE_WT('\0');
|
||||
return p - buf;
|
||||
}
|
||||
|
||||
qse_size_t qse_wcsxncat (
|
||||
qse_wchar_t* buf, qse_size_t bsz, const qse_wchar_t* str, qse_size_t len)
|
||||
{
|
||||
qse_wchar_t* p, * p2;
|
||||
const qse_wchar_t* end;
|
||||
qse_size_t blen;
|
||||
|
||||
blen = qse_wcslen(buf);
|
||||
if (blen >= bsz) return blen; /* something wrong */
|
||||
|
||||
p = buf + blen;
|
||||
p2 = buf + bsz - 1;
|
||||
|
||||
end = str + len;
|
||||
|
||||
while (p < p2)
|
||||
{
|
||||
if (str >= end) break;
|
||||
*p++ = *str++;
|
||||
}
|
||||
|
||||
if (bsz > 0) *p = QSE_WT('\0');
|
||||
return p - buf;
|
||||
}
|
||||
#undef T
|
||||
#undef char_t
|
||||
#undef strcat
|
||||
#undef strncat
|
||||
#undef strcatn
|
||||
#undef strxcat
|
||||
#undef strxncat
|
||||
#undef strlen
|
||||
|
||||
#define T(x) QSE_WT(x)
|
||||
#define char_t qse_wchar_t
|
||||
#define strcat qse_wcscat
|
||||
#define strncat qse_wcsncat
|
||||
#define strcatn qse_wcscatn
|
||||
#define strxcat qse_wcsxcat
|
||||
#define strxncat qse_wcsxncat
|
||||
#define strlen qse_wcslen
|
||||
#include "str-cat.h"
|
||||
|
109
qse/lib/cmn/str-cat.h
Normal file
109
qse/lib/cmn/str-cat.h
Normal file
@ -0,0 +1,109 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
Copyright (c) 2006-2014 Chung, Hyung-Hwan. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#if !defined(char_t) && !defined(strcat) && !defined(strxcat)
|
||||
# error Never include this file
|
||||
#endif
|
||||
|
||||
qse_size_t strcat (char_t* buf, const char_t* str)
|
||||
{
|
||||
char_t* org = buf;
|
||||
buf += strlen(buf);
|
||||
while ((*buf++ = *str++) != T('\0'));
|
||||
return buf - org - 1;
|
||||
}
|
||||
|
||||
qse_size_t strncat (char_t* buf, const char_t* str, qse_size_t len)
|
||||
{
|
||||
qse_size_t x;
|
||||
const char_t* end = str + len;
|
||||
|
||||
x = strlen(buf); buf += x;
|
||||
while (str < end) *buf++ = *str++;
|
||||
*buf = T('\0');
|
||||
return len + x;
|
||||
}
|
||||
|
||||
qse_size_t strcatn (char_t* buf, const char_t* str, qse_size_t n)
|
||||
{
|
||||
qse_size_t x;
|
||||
char_t* org = buf;
|
||||
const char_t* end = str + n;
|
||||
|
||||
x = strlen(buf); buf += x;
|
||||
while (str < end)
|
||||
{
|
||||
/* copies not more than n characters and stop if '\0' is met */
|
||||
if ((*buf++ = *str++) == T('\0')) return buf - org - 1;
|
||||
}
|
||||
return n + x;
|
||||
}
|
||||
|
||||
qse_size_t strxcat (char_t* buf, qse_size_t bsz, const char_t* str)
|
||||
{
|
||||
char_t* p, * p2;
|
||||
qse_size_t blen;
|
||||
|
||||
blen = strlen(buf);
|
||||
if (blen >= bsz) return blen; /* something wrong */
|
||||
|
||||
p = buf + blen;
|
||||
p2 = buf + bsz - 1;
|
||||
|
||||
while (p < p2)
|
||||
{
|
||||
if (*str == T('\0')) break;
|
||||
*p++ = *str++;
|
||||
}
|
||||
|
||||
if (bsz > 0) *p = T('\0');
|
||||
return p - buf;
|
||||
}
|
||||
|
||||
qse_size_t strxncat (char_t* buf, qse_size_t bsz, const char_t* str, qse_size_t len)
|
||||
{
|
||||
char_t* p, * p2;
|
||||
const char_t* end;
|
||||
qse_size_t blen;
|
||||
|
||||
blen = strlen(buf);
|
||||
if (blen >= bsz) return blen; /* something wrong */
|
||||
|
||||
p = buf + blen;
|
||||
p2 = buf + bsz - 1;
|
||||
|
||||
end = str + len;
|
||||
|
||||
while (p < p2)
|
||||
{
|
||||
if (str >= end) break;
|
||||
*p++ = *str++;
|
||||
}
|
||||
|
||||
if (bsz > 0) *p = T('\0');
|
||||
return p - buf;
|
||||
}
|
||||
|
@ -24,8 +24,7 @@
|
||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
qse_size_t strfcpy (
|
||||
char_t* buf, const char_t* fmt, const char_t* str[])
|
||||
qse_size_t strfcpy (char_t* buf, const char_t* fmt, const char_t* str[])
|
||||
{
|
||||
char_t* b = buf;
|
||||
const char_t* f = fmt;
|
||||
@ -69,8 +68,7 @@ qse_size_t strfcpy (
|
||||
return b - buf;
|
||||
}
|
||||
|
||||
qse_size_t strfncpy (
|
||||
char_t* buf, const char_t* fmt, const cstr_t str[])
|
||||
qse_size_t strfncpy (char_t* buf, const char_t* fmt, const cstr_t str[])
|
||||
{
|
||||
char_t* b = buf;
|
||||
const char_t* f = fmt;
|
||||
@ -123,9 +121,7 @@ qse_size_t strfncpy (
|
||||
return b - buf;
|
||||
}
|
||||
|
||||
qse_size_t strxfcpy (
|
||||
char_t* buf, qse_size_t bsz,
|
||||
const char_t* fmt, const char_t* str[])
|
||||
qse_size_t strxfcpy (char_t* buf, qse_size_t bsz, const char_t* fmt, const char_t* str[])
|
||||
{
|
||||
char_t* b = buf;
|
||||
char_t* end = buf + bsz - 1;
|
||||
@ -185,9 +181,7 @@ fini:
|
||||
return b - buf;
|
||||
}
|
||||
|
||||
qse_size_t strxfncpy (
|
||||
char_t* buf, qse_size_t bsz,
|
||||
const char_t* fmt, const cstr_t str[])
|
||||
qse_size_t strxfncpy (char_t* buf, qse_size_t bsz, const char_t* fmt, const cstr_t str[])
|
||||
{
|
||||
char_t* b = buf;
|
||||
char_t* end = buf + bsz - 1;
|
||||
|
@ -25,7 +25,6 @@
|
||||
*/
|
||||
|
||||
#include <qse/cmn/str.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
/* ----------------------------------- */
|
||||
|
||||
@ -64,20 +63,3 @@
|
||||
#define strcpy qse_wcscpy
|
||||
#define strxcpy qse_wcsxcpy
|
||||
#include "str-join.h"
|
||||
|
||||
#undef char_t
|
||||
#undef strjoin
|
||||
#undef strjoinv
|
||||
#undef strxjoin
|
||||
#undef strxjoinv
|
||||
#undef strcpy
|
||||
#undef strxcpy
|
||||
|
||||
#define char_t qse_char_t
|
||||
#define strjoin qse_strjoin
|
||||
#define strjoinv qse_strjoinv
|
||||
#define strxjoin qse_strxjoin
|
||||
#define strxjoinv qse_strxjoinv
|
||||
#define strcpy qse_strcpy
|
||||
#define strxcpy qse_strxcpy
|
||||
#include "str-join.h"
|
||||
|
@ -47,7 +47,6 @@ qse_size_t strxjoinv (char_t* buf, qse_size_t size, va_list ap)
|
||||
return size - left;
|
||||
}
|
||||
|
||||
|
||||
qse_size_t strxjoin (char_t* buf, qse_size_t size, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
@ -4,11 +4,12 @@ AM_CPPFLAGS = \
|
||||
-I$(top_builddir)/include \
|
||||
-I$(top_srcdir)/include
|
||||
|
||||
lib_LTLIBRARIES =
|
||||
#lib_LTLIBRARIES = libqsesys.la
|
||||
#libqsesys_la_SOURCES =
|
||||
#libqsesys_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined
|
||||
#libqsesys_la_LIBADD = -lqsecmn
|
||||
lib_LTLIBRARIES = libqsesys.la
|
||||
libqsesys_la_SOURCES = \
|
||||
thr.c \
|
||||
thr.h
|
||||
libqsesys_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined
|
||||
libqsesys_la_LIBADD = -lqsecmn
|
||||
|
||||
if ENABLE_CXX
|
||||
lib_LTLIBRARIES += libqsesysxx.la
|
||||
|
@ -78,10 +78,6 @@ PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
#lib_LTLIBRARIES = libqsesys.la
|
||||
#libqsesys_la_SOURCES =
|
||||
#libqsesys_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined
|
||||
#libqsesys_la_LIBADD = -lqsecmn
|
||||
@ENABLE_CXX_TRUE@am__append_1 = libqsesysxx.la
|
||||
subdir = lib/sys
|
||||
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
|
||||
@ -130,14 +126,20 @@ am__uninstall_files_from_dir = { \
|
||||
}
|
||||
am__installdirs = "$(DESTDIR)$(libdir)"
|
||||
LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||
libqsesysxx_la_DEPENDENCIES =
|
||||
am__libqsesysxx_la_SOURCES_DIST = SocketAddress.cpp
|
||||
@ENABLE_CXX_TRUE@am_libqsesysxx_la_OBJECTS = SocketAddress.lo
|
||||
libqsesysxx_la_OBJECTS = $(am_libqsesysxx_la_OBJECTS)
|
||||
libqsesys_la_DEPENDENCIES =
|
||||
am_libqsesys_la_OBJECTS = thr.lo
|
||||
libqsesys_la_OBJECTS = $(am_libqsesys_la_OBJECTS)
|
||||
AM_V_lt = $(am__v_lt_@AM_V@)
|
||||
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||
am__v_lt_0 = --silent
|
||||
am__v_lt_1 =
|
||||
libqsesys_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||
$(libqsesys_la_LDFLAGS) $(LDFLAGS) -o $@
|
||||
libqsesysxx_la_DEPENDENCIES =
|
||||
am__libqsesysxx_la_SOURCES_DIST = SocketAddress.cpp
|
||||
@ENABLE_CXX_TRUE@am_libqsesysxx_la_OBJECTS = SocketAddress.lo
|
||||
libqsesysxx_la_OBJECTS = $(am_libqsesysxx_la_OBJECTS)
|
||||
libqsesysxx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
|
||||
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
|
||||
$(AM_CXXFLAGS) $(CXXFLAGS) $(libqsesysxx_la_LDFLAGS) \
|
||||
@ -159,6 +161,24 @@ DEFAULT_INCLUDES =
|
||||
depcomp = $(SHELL) $(top_srcdir)/ac/depcomp
|
||||
am__depfiles_maybe = depfiles
|
||||
am__mv = mv -f
|
||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
|
||||
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
|
||||
$(AM_CFLAGS) $(CFLAGS)
|
||||
AM_V_CC = $(am__v_CC_@AM_V@)
|
||||
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
|
||||
am__v_CC_0 = @echo " CC " $@;
|
||||
am__v_CC_1 =
|
||||
CCLD = $(CC)
|
||||
LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||
$(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
|
||||
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
||||
am__v_CCLD_0 = @echo " CCLD " $@;
|
||||
am__v_CCLD_1 =
|
||||
CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
|
||||
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
|
||||
LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
|
||||
@ -177,8 +197,9 @@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
|
||||
am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
|
||||
am__v_CXXLD_0 = @echo " CXXLD " $@;
|
||||
am__v_CXXLD_1 =
|
||||
SOURCES = $(libqsesysxx_la_SOURCES)
|
||||
DIST_SOURCES = $(am__libqsesysxx_la_SOURCES_DIST)
|
||||
SOURCES = $(libqsesys_la_SOURCES) $(libqsesysxx_la_SOURCES)
|
||||
DIST_SOURCES = $(libqsesys_la_SOURCES) \
|
||||
$(am__libqsesysxx_la_SOURCES_DIST)
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
@ -384,7 +405,13 @@ AM_CPPFLAGS = \
|
||||
-I$(top_builddir)/include \
|
||||
-I$(top_srcdir)/include
|
||||
|
||||
lib_LTLIBRARIES = $(am__append_1)
|
||||
lib_LTLIBRARIES = libqsesys.la $(am__append_1)
|
||||
libqsesys_la_SOURCES = \
|
||||
thr.c \
|
||||
thr.h
|
||||
|
||||
libqsesys_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined
|
||||
libqsesys_la_LIBADD = -lqsecmn
|
||||
@ENABLE_CXX_TRUE@libqsesysxx_la_SOURCES = \
|
||||
@ENABLE_CXX_TRUE@ SocketAddress.cpp
|
||||
|
||||
@ -393,7 +420,7 @@ lib_LTLIBRARIES = $(am__append_1)
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .cpp .lo .o .obj
|
||||
.SUFFIXES: .c .cpp .lo .o .obj
|
||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
@ -460,6 +487,9 @@ clean-libLTLIBRARIES:
|
||||
rm -f $${locs}; \
|
||||
}
|
||||
|
||||
libqsesys.la: $(libqsesys_la_OBJECTS) $(libqsesys_la_DEPENDENCIES) $(EXTRA_libqsesys_la_DEPENDENCIES)
|
||||
$(AM_V_CCLD)$(libqsesys_la_LINK) -rpath $(libdir) $(libqsesys_la_OBJECTS) $(libqsesys_la_LIBADD) $(LIBS)
|
||||
|
||||
libqsesysxx.la: $(libqsesysxx_la_OBJECTS) $(libqsesysxx_la_DEPENDENCIES) $(EXTRA_libqsesysxx_la_DEPENDENCIES)
|
||||
$(AM_V_CXXLD)$(libqsesysxx_la_LINK) $(am_libqsesysxx_la_rpath) $(libqsesysxx_la_OBJECTS) $(libqsesysxx_la_LIBADD) $(LIBS)
|
||||
|
||||
@ -470,6 +500,28 @@ distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SocketAddress.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thr.Plo@am__quote@
|
||||
|
||||
.c.o:
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
|
||||
|
||||
.c.obj:
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
|
||||
.c.lo:
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
|
||||
|
||||
.cpp.o:
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
|
@ -89,19 +89,42 @@
|
||||
QSE_BEGIN_NAMESPACE(QSE)
|
||||
/////////////////////////////////
|
||||
|
||||
|
||||
SocketAddress::SocketAddress ()
|
||||
{
|
||||
QSE_MEMSET (&this->skad, 0, QSE_SIZEOF(this->skad));
|
||||
}
|
||||
|
||||
SocketAddress::SocketAddress (int family)
|
||||
{
|
||||
QSE_MEMSET (&this->skad, 0, QSE_SIZEOF(this->skad));
|
||||
FAMILY(&this->skad) = family;
|
||||
}
|
||||
|
||||
SocketAddress::SocketAddress (const qse_skad_t* skad)
|
||||
{
|
||||
this->set (skad);
|
||||
}
|
||||
|
||||
SocketAddress::SocketAddress (const qse_nwad_t* nwad)
|
||||
{
|
||||
this->set (nwad);
|
||||
}
|
||||
|
||||
SocketAddress::SocketAddress (const struct sockaddr* ptr, int len)
|
||||
{
|
||||
if (this->set (ptr, len) <= -1)
|
||||
{
|
||||
QSE_MEMSET (&this->skad, 0, QSE_SIZEOF(this->skad));
|
||||
}
|
||||
}
|
||||
|
||||
int SocketAddress::getFamily () const
|
||||
{
|
||||
return FAMILY(&this->skad);
|
||||
//return qse_skadfamily (&this->skad);
|
||||
}
|
||||
|
||||
void* SocketAddress::getStorage (int* len)
|
||||
{
|
||||
if (len) *len = qse_skadsize(&this->skad);
|
||||
return (void*)&this->skad;
|
||||
}
|
||||
|
||||
|
||||
void SocketAddress::setIpaddr (const qse_ip4ad_t* ipaddr)
|
||||
{
|
||||
#if defined(AF_INET)
|
||||
@ -179,19 +202,19 @@ int SocketAddress::set (const qse_skad_t* skad)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int SocketAddress::set (const void* ptr, int len)
|
||||
int SocketAddress::set (const qse_nwad_t* nwad)
|
||||
{
|
||||
return qse_nwadtoskad (nwad, &this->skad);
|
||||
}
|
||||
|
||||
int SocketAddress::set (const struct sockaddr* ptr, int len)
|
||||
{
|
||||
if (len < QSE_SIZEOF(struct sockaddr)) return -1;
|
||||
int exp_size = qse_skadsize((const qse_skad_t*)ptr);
|
||||
if (len < exp_size) return -1;
|
||||
QSE_MEMCPY (&this->skad, ptr, exp_size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int SocketAddress::set (const qse_nwad_t* nwad)
|
||||
{
|
||||
return qse_nwadtoskad (nwad, &this->skad);
|
||||
}
|
||||
|
||||
/////////////////////////////////
|
||||
QSE_END_NAMESPACE(QSE)
|
||||
|
373
qse/lib/sys/thr.c
Normal file
373
qse/lib/sys/thr.c
Normal file
@ -0,0 +1,373 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
Copyright (c) 2006-2014 Chung, Hyung-Hwan. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
#include "thr.h"
|
||||
#include "../cmn/mem.h"
|
||||
#include <stdarg.h>
|
||||
|
||||
#if (!defined(__unix__) && !defined(__unix)) || defined(HAVE_PTHREAD)
|
||||
|
||||
qse_thr_t* qse_thr_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_thr_routine_t routine)
|
||||
{
|
||||
qse_thr_t* thr;
|
||||
|
||||
thr = (qse_thr_t*) QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_thr_t) + xtnsize);
|
||||
if (thr)
|
||||
{
|
||||
if (qse_thr_init (thr, mmgr, routine) <= -1)
|
||||
{
|
||||
QSE_MMGR_FREE (mmgr, thr);
|
||||
return QSE_NULL;
|
||||
}
|
||||
else QSE_MEMSET (QSE_XTN(thr), 0, xtnsize);
|
||||
}
|
||||
|
||||
return thr;
|
||||
}
|
||||
|
||||
void qse_thr_close (qse_thr_t* thr)
|
||||
{
|
||||
qse_thr_fini (thr);
|
||||
QSE_MMGR_FREE (thr->mmgr, thr);
|
||||
}
|
||||
|
||||
int qse_thr_init (qse_thr_t* thr, qse_mmgr_t* mmgr, qse_thr_routine_t routine)
|
||||
{
|
||||
QSE_MEMSET (thr, 0, QSE_SIZEOF(*thr));
|
||||
|
||||
thr->mmgr = mmgr;
|
||||
thr->__handle = QSE_THR_HND_INVALID;
|
||||
thr->__state = QSE_THR_INCUBATING;
|
||||
thr->__return_code = 0;
|
||||
thr->__main_routine = routine;
|
||||
thr->__joinable = 1;
|
||||
thr->__stacksize = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void qse_thr_fini (qse_thr_t* thr)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
if (thr->__handle != QSE_THR_HND_INVALID) CloseHandle (thr->__handle);
|
||||
#endif
|
||||
thr->__handle = QSE_THR_HND_INVALID;
|
||||
}
|
||||
|
||||
|
||||
qse_size_t qse_thr_getstacksize (qse_thr_t* thr)
|
||||
{
|
||||
return thr->__stacksize;
|
||||
}
|
||||
|
||||
void qse_thr_setstacksize (qse_thr_t* thr, qse_size_t num)
|
||||
{
|
||||
thr->__stacksize = num;
|
||||
}
|
||||
|
||||
#if defined(__BEOS__)
|
||||
static int32 __thread_main (void* arg)
|
||||
#else
|
||||
static void* __thread_main (void* arg)
|
||||
#endif
|
||||
{
|
||||
qse_thr_t* thr = (qse_thr_t*)arg;
|
||||
|
||||
while (thr->__state != QSE_THR_RUNNING)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
Sleep (0);
|
||||
#elif defined(HAVE_NANOSLEEP)
|
||||
struct timespec ts;
|
||||
ts.tv_sec =0;
|
||||
ts.tv_nsec = 0;
|
||||
nanosleep (&ts, &ts);
|
||||
#else
|
||||
sleep (0);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if !defined(_WIN32) && !defined(__BEOS__)
|
||||
/*
|
||||
* the asynchronous cancel-type is used to better emulate
|
||||
* the bad effect of WIN32's TerminateThread using pthread_cancel
|
||||
*/
|
||||
pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, QSE_NULL);
|
||||
pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, QSE_NULL);
|
||||
#endif
|
||||
|
||||
thr->__return_code = thr->__temp_routine? thr->__temp_routine(thr): thr->__main_routine(thr);
|
||||
thr->__state = QSE_THR_TERMINATED;
|
||||
|
||||
#if defined(_WIN32)
|
||||
_endthreadex (thr->__return_code);
|
||||
return QSE_NULL;
|
||||
#elif defined(__BEOS__)
|
||||
exit_thread (thr->__return_code);
|
||||
return 0;
|
||||
#else
|
||||
pthread_exit (&thr->__return_code);
|
||||
return QSE_NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
static int __create_thread (qse_thr_t* thr)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
unsigned int tid;
|
||||
|
||||
if (thr->__handle != QSE_THR_HND_INVALID) CloseHandle (thr->__handle);
|
||||
|
||||
thr->__handle = (HANDLE)_beginthreadex (QSE_NULL, 0, (unsigned int (__stdcall*)(void*))__thread_main, thr, 0, &tid);
|
||||
if (thr->__handle == 0) return -1;
|
||||
#elif defined(__BEOS__)
|
||||
thread_id tid;
|
||||
|
||||
tid = spawn_thread ((thread_func)__thread_main, QSE_NULL, 120, thr);
|
||||
if (tid < B_OK) return -1;
|
||||
|
||||
thr->__handle = tid;
|
||||
resume_thread(thr->__handle);
|
||||
#elif defined(HAVE_PTHREAD)
|
||||
pthread_attr_t attr;
|
||||
pthread_attr_init (&attr);
|
||||
|
||||
if (pthread_attr_setdetachstate (&attr, (thr->__joinable?
|
||||
PTHREAD_CREATE_JOINABLE: PTHREAD_CREATE_DETACHED)) != 0)
|
||||
{
|
||||
pthread_attr_destroy (&attr);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (thr->__stacksize > 0)
|
||||
{
|
||||
if (pthread_attr_setstacksize (&attr, thr->__stacksize) != 0)
|
||||
{
|
||||
pthread_attr_destroy (&attr);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (pthread_create (&thr->__handle, &attr, __thread_main, thr) != 0)
|
||||
{
|
||||
pthread_attr_destroy (&attr);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pthread_attr_destroy (&attr);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __cancel_thread (qse_thr_t* thr)
|
||||
{
|
||||
if (thr->__state != QSE_THR_RUNNING) return -1;
|
||||
#if defined(_WIN32)
|
||||
if (TerminateThread (thr->__handle, 0) == 0) return -1;
|
||||
#elif defined(__BEOS__)
|
||||
if (kill_thread (thr->__handle) < B_OK) return -1;
|
||||
#elif defined(HAVE_PTHREAD)
|
||||
if (pthread_cancel (thr->__handle) != 0) return -1;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qse_thr_start (qse_thr_t* thr, int flags, ...)
|
||||
{
|
||||
if (thr->__state == QSE_THR_RUNNING) return -1;
|
||||
|
||||
thr->__joinable = ((flags & QSE_THR_DETACHED) == 0);
|
||||
if (flags & QSE_THR_NEW_ROUTINE)
|
||||
{
|
||||
va_list va;
|
||||
va_start (va, flags);
|
||||
thr->__temp_routine = va_arg (va, qse_thr_routine_t);
|
||||
va_end (va);
|
||||
}
|
||||
else thr->__temp_routine = QSE_NULL;
|
||||
|
||||
if (__create_thread(thr) == -1)
|
||||
{
|
||||
thr->__state = QSE_THR_INCUBATING;
|
||||
thr->__handle = QSE_THR_HND_INVALID;
|
||||
return -1;
|
||||
}
|
||||
|
||||
thr->__state = QSE_THR_RUNNING;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qse_thr_stop (qse_thr_t* thr)
|
||||
{
|
||||
if (thr->__state == QSE_THR_RUNNING)
|
||||
{
|
||||
if (__cancel_thread(thr) == -1) return -1;
|
||||
/* can't be sure of whether or not the thread is really terminated. */
|
||||
thr->__state = QSE_THR_ABORTED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int qse_thr_join (qse_thr_t* thr)
|
||||
{
|
||||
if (thr->__state == QSE_THR_INCUBATING) return -1;
|
||||
if (!thr->__joinable) return -1;
|
||||
|
||||
#if defined(_WIN32)
|
||||
if (thr->__state == QSE_THR_RUNNING)
|
||||
{
|
||||
if (WaitForSingleObject (
|
||||
thr->__handle, INFINITE) == WAIT_FAILED) return -1;
|
||||
}
|
||||
#elif defined(__BEOS__)
|
||||
if (wait_for_thread(thr->__handle, QSE_NULL) < B_OK) return -1;
|
||||
#elif defined(HAVE_PTHREAD)
|
||||
if (pthread_join(thr->__handle, QSE_NULL) != 0) return -1;
|
||||
#endif
|
||||
|
||||
thr->__joinable = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qse_thr_detach (qse_thr_t* thr)
|
||||
{
|
||||
if (thr->__state == QSE_THR_INCUBATING) return -1;
|
||||
if (!thr->__joinable) return -1;
|
||||
|
||||
#if defined(HAVE_PTHREAD)
|
||||
if (pthread_detach(thr->__handle) != 0) return -1;
|
||||
#endif
|
||||
|
||||
thr->__joinable = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qse_thr_kill (qse_thr_t* thr, int sig)
|
||||
{
|
||||
if (thr->__state != QSE_THR_RUNNING) return -1;
|
||||
|
||||
#if defined(HAVE_PTHREAD)
|
||||
if (pthread_kill (thr->__handle, sig) != 0) return -1;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qse_thr_blocksig (qse_thr_t* thr, int sig)
|
||||
{
|
||||
#if defined(HAVE_PTHREAD)
|
||||
sigset_t mask;
|
||||
#endif
|
||||
|
||||
if (thr->__state != QSE_THR_RUNNING) return -1;
|
||||
|
||||
#if defined(HAVE_PTHREAD)
|
||||
sigemptyset (&mask);
|
||||
sigaddset (&mask, sig);
|
||||
if (pthread_sigmask (SIG_BLOCK, &mask, QSE_NULL) != 0) return -1;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qse_thr_unblocksig (qse_thr_t* thr, int sig)
|
||||
{
|
||||
#if defined(HAVE_PTHREAD)
|
||||
sigset_t mask;
|
||||
#endif
|
||||
|
||||
if (thr->__state != QSE_THR_RUNNING) return -1;
|
||||
|
||||
#if defined(HAVE_PTHREAD)
|
||||
sigemptyset (&mask);
|
||||
sigaddset (&mask, sig);
|
||||
if (pthread_sigmask (SIG_UNBLOCK, &mask, QSE_NULL) != 0) return -1;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qse_thr_blockallsigs (qse_thr_t* thr)
|
||||
{
|
||||
#if defined(HAVE_PTHREAD)
|
||||
sigset_t mask;
|
||||
#endif
|
||||
|
||||
if (thr->__state != QSE_THR_RUNNING) return -1;
|
||||
|
||||
#if defined(HAVE_PTHREAD)
|
||||
sigfillset (&mask);
|
||||
if (pthread_sigmask (SIG_BLOCK, &mask, QSE_NULL) != 0) return -1;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qse_thr_unblockallsigs (qse_thr_t* thr)
|
||||
{
|
||||
#if defined(HAVE_PTHREAD)
|
||||
sigset_t mask;
|
||||
#endif
|
||||
|
||||
if (thr->__state != QSE_THR_RUNNING) return -1;
|
||||
|
||||
#if defined(HAVE_PTHREAD)
|
||||
sigfillset (&mask);
|
||||
if (pthread_sigmask (SIG_UNBLOCK, &mask, QSE_NULL) != 0) return -1;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
qse_thr_hnd_t qse_thr_gethnd (qse_thr_t* thr)
|
||||
{
|
||||
return thr->__handle;
|
||||
}
|
||||
|
||||
int qse_thr_getretcode (qse_thr_t* thr)
|
||||
{
|
||||
return thr->__return_code;
|
||||
}
|
||||
|
||||
qse_thr_state_t qse_thr_getstate (qse_thr_t* thr)
|
||||
{
|
||||
return thr->__state;
|
||||
}
|
||||
|
||||
qse_thr_hnd_t qse_getcurthrhnd (void)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
return GetCurrentThread ();
|
||||
#elif defined(__OS2__)
|
||||
return QSE_THR_HND_INVALID; /* TODO: implement this */
|
||||
#elif defined(__DOS__)
|
||||
return QSE_THR_HND_INVALID; /* TODO: implement this */
|
||||
#elif defined(__BEOS__)
|
||||
return QSE_THR_HND_INVALID; /* TODO: implement this */
|
||||
#else
|
||||
return pthread_self ();
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
77
qse/lib/sys/thr.h
Normal file
77
qse/lib/sys/thr.h
Normal file
@ -0,0 +1,77 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
Copyright (c) 2006-2014 Chung, Hyung-Hwan. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _QSE_LIB_CMN_THR_H_
|
||||
#define _QSE_LIB_CMN_THR_H_
|
||||
|
||||
#include <qse/sys/thr.h>
|
||||
|
||||
|
||||
#if (!defined(__unix__) && !defined(__unix)) || defined(HAVE_PTHREAD)
|
||||
|
||||
#if defined(_WIN32)
|
||||
# include <process.h>
|
||||
# define QSE_THR_HND_INVALID INVALID_HANDLE_VALUE
|
||||
#elif defined(__OS2__)
|
||||
/* not implemented */
|
||||
|
||||
#elif defined(__DOS__)
|
||||
|
||||
/* not implemented */
|
||||
|
||||
#elif defined(__BEOS__)
|
||||
# include <be/kernel/OS.h>
|
||||
# define QSE_THR_HND_INVALID (-1)
|
||||
#else
|
||||
# if defined(AIX) && defined(__GNUC__)
|
||||
typedef int crid_t;
|
||||
typedef unsigned int class_id_t;
|
||||
# endif
|
||||
# include <pthread.h>
|
||||
# include <signal.h>
|
||||
|
||||
# define QSE_THR_HND_INVALID 0
|
||||
#endif
|
||||
|
||||
struct qse_thr_t
|
||||
{
|
||||
qse_mmgr_t* mmgr;
|
||||
|
||||
qse_thr_routine_t __main_routine;
|
||||
qse_thr_routine_t __temp_routine;
|
||||
qse_bool_t __joinable;
|
||||
qse_size_t __stacksize;
|
||||
|
||||
qse_thr_hnd_t __handle;
|
||||
qse_thr_state_t __state;
|
||||
|
||||
int __return_code;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user