summaryrefslogtreecommitdiff
path: root/ot_workqueue.h
blob: f99a7b511eaa2145a6e30c20db6521c186664385 (plain)
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
/* This software was written by Dirk Engling <erdgeist@erdgeist.org>
   It is considered beerware. Prost. Skol. Cheers or whatever.

   $id$ */

#ifndef OT_WORKQUEUE_H__
#define OT_WORKQUEUE_H__

#include <stdint.h>
#include <sys/uio.h>

#include "trackerlogic.h"

/* Work the tracker hands to a thread of its own: a full scrape or an
   expensive stats page, which take too long to build while a client waits.
   The task goes in here, the reply comes back out. */

typedef enum {
  TASK_STATS_CONNS               = 0x0001,
  TASK_STATS_TCP                 = 0x0002,
  TASK_STATS_UDP                 = 0x0003,
  TASK_STATS_SCRAPE              = 0x0004,
  TASK_STATS_FULLSCRAPE          = 0x0005,
  TASK_STATS_TPB                 = 0x0006,
  TASK_STATS_HTTPERRORS          = 0x0007,
  TASK_STATS_VERSION             = 0x0008,
  TASK_STATS_RENEW               = 0x000a,
  TASK_STATS_SYNCS               = 0x000b,
  TASK_STATS_COMPLETED           = 0x000c,
  TASK_STATS_NUMWANTS            = 0x000d,

  TASK_STATS                     = 0x0100, /* Mask */
  TASK_STATS_TORRENTS            = 0x0101,
  TASK_STATS_PEERS               = 0x0102,
  TASK_STATS_SLASH24S            = 0x0103,
  TASK_STATS_TOP10               = 0x0104,
  TASK_STATS_TOP100              = 0x0105,
  TASK_STATS_EVERYTHING          = 0x0106,
  TASK_STATS_FULLLOG             = 0x0107,
  TASK_STATS_WOODPECKERS         = 0x0108,

  TASK_FULLSCRAPE                = 0x0200, /* Default mode */
  TASK_FULLSCRAPE_TPB_BINARY     = 0x0201,
  TASK_FULLSCRAPE_TPB_ASCII      = 0x0202,
  TASK_FULLSCRAPE_TPB_ASCII_PLUS = 0x0203,
  TASK_FULLSCRAPE_TPB_URLENCODED = 0x0204,
  TASK_FULLSCRAPE_TRACKERSTATE   = 0x0205,

  TASK_DMEM                      = 0x0300,

  TASK_DONE                      = 0x0f00,
  TASK_DONE_PARTIAL              = 0x0f01,

  TASK_FLAG_GZIP                 = 0x1000,
  TASK_FLAG_BZIP2                = 0x2000,
  TASK_FLAG_ZSTD                 = 0x4000,
  TASK_FLAG_CHUNKED              = 0x8000,

  TASK_TASK_MASK                 = 0x0fff,
  TASK_CLASS_MASK                = 0x0f00,
  TASK_FLAGS_MASK                = 0xf000
} ot_tasktype;

typedef unsigned long ot_taskid;

int        workqueue_pushtask(int64_t sock, ot_tasktype tasktype);
void       workqueue_canceltask(int64_t sock);
void       workqueue_pushsuccess(ot_taskid taskid);
ot_taskid  workqueue_poptask(ot_tasktype *tasktype);
int        workqueue_pushresult(ot_taskid taskid, size_t iovec_entries, struct iovec *iovector);
int        workqueue_pushchunked(ot_taskid taskid, struct iovec *iovec);
int64_t    workqueue_popresult(size_t *iovec_entries, struct iovec **iovector, int *is_partial);

void       workqueue_init(void);
void       workqueue_deinit(void);
void       workqueue_wakeall(void);

#endif