summaryrefslogtreecommitdiff
path: root/src/common/netbuffer.h
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