blob: a4feb7287d52d98762b5d869fdd609cf3bbba83b (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
// Copyright (c) rAthena Project (www.rathena.org) - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
#ifndef _rA_NETBUFFER_H_
#define _rA_NETBUFFER_H_
#include "../common/cbasetypes.h"
typedef struct netbuf {
sysint pool; // The pool ID this buffer belongs to,
// is set to -1 if its an emergency allocated buffer
struct netbuf *next; // Used by Network system.
volatile int32 refcnt; // Internal Refcount, it gets lowered every call to netbuffer_put,
// if its getting zero, the buffer will returned back to the pool
// and can be reused.
int32 dataPos; // Current Offset
// Used only for Reading (recv job)
// write cases are using the sessions local datapos member due to
// shared write buffer support.
int32 dataLen; // read buffer case:
// The length expected to read to.
// when this->dataPos == dateLen, read job has been completed.
// write buffer case:
// The lngth of data in te buffer
// when s->dataPos == dataLen, write job has been completed
//
// Note:
// leftBytes = (dateLen - dataPos)
//
// Due to shared buffer support
// dataPos gets not used in write case (each connection has its local offset)
//
// The Bufferspace itself.
char buf[32];
} *netbuf;
void netbuffer_init();
void netbuffer_final();
/**
* Gets a netbuffer that has atleast (sz) byes space.
*
* @note: The netbuffer system guarantees that youll always recevie a buffer.
* no check for null is required!
*
* @param sz - minimum size needed.
*
* @return pointer to netbuf struct
*/
netbuf netbuffer_get(sysint sz);
/**
* Returns the given netbuffer (decreases refcount, if its 0 - the buffer will get returned to the pool)
*
* @param buf - the buffer to return
*/
void netbuffer_put(netbuf buf);
/**
* Increases the Refcount on the given buffer
* (used for areasends .. etc)
*
*/
void netbuffer_incref(netbuf buf);
// Some Useful macros
#define NBUFP(netbuf,pos) (((uint8*)(netbuf->buf)) + (pos))
#define NBUFB(netbuf,pos) (*(uint8*)((netbuf->buf) + (pos)))
#define NBUFW(netbuf,pos) (*(uint16*)((netbuf->buf) + (pos)))
#define NBUFL(netbuf,pos) (*(uint32*)((netbuf->buf) + (pos)))
#endif
|