Skip to content

Commit 564e73c

Browse files
committed
Major rework for OpenCL/BLAS support. Threading fixes.
1 parent f0950f9 commit 564e73c

15 files changed

+678
-1998
lines changed

Diff for: AboutDialog.cpp

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "stdafx.h"
22
#include "AboutDialog.h"
33
#include "config.h"
4+
#include "Network.h"
45

56
AboutDialog::AboutDialog( wxWindow* parent )
67
:
@@ -10,9 +11,7 @@ TAboutDialog( parent )
1011
}
1112

1213
void AboutDialog::doInit( wxInitDialogEvent& event ) {
13-
#ifdef LITEVERSION
14-
m_staticTextVersion->SetLabel(wxString(_("Leela lite version ")) + wxString(wxT(VERSION)));
15-
#else
16-
m_staticTextVersion->SetLabel(wxString(_("Leela version ")) + wxString(wxT(VERSION)));
17-
#endif
14+
m_staticTextVersion->SetLabel(wxString(_("Leela version ")) + wxString(wxT(PROGRAM_VERSION)));
15+
m_staticTextEngine->SetLabel(wxString(Network::get_Network()->get_backend()));
16+
Fit();
1817
}

Diff for: App.cpp

+5-208
Original file line numberDiff line numberDiff line change
@@ -1,221 +1,18 @@
11
#include "stdafx.h"
22
#include "App.h"
33
#include "MainFrame.h"
4-
#include "CopyProtectionDialog.h"
5-
#include "keygen/sha2.h"
64

75
IMPLEMENT_APP(MyApp);
86

