Cube  Diff

Differences From Artifact [c6e27aadf2]:

To Artifact [4bf1a6646d]:


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();







<
>







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
	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();







<
>

<
>








<
>







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
			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;







<
>


<
>







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

void
addserver(OFString *servername_)
{
	@autoreleasepool {
		const char *servername = servername_.UTF8String;
		loopv(servers) if (strcmp(servers[i].name, servername) ==
		                   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;







|







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;
		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
		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)) {







<
>

<
>







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
	}
}

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

void
refreshservers()
{
	checkresolver();
	checkpings();







|
|







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));
}

void
refreshservers()
{
	checkresolver();
	checkpings();
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
					    si.numplayers,
					    si.map[0] ? si.map : "[unknown]",
					    modestr(si.mode).UTF8String,
					    si.name, si.sdesc);
				}
			}
		} else {
			sprintf_s(si.full)(
			    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));







|
<







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)(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
		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);







<
>







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);