Cube  Diff

Differences From Artifact [c6e27aadf2]:

To Artifact [4bf1a6646d]:


43
44
45
46
47
48
49
50

51
52
53
54
55
56
57
43
44
45
46
47
48
49

50
51
52
53
54
55
56
57







-
+







		rr.query = rt->query;
		rr.address = address;
		rt->query = NULL;
		rt->starttime = 0;
		SDL_UnlockMutex(resolvermutex);
	};
	return 0;
};
}

void
resolverinit(int threads, int limit)
{
	resolverlimit = limit;
	resolversem = SDL_CreateSemaphore(0);
	resolvermutex = SDL_CreateMutex();
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
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







-
+

-
+








-
+







	resolverresults.setsize(0);
	while (SDL_SemTryWait(resolversem) == 0)
		;
	loopv(resolverthreads)
	{
		resolverthread &rt = resolverthreads[i];
		resolverstop(rt, true);
	};
	}
	SDL_UnlockMutex(resolvermutex);
};
}

void
resolverquery(char *name)
{
	SDL_LockMutex(resolvermutex);
	resolverqueries.add(name);
	SDL_SemPost(resolversem);
	SDL_UnlockMutex(resolvermutex);
};
}

bool
resolvercheck(char **name, ENetAddress *address)
{
	SDL_LockMutex(resolvermutex);
	if (!resolverresults.empty()) {
		resolverresult &rr = resolverresults.pop();
123
124
125
126
127
128
129
130

131
132
133

134
135
136
137
138
139
140
123
124
125
126
127
128
129

130
131
132

133
134
135
136
137
138
139
140







-
+


-
+







			if (lastmillis - rt.starttime > resolverlimit) {
				resolverstop(rt, true);
				*name = rt.query;
				SDL_UnlockMutex(resolvermutex);
				return true;
			};
		};
	};
	}
	SDL_UnlockMutex(resolvermutex);
	return false;
};
}

struct serverinfo {
	string name;
	string full;
	string map;
	string sdesc;
	int mode, numplayers, ping, protocol, minremain;
155
156
157
158
159
160
161
162

163
164
165
166
167
168
169
155
156
157
158
159
160
161

162
163
164
165
166
167
168
169







-
+








void
addserver(OFString *servername_)
{
	@autoreleasepool {
		const char *servername = servername_.UTF8String;
		loopv(servers) if (strcmp(servers[i].name, servername) ==
		                   0) return;
		    0) return;
		serverinfo &si = servers.insert(0, serverinfo());
		strcpy_s(si.name, servername);
		si.full[0] = 0;
		si.mode = 0;
		si.numplayers = 0;
		si.ping = 9999;
		si.protocol = 0;
187
188
189
190
191
192
193
194

195
196

197
198
199
200
201
202
203
187
188
189
190
191
192
193

194
195

196
197
198
199
200
201
202
203







-
+

-
+







		if (si.address.host == ENET_HOST_ANY)
			continue;
		p = ping;
		putint(p, lastmillis);
		buf.data = ping;
		buf.dataLength = p - ping;
		enet_socket_send(pingsock, &si.address, &buf, 1);
	};
	}
	lastinfo = lastmillis;
};
}

void
checkresolver()
{
	char *name = NULL;
	ENetAddress addr = {ENET_HOST_ANY, CUBE_SERVINFO_PORT};
	while (resolvercheck(&name, &addr)) {
250
251
252
253
254
255
256
257
258


259
260
261
262
263
264
265
250
251
252
253
254
255
256


257
258
259
260
261
262
263
264
265







-
-
+
+







	}
}

int
sicompare(const serverinfo *a, const serverinfo *b)
{
	return a->ping > b->ping
	           ? 1
	           : (a->ping < b->ping ? -1 : strcmp(a->name, b->name));
	    ? 1
	    : (a->ping < b->ping ? -1 : strcmp(a->name, b->name));
}

void
refreshservers()
{
	checkresolver();
	checkpings();
281
282
283
284
285
286
287
288

289
290
291
292
293
294
295
296
281
282
283
284
285
286
287

288

289
290
291
292
293
294
295







-
+
-







					    si.numplayers,
					    si.map[0] ? si.map : "[unknown]",
					    modestr(si.mode).UTF8String,
					    si.name, si.sdesc);
				}
			}
		} else {
			sprintf_s(si.full)(
			sprintf_s(si.full)(si.address.host != ENET_HOST_ANY
			    si.address.host != ENET_HOST_ANY
			        ? "%s [waiting for server response]"
			        : "%s [unknown host]\t",
			    si.name);
		}
		si.full[50] = 0; // cut off too long server descriptions
		@autoreleasepool {
			menumanual(1, i, @(si.full));
307
308
309
310
311
312
313
314

315
316
317
318
319
320
321
306
307
308
309
310
311
312

313
314
315
316
317
318
319
320







-
+







		pingsock = enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM, NULL);
		resolverinit(1, 1000);
	};
	resolverclear();
	loopv(servers) resolverquery(servers[i].name);
	refreshservers();
	menuset(1);
};
}

void
updatefrommaster()
{
	const int MAXUPD = 32000;
	uchar buf[MAXUPD];
	uchar *reply = retrieveservers(buf, MAXUPD);