9-
#ifdef COPYPROTECT
10-
#ifndef LITEVERSION
11-
// public key
12-
extern unsigned int pub[16384];
13-
14-
static void sha256_rounds(unsigned char *s, unsigned char *d, unsigned int r) {
15-
int j;
16-
17-
for (j = 0; j < 8192; j++) {
18-
s[28] ^= (r & 0xFF00) >> 8;
19-
s[29] ^= r & 0xFF;
20-
s[30] ^= (j & 0xFF00) >> 8;
21-
s[31] ^= j & 0xFF;
22-
sha256((unsigned char*)s, 32, (unsigned char*)d);
23-
d[28] ^= (r & 0xFF00) >> 8;
24-
d[29] ^= r & 0xFF;
25-
d[30] ^= (j & 0xFF00) >> 8;
26-
d[31] ^= j & 0xFF;
27-
sha256((unsigned char*)d, 32, (unsigned char*)s);
28-
}
29-
30-
memcpy(d, s, 32);
31-
}
32-
33-
static void sha256_16k(char *in, unsigned char *out, unsigned int r) {
34-
unsigned char s[32];
35-
unsigned char d[32];
36-
37-
sha256((unsigned char*)in, strlen(in), s);
38-
39-
sha256_rounds((unsigned char*)s, (unsigned char*)d, r);
40-
41-
memcpy(out, d, 32);
42-
}
43-
44-
bool Verify_Serial(wxString p_regname, wxString p_serial) {
45-
char regbuff[256];
46-
char bregname[256], bserial[256];
47-
char *regname = bregname;
48-
char *serial = bserial;
49-
unsigned int check1, check2, seal1, seal2;
50-
51-
memset(regbuff, 0, sizeof(regbuff));
52-
memset(bregname, 0, sizeof(bregname));
53-
memset(bserial, 0, sizeof(bserial));
54-
55-
strncpy(regname, p_regname.c_str(), 256);
56-
strncpy(serial, p_serial.c_str(), 256);
57-
58-
char *s = regname;
59-
int len = strlen(s);
60-
61-
if (len > 255) {
62-
return false;
63-
}
64-
65-
if (strlen(serial) > 255) {
66-
return false;
67-
}
68-
69-
/*
70-
strip starting whitespace
71-
*/
72-
while(*s == ' ') {
73-
s++;
74-
len--;
75-
}
76-
77-
strncpy(regbuff, s, len);
78-
79-
/*
80-
axe trailing spaces, newlines
81-
*/
82-
int len2 = strlen(regbuff);
83-
int pos = len2 - 1;
84-
85-
while ((regbuff[pos] == ' ' || regbuff[pos] == 13 || regbuff[pos] == 11) && pos > 0) {
86-
regbuff[pos] = 0;
87-
pos--;
88-
}
89-
90-
int len3 = strlen(regbuff);
91-
int j;
92-
93-
for (j = 0; j < len3; j++) {
94-
if (regbuff[j] > 126 || regbuff[j] < 32) {
95-
regbuff[j] = '_';
96-
}
97-
regbuff[j] = toupper(regbuff[j]);
98-
}
99-
100-
unsigned char dg[32];
101-
102-
sha256_16k(regbuff, dg, 0);
103-
104-
unsigned int idx1 = ((dg[30] << 8) | dg[31]) & 0x3FFF;
105-
unsigned int idx2 = ((dg[28] << 8) | dg[29]) & 0x3FFF;
106-
107-
check1 = pub[idx1];
108-
check2 = pub[idx2];
109-
110-
char keychars[32] = { '1', '3', '4', '5', '6', '7', '8', '9',
111-
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
112-
'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R',
113-
'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
114-
115-
unsigned int dcount = 0;
116-
seal1 = 0;
117-
seal2 = 0;
118-
119-
while (*serial != 0 && dcount < 7) {
120-
for (j = 0; j < 32; j++) {
121-
if (toupper(*serial) == keychars[j]) {
122-
dcount++;
123-
seal1 <<= 5;
124-
seal1 |= j;
125-
}
126-
}
127-
serial++;
128-
}
129-
130-
dcount = 0;
131-
132-
while (*serial != 0 && dcount < 7) {
133-
for (j = 0; j < 32; j++) {
134-
if (toupper(*serial) == keychars[j]) {
135-
dcount++;
136-
seal2 <<= 5;
137-
seal2 |= j;
138-
}
139-
}
140-
serial++;
141-
}
142-
143-
unsigned char sr[32];
144-
unsigned char or[32];
145-
146-
memset(sr, 0, 32);
147-
sr[28] = (seal1 >> 24) & 0xFF;
148-
sr[29] = (seal1 >> 16) & 0xFF;
149-
sr[30] = (seal1 >> 8) & 0xFF;
150-
sr[31] = (seal1 >> 0) & 0xFF;
151-
152-
sha256_rounds(sr, or, idx1);
153-
154-
seal1 = (or[28] << 24)
155-
| (or[29] << 16)
156-
| (or[30] << 8)
157-
| (or[31] );
158-
159-
if (check1 != seal1) {
160-
return false;
161-
}
162-
163-
memset(sr, 0, 32);
164-
sr[28] = (seal2 >> 24) & 0xFF;
165-
sr[29] = (seal2 >> 16) & 0xFF;
166-
sr[30] = (seal2 >> 8) & 0xFF;
167-
sr[31] = (seal2 >> 0) & 0xFF;
168-
169-
sha256_rounds(sr, or, idx2);
170-
171-
seal2 = (or[28] << 24)
172-
| (or[29] << 16)
173-
| (or[30] << 8)
174-
| (or[31] );
175-
176-
if (check1 != seal1 || check2 != seal2) {
177-
return false;
178-
}
179-
180-
return true;
181-
}
182-
#endif
183-
#endif
184-
1857
bool MyApp::OnInit()
186-
{
187-
wxConfig * config = new wxConfig(wxT("Leela"), wxT("Sjeng.Org"));
8+
{
9+
wxConfig * config = new wxConfig(wxT("Leela"), wxT("Sjeng.Org"));
18810
wxConfig::Set(config);
18911

190-
#ifdef COPYPROTECT
191-
#ifndef LITEVERSION
192-
wxString name = config->Read(wxT("Name"));
193-
wxString code = config->Read(wxT("Code"));
194-
195-
while (!Verify_Serial(name, code)) {
196-
CopyProtectionDialog dialog(NULL);
197-
if (dialog.ShowModal() == wxID_OK) {
198-
name = dialog.getName();
199-
code = dialog.getCode();
200-
config->Write(wxT("Name"), name);
201-
config->Write(wxT("Code"), code);
202-
if (!Verify_Serial(name, code)) {
203-
::wxMessageBox(_("The registration info you entered is not correct.\nPlease enter the name and code you received\nwhen you bought the program."),
204-
_("Copyprotection check"));
205-
}
206-
} else {
207-
return false;
208-
}
209-
}
210-
#endif
211-
#endif
212-
#ifdef LITEVERSION
213-
MainFrame* frame = new MainFrame(NULL, _("Leela lite"));
214-
#else
215-
MainFrame* frame = new MainFrame(NULL, _("Leela"));
216-
#endif
12+
MainFrame* frame = new MainFrame(NULL, _("Leela"));
13+
21714
frame->Show();
218-
15+
21916
SetTopWindow(frame);
22017

22118
return true;

Diff for: ClockAdjustDialog.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ void ClockAdjustDialog::doCancel( wxCommandEvent& event ) {
1717
void ClockAdjustDialog::doOK( wxCommandEvent& event ) {
1818
int tleftmins = m_spinCtrlBlackMins->GetValue();
1919
int tleftsecs = m_spinCtrlBlackSecs->GetValue();
20-
m_tc.adjust_time(FastBoard::BLACK, (tleftmins * 60 + tleftsecs) * 100, 25);
20+
m_tc.adjust_time(FastBoard::BLACK, (tleftmins * 60 + tleftsecs) * 100, 0);
2121

2222
tleftmins = m_spinCtrlWhiteMins->GetValue();
2323
tleftsecs = m_spinCtrlWhiteSecs->GetValue();
24-
m_tc.adjust_time(FastBoard::WHITE, (tleftmins * 60 + tleftsecs) * 100, 25);
24+
m_tc.adjust_time(FastBoard::WHITE, (tleftmins * 60 + tleftsecs) * 100, 0);
2525
event.Skip();
2626
}
2727

Diff for: EngineThread.cpp

+27-22
Original file line numberDiff line numberDiff line change
@@ -4,60 +4,61 @@
44
#include "UCTSearch.h"
55
#include "MainFrame.h"
66

7-
TEngineThread::TEngineThread(GameState * state, wxSemaphore * sema, MainFrame * frame) {
7+
TEngineThread::TEngineThread(GameState * state, MainFrame * frame)
8+
: wxThread(wxTHREAD_JOINABLE)
9+
{
810
m_state = state;
9-
m_sema = sema;
1011
m_frame = frame;
1112
m_maxvisits = 0;
12-
m_runflag = true;
13-
m_nopass = false;
13+
m_runflag = true;
14+
m_nopass = false;
1415
m_quiet = false;
16+
m_nets = true;
1517
}
1618

17-
void * TEngineThread::Entry() {
19+
void * TEngineThread::Entry() {
1820
{
19-
m_frame->SetStatusBar(_("Engine thinking..."), 1);
20-
2121
std::auto_ptr<UCTSearch> search(new UCTSearch(*m_state));
22-
22+
2323
int who = m_state->get_to_move();
2424
search->set_visit_limit(m_maxvisits);
2525
search->set_runflag(&m_runflag);
26-
search->set_analyzing(m_analyseflag);
26+
search->set_analyzing(m_analyseflag);
2727
search->set_quiet(m_quiet);
28-
28+
search->set_use_nets(m_nets);
29+
2930
int mode = UCTSearch::NORMAL;
3031
if (m_nopass) {
3132
mode = UCTSearch::NOPASS;
3233
}
33-
34+
3435
int move;
3536
if (m_resigning) {
3637
move = search->think(who, mode);
3738
} else {
3839
move = search->think(who, mode | UCTSearch::NORESIGN);
39-
}
40-
41-
if (!m_analyseflag) {
42-
m_state->play_move(who, move);
4340
}
44-
45-
m_sema->Post();
4641

47-
//if (!m_analyseflag) {
48-
wxCommandEvent event(EVT_NEW_MOVE);
49-
::wxPostEvent(m_frame->GetEventHandler(), event);
50-
//}
42+
if (!m_analyseflag) {
43+
m_state->play_move(who, move);
44+
}
5145
}
5246

5347
return NULL;
5448
}
5549

50+
void TEngineThread::OnExit() {
51+
if (!m_analyseflag) {
52+
wxQueueEvent(m_frame->GetEventHandler(),
53+
new wxCommandEvent(EVT_NEW_MOVE));
54+
}
55+
}
56+
5657
void TEngineThread::limit_visits(int visits) {
5758
m_maxvisits = visits;
5859
}
5960

60-
void TEngineThread::stop_engine() {
61+
void TEngineThread::stop_engine() {
6162
m_runflag = false;
6263
}
6364

@@ -75,4 +76,8 @@ void TEngineThread::set_nopass(bool flag) {
7576

7677
void TEngineThread::set_quiet(bool flag) {
7778
m_quiet = flag;
79+
}
80+
81+
void TEngineThread::set_nets(bool flag) {
82+
m_nets = flag;
7883
}

Diff for: EngineThread.h

+12-9
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,32 @@
33

44
#include "stdafx.h"
55
#include "GameState.h"
6+
#include <boost/atomic.hpp>
67

78
class MainFrame;
89

910
class TEngineThread : public wxThread {
1011
public:
11-
TEngineThread(GameState * gamestate, wxSemaphore * sema, MainFrame * frame);
12+
TEngineThread(GameState * gamestate, MainFrame * frame);
1213
void limit_visits(int visits);
1314
void set_resigning(bool res);
1415
void set_analyzing(bool flag);
1516
void set_nopass(bool flag);
1617
void set_quiet(bool flag);
18+
void set_nets(bool flag);
1719
void stop_engine(void);
18-
virtual void * Entry();
20+
virtual void * Entry() override;
21+
virtual void OnExit() override;
1922
private:
20-
GameState * m_state;
21-
wxSemaphore * m_sema;
22-
MainFrame * m_frame;
23-
int m_maxvisits;
24-
bool m_resigning;
25-
bool m_analyseflag;
23+
GameState * m_state;
24+
MainFrame * m_frame;
25+
int m_maxvisits;
26+
bool m_nets;
27+
bool m_resigning;
28+
bool m_analyseflag;
2629
bool m_quiet;
2730
bool m_nopass;
28-
bool m_runflag;
31+
boost::atomic<bool> m_runflag;
2932
};
3033

3134
#endif

0 commit comments

Comments
 (0)