aboutsummaryrefslogtreecommitdiffstats
path: root/examples/old-patches/vlc-git-sesse.patch
blob: a38b378d00131347f2d8fa2ff74d953da89d175a (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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
diff --git a/modules/access_output/http.c b/modules/access_output/http.c
index 61095f5..18ffc9a 100644
--- a/modules/access_output/http.c
+++ b/modules/access_output/http.c
@@ -72,9 +72,17 @@ vlc_module_begin ()
                   PASS_TEXT, PASS_LONGTEXT, true )
     add_string( SOUT_CFG_PREFIX "mime", "",
                 MIME_TEXT, MIME_LONGTEXT, true )
+    add_integer( SOUT_CFG_PREFIX "mark-start", "",
+                "lol", "Fancy option", -1 )
+    add_integer( SOUT_CFG_PREFIX "mark-end", "",
+                "rotfl", "Should maybe also be set", -1 )
     set_callbacks( Open, Close )
 vlc_module_end ()
 
+// globals
+extern vlc_mutex_t mark_lock;
+extern int *mark_used;
+extern int mark_start, mark_end;
 
 /*****************************************************************************
  * Exported prototypes
@@ -178,6 +186,21 @@ static int Open( vlc_object_t *p_this )
         return VLC_EGENERIC;
     }
 
+    fprintf(stderr, "tjobing\n");
+    if (mark_used == NULL) {
+      mark_start = var_InheritInteger( p_access, SOUT_CFG_PREFIX "mark-start");
+      mark_end = var_InheritInteger( p_access, SOUT_CFG_PREFIX "mark-end");
+      fprintf(stderr, "jabla: %d -> %d\n", mark_start, mark_end);
+
+      if (mark_start >= 0 && mark_end > mark_start) {
+        vlc_mutex_init(&mark_lock);
+        mark_used = (int *)malloc((mark_end - mark_start) * sizeof(int));
+        for (int i = 0; i < mark_end - mark_start; ++i) {
+          mark_used[i] = 0;
+        }
+      }
+    }
+
     psz_user = var_GetNonEmptyString( p_access, SOUT_CFG_PREFIX "user" );
     psz_pwd = var_GetNonEmptyString( p_access, SOUT_CFG_PREFIX "pwd" );
     if( p_access->psz_access && !strcmp( p_access->psz_access, "mmsh" ) )
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index 25d83c5..335edda 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -631,3 +631,7 @@ xml_ReaderDelete
 xml_ReaderReset
 vlc_keycode2str
 vlc_str2keycode
+mark_end
+mark_lock
+mark_start
+mark_used
diff --git a/src/network/httpd.c b/src/network/httpd.c
index f76c47c..d7897bb 100644
--- a/src/network/httpd.c
+++ b/src/network/httpd.c
@@ -67,6 +67,50 @@
 
 static void httpd_ClientClean( httpd_client_t *cl );
 
+VLC_API vlc_mutex_t mark_lock;
+VLC_API int *mark_used = NULL;
+VLC_API int mark_start = -1;
+VLC_API int mark_end = -1;
+
+void mark_socket(int fd)
+{
+    vlc_mutex_lock(&mark_lock);
+    int best_mark = mark_start;
+    int best_mark_val = mark_used[0];
+
+    for (int i = 1; i < mark_end - mark_start; ++i) {
+        if (mark_used[i] < best_mark_val) {
+            best_mark = mark_start + i;
+            best_mark_val = mark_used[i];
+        }
+    }
+    fprintf( stderr, "PICKED MARK %d WITH OLD USAGE %d\n", best_mark, best_mark_val);
+    if (setsockopt (fd, SOL_SOCKET, SO_MARK, &best_mark, sizeof(best_mark)) == -1) {
+        perror("setsockopt(SO_MARK)");
+    } else {
+        ++mark_used[best_mark - mark_start];
+    }
+    vlc_mutex_unlock(&mark_lock);
+}
+
+void unmark_socket(int fd)
+{
+    int mark;
+    socklen_t mark_len = sizeof(mark);
+    if (getsockopt (fd, SOL_SOCKET, SO_MARK, &mark, &mark_len) == -1) {
+        perror("getsockopt(SO_MARK)");
+        return;
+    }
+    if (mark < mark_start || mark >= mark_end) {
+        fprintf("UNKNOWN MARK %d\n", mark);
+    }
+
+    vlc_mutex_lock(&mark_lock);
+    --mark_used[mark - mark_start];
+    fprintf(stderr, "UNMARKED MARK %d WITH NEW USAGE %d\n", mark, mark_used[mark - mark_start]);
+    vlc_mutex_unlock(&mark_lock);
+}
+
 /* each host run in his own thread */
 struct httpd_host_t
 {
@@ -1295,6 +1339,7 @@ static void httpd_ClientClean( httpd_client_t *cl )
     {
         if( cl->p_tls != NULL )
             vlc_tls_SessionDelete( cl->p_tls );
+        unmark_socket( cl->fd );
         net_Close( cl->fd );
         cl->fd = -1;
     }
@@ -2309,6 +2354,11 @@ static void* httpd_HostThread( void *data )
             setsockopt (fd, SOL_SOCKET, SO_REUSEADDR,
                         &(int){ 1 }, sizeof(int));
 
+            // find a free mark
+            if (mark_used != NULL) {
+                mark_socket(fd);
+            }
+
             vlc_tls_t *p_tls;
 
             if( host->p_tls != NULL )