summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt10
-rw-r--r--src/common/db.h38
-rw-r--r--src/common/socket.c6
-rw-r--r--src/common/timer.c6
-rw-r--r--src/map/clif.c3
-rw-r--r--src/map/map.h6
6 files changed, 50 insertions, 19 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 500bf2615..d56f3c333 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -3,6 +3,16 @@ Date Added
AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
+2007/12/27
+ * Tweeked the declaration and initialization defines for vectors.
+ * Made do_sockets leave the for loop as soon as the readable number of
+ sockets returned by select is found.
+ * Made all posix compliant systems that support it and FreeBSD >= 5.1
+ (implements it but doesn't have the posix defines) use the precise and
+ consistent tick() implementation.
+ * Minor tweek to HEAP_SEARCH (same variable can be used in from and to).
+ * Fixed the map server not exiting when make_listen_bind fails and
+ returns -1. [FlavioJS]
2007/12/26
* Fixed the incorrect interpretation of the map-cell height information
stored in .gat files; this was causing an overall of 20000 cells to
diff --git a/src/common/db.h b/src/common/db.h
index 30948b0cb..cf9e4e82e 100644
--- a/src/common/db.h
+++ b/src/common/db.h
@@ -854,11 +854,23 @@ void linkdb_final ( struct linkdb_node** head );
+/// Declares an anonymous vector struct.
+///
+/// @param __type Type of data
+#define VECTOR_DECL(__type) \
+ struct { \
+ size_t _max_; \
+ size_t _len_; \
+ __type* _data_; \
+ }
+
+
+
/// Declares a named vector struct.
///
/// @param __name Structure name
/// @param __type Type of data
-#define VECTOR_STRUCT(__name,__type) \
+#define VECTOR_STRUCT_DECL(__name,__type) \
struct __name { \
size_t _max_; \
size_t _len_; \
@@ -867,7 +879,16 @@ void linkdb_final ( struct linkdb_node** head );
-/// Declares a named vector struct variable.
+/// Declares and initializes an anonymous vector variable.
+///
+/// @param __type Type of data
+/// @param __var Variable name
+#define VECTOR_VAR(__type,__var) \
+ VECTOR_DECL(__type) __var = {0,0,NULL}
+
+
+
+/// Declares and initializes a named vector variable.
///
/// @param __name Structure name
/// @param __var Variable name
@@ -876,16 +897,11 @@ void linkdb_final ( struct linkdb_node** head );
-/// Declares a vector variable with an anonymous struct.
+/// Initializes a vector.
///
-/// @param __type Type of data
-/// @param __var Variable name
-#define VECTOR_VAR(__type,__var) \
- struct { \
- size_t _max_; \
- size_t _len_; \
- __type* _data_; \
- } __var = {0,0,NULL}
+/// @param __vec Vector
+#define VECTOR_INIT(__vec) \
+ memset(&(__vec), 0, sizeof(__vec))
diff --git a/src/common/socket.c b/src/common/socket.c
index b1c564034..0173ee846 100644
--- a/src/common/socket.c
+++ b/src/common/socket.c
@@ -716,11 +716,13 @@ int do_sockets(int next)
}
#else
// otherwise assume that the fd_set is a bit-array and enumerate it in a standard way
- //TODO: select() returns the number of readable sockets; use that to exit the fd_max loop faster
- for (i = 1; i < fd_max; i++)
+ for( i = 1; ret && i < fd_max; ++i )
{
if(sFD_ISSET(i,&rfd) && session[i])
+ {
session[i]->func_recv(i);
+ --ret;
+ }
}
#endif
diff --git a/src/common/timer.c b/src/common/timer.c
index c66fd5960..2c8236e3d 100644
--- a/src/common/timer.c
+++ b/src/common/timer.c
@@ -12,8 +12,10 @@
#include <time.h>
#ifdef WIN32
+#define WIN32_LEAN_AND_MEAN
#include <windows.h> // GetTickCount()
#else
+#include <unistd.h>
#include <sys/time.h> // struct timeval, gettimeofday()
#endif
@@ -93,7 +95,7 @@ static unsigned int tick(void)
{
#if defined(WIN32)
return GetTickCount();
-#elif defined(__FREEBSD__)
+#elif (defined(_POSIX_TIMERS) && _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK) /* posix compliant */) || (defined(__FreeBSD_cc_version) && __FreeBSD_cc_version >= 500005 /* FreeBSD >= 5.1.0 */)
struct timespec tval;
clock_gettime(CLOCK_MONOTONIC, &tval);
return tval.tv_sec * 1000 + tval.tv_nsec / 1000000;
@@ -147,8 +149,8 @@ unsigned int gettick(void)
#define HEAP_SEARCH(target,from,to,pos) \
do { \
int max,pivot; \
- pos = from; \
max = to; \
+ pos = from; \
while (pos < max) { \
pivot = (pos + max) / 2; \
if (DIFF_TICK(target, timer_data[timer_heap[pivot]].tick) < 0) \
diff --git a/src/map/clif.c b/src/map/clif.c
index 3ee08824c..d176a9415 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -12043,7 +12043,8 @@ int do_init_clif(void)
packetdb_readdb();
set_defaultparse(clif_parse);
- if (!make_listen_bind(bind_ip,map_port)) {
+ if( make_listen_bind(bind_ip,map_port) == -1 )
+ {
ShowFatalError("can't bind game port\n");
exit(EXIT_FAILURE);
}
diff --git a/src/map/map.h b/src/map/map.h
index 3ee4e0c7d..ecdc72c4f 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -374,10 +374,10 @@ struct status_change_entry {
};
struct status_change {
- unsigned int option;// effect state
- unsigned int opt3;// skill state
+ unsigned int option;// effect state (bitfield)
+ unsigned int opt3;// skill state (bitfield)
unsigned short opt1;// body state
- unsigned short opt2;// health state
+ unsigned short opt2;// health state (bitfield)
unsigned char count;
//TODO: See if it is possible to implement the following SC's without requiring extra parameters while the SC is inactive.
unsigned char jb_flag; //Joint Beat type flag