Advertisement
Guest User

Remorse - Pending Socket Ring Buffer Code Untested

a guest
Nov 22nd, 2019
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.21 KB | None | 0 0
  1.  
  2. #include "proto.h"
  3.  
  4. int pending_max(int type) {
  5.  
  6.         switch(type) {
  7.  
  8.                 case PENDING_SMTP:
  9.                         return PENDING_SMTP_MAX;
  10.                 break;
  11.                 case PENDING_SMTPA:
  12.                         return PENDING_SMTPA_MAX;
  13.                 break;
  14. #ifdef ENABLE_SSL
  15.                 case PENDING_SMTPS:
  16.                         return PENDING_SMTPS_MAX;
  17.                 break;
  18. #endif
  19.                 default:
  20.                 return 0;
  21.         }
  22.  
  23. }
  24.  
  25. int pending_init_ring(int type) {
  26.         int max;
  27.         if (type < 0 || type >= PENDING_TYPES) return -1;
  28.         max = pending_max(type);
  29.         if (!max) return -1;
  30.         g_pending[type] = malloc(sizeof(int) * max);
  31.         if (!g_pending[type]) return -1;
  32.         g_pending_head[type] = -1;
  33.         g_pending_tail[type] = -1;
  34.         return 0;
  35. }
  36.  
  37. int pending_init() {
  38.  
  39.         if (pending_init_ring(PENDING_SMTP) < 0)
  40.                 return -1;
  41.  
  42.         if (pending_init_ring(PENDING_SMTPA) < 0)
  43.                 return -1;
  44.  
  45. #ifdef ENABLE_SSL
  46.         if (pending_init_ring(PENDING_SMTPS) < 0)
  47.                 return -1;
  48. #endif
  49.         return 0;
  50. }
  51.  
  52. int pending_push(int type, int fd) {
  53.  
  54.         if (type < 0 || type >= PENDING_TYPES) return -1;
  55.         if (fd < 0) return -1;
  56.  
  57.         if (g_pending_head[type] == -1 &&
  58.             g_pending_tail[type] == -1) {
  59.                 // ring buffer is empty
  60.                 g_pending[type][0] = fd;
  61.                 g_pending_head[type] = 0;
  62.                 g_pending_tail[type] = 1;
  63.                 return 0;
  64.         }
  65.  
  66.         if (g_pending_head[type] == g_pending_tail[type]) {
  67.                 // ring buffer is full
  68.                 return -1;
  69.         }
  70.  
  71.         g_pending[type][g_pending_tail[type]] = fd;
  72.         g_pending_tail[type] = ((g_pending_tail[type] + 1) % pending_max(type));
  73.         return 0;
  74.  
  75. }
  76.  
  77. int pending_pop(int type) {
  78.  
  79.         int fd;
  80.  
  81.         if (type < 0 || type >= PENDING_TYPES) return -1;
  82.  
  83.         if (g_pending_head[type] == -1 &&
  84.             g_pending_tail[type] == -1) {
  85.                 // ring buffer is already empty
  86.                 return -1;
  87.         }
  88.  
  89.         fd = g_pending[type][g_pending_head[type]];
  90.         g_pending_head[type] = ((g_pending_head[type] + 1) % pending_max(type));
  91.  
  92.         if (g_pending_head[type] == g_pending_tail[type]) {
  93.                 // ring buffer now empty
  94.                 g_pending_head[type] = -1;
  95.                 g_pending_tail[type] = -1;
  96.         }
  97.  
  98.         return fd;
  99.  
  100. }
  101.  
  102. int pending_empty(int type) {
  103.  
  104.         if (type < 0 || type >= PENDING_TYPES) return -1;
  105.  
  106.         if (g_pending_head[type] == -1 &&
  107.             g_pending_tail[type] == -1) {
  108.                 // ring buffer is empty
  109.                 return 1;
  110.         }
  111.  
  112.         return 0;
  113.  
  114. }
  115.  
  116. int pending_full(int type) {
  117.  
  118.         if (type < 0 || type >= PENDING_TYPES) return -1;
  119.  
  120.         if (g_pending_head[type] == -1 &&
  121.             g_pending_tail[type] == -1) {
  122.                 // ring buffer is empty
  123.                 return 0;
  124.         }
  125.  
  126.         if (g_pending_head[type] == g_pending_tail[type]) {
  127.                 // ring buffer full
  128.                 return 1;
  129.         }
  130.  
  131.         return 0;
  132.  
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement