Procházet zdrojové kódy

Fix lock in initilization

Daniele Bartolini před 12 roky
rodič
revize
da6298ce52
1 změnil soubory, kde provedl 115 přidání a 119 odebrání
  1. 115 119
      engine/os/linux/main.cpp

+ 115 - 119
engine/os/linux/main.cpp

@@ -250,23 +250,9 @@ public:
 
 		while (!m_exit)
 		{
-			while (XPending(m_x11_display))
-			{
-				m_write_sem.wait();
-
-				LinuxDevice::pump_events();
-			}
-
-			// Swap event buffers
-			EventBuffer* temp = m_read;
-			m_read = m_write;
-			m_write = temp;
-
-			m_read_sem.post();
+			LinuxDevice::pump_events();
 		}
 
-		Log::d("Stopping game thread");
-
 		game_thread.stop();
 
 		LinuxDevice::shutdown();
@@ -305,6 +291,8 @@ public:
 	//-----------------------------------------------------------------------------
 	bool process_events()
 	{
+		m_read_sem.wait();
+
 		void* event;
 		uint32_t type;
 		size_t size;
@@ -356,7 +344,6 @@ public:
 
 		m_read->clear();
 		m_write_sem.post();
-		m_read_sem.wait();
 
 		return false;
 	}
@@ -364,135 +351,144 @@ public:
 	//-----------------------------------------------------------------------------
 	void pump_events()
 	{
-		XEvent event;
-		XNextEvent(m_x11_display, &event);
-
-		switch (event.type)
+		while (XPending(m_x11_display))
 		{
-			case ClientMessage:
+			XEvent event;
+			XNextEvent(m_x11_display, &event);
+
+			switch (event.type)
 			{
-				if ((Atom)event.xclient.data.l[0] == m_wm_delete_message)
+				case ClientMessage:
 				{
-					OsExitEvent ev;
-					ev.code = 0;
-					m_write->push_event(OsEvent::EXIT, &ev, sizeof(OsExitEvent));
+					if ((Atom)event.xclient.data.l[0] == m_wm_delete_message)
+					{
+						OsExitEvent ev;
+						ev.code = 0;
+						m_write->push_event(OsEvent::EXIT, &ev, sizeof(OsExitEvent));
+					}
+					break;
 				}
-				break;
-			}
-			case ConfigureNotify:
-			{
-				m_x = event.xconfigure.x;
-				m_y = event.xconfigure.y;
-				m_width = event.xconfigure.width;
-				m_height = event.xconfigure.height;
-
-				OsMetricsEvent ev;
-				ev.x = event.xconfigure.x;
-				ev.y = event.xconfigure.y;
-				ev.width = event.xconfigure.width;
-				ev.height = event.xconfigure.height;
+				case ConfigureNotify:
+				{
+					m_x = event.xconfigure.x;
+					m_y = event.xconfigure.y;
+					m_width = event.xconfigure.width;
+					m_height = event.xconfigure.height;
 
-				m_write->push_event(OsEvent::METRICS, &ev, sizeof(OsMetricsEvent));
-				Log::d("Configure notify");
+					OsMetricsEvent ev;
+					ev.x = event.xconfigure.x;
+					ev.y = event.xconfigure.y;
+					ev.width = event.xconfigure.width;
+					ev.height = event.xconfigure.height;
 
-				break;
-			}
-			case ButtonPress:
-			case ButtonRelease:
-			{
-				OsMouseEvent ev;
+					m_write->push_event(OsEvent::METRICS, &ev, sizeof(OsMetricsEvent));
 
-				MouseButton::Enum mb;
-				switch (event.xbutton.button)
-				{
-					case Button1: mb = MouseButton::LEFT; break;
-					case Button2: mb = MouseButton::MIDDLE; break;
-					case Button3: mb = MouseButton::RIGHT; break;
-					default: mb = MouseButton::NONE; break;
+					break;
 				}
+				case ButtonPress:
+				case ButtonRelease:
+				{
+					OsMouseEvent ev;
+
+					MouseButton::Enum mb;
+					switch (event.xbutton.button)
+					{
+						case Button1: mb = MouseButton::LEFT; break;
+						case Button2: mb = MouseButton::MIDDLE; break;
+						case Button3: mb = MouseButton::RIGHT; break;
+						default: mb = MouseButton::NONE; break;
+					}
+
+					if (mb != MouseButton::NONE)
+					{
+						ev.type = OsMouseEvent::BUTTON;
+						ev.button = mb;
+						ev.x = event.xbutton.x;
+						ev.y = event.xbutton.y;
+						ev.pressed = event.type == ButtonPress;
+						m_write->push_event(OsEvent::MOUSE, &ev, sizeof(OsMouseEvent));
+					}
 
-				if (mb != MouseButton::NONE)
+					break;
+				}
+				case MotionNotify:
 				{
-					ev.type = OsMouseEvent::BUTTON;
-					ev.button = mb;
-					ev.x = event.xbutton.x;
-					ev.y = event.xbutton.y;
-					ev.pressed = event.type == ButtonPress;
+					OsMouseEvent ev;
+					ev.type = OsMouseEvent::MOVE;
+					ev.x = event.xmotion.x;
+					ev.y = event.xmotion.y;
+
 					m_write->push_event(OsEvent::MOUSE, &ev, sizeof(OsMouseEvent));
+
+					break;
 				}
+				case KeyPress:
+				case KeyRelease:
+				{
+					char string[4] = {0, 0, 0, 0};
+					KeySym key;
 
-				break;
-			}
-			case MotionNotify:
-			{
-				OsMouseEvent ev;
-				ev.type = OsMouseEvent::MOVE;
-				ev.x = event.xmotion.x;
-				ev.y = event.xmotion.y;
+					XLookupString(&event.xkey, string, 4, &key, NULL);
 
-				m_write->push_event(OsEvent::MOUSE, &ev, sizeof(OsMouseEvent));
+					KeyboardButton::Enum kb = x11_translate_key(key);
 
-				break;
-			}
-			case KeyPress:
-			case KeyRelease:
-			{
-				char string[4] = {0, 0, 0, 0};
-				KeySym key;
+					// Check if any modifier key is pressed or released
+					int32_t modifier_mask = 0;
+
+					if (kb == KeyboardButton::LSHIFT || kb == KeyboardButton::RSHIFT)
+					{
+						(event.type == KeyPress) ? modifier_mask |= ModifierButton::SHIFT : modifier_mask &= ~ModifierButton::SHIFT;
+					}
+					else if (kb == KeyboardButton::LCONTROL || kb == KeyboardButton::RCONTROL)
+					{
+						(event.type == KeyPress) ? modifier_mask |= ModifierButton::CTRL : modifier_mask &= ~ModifierButton::CTRL;
+					}
+					else if (kb == KeyboardButton::LALT || kb == KeyboardButton::RALT)
+					{
+						(event.type == KeyPress) ? modifier_mask |= ModifierButton::ALT : modifier_mask &= ~ModifierButton::ALT;
+					}
 
-				XLookupString(&event.xkey, string, 4, &key, NULL);
+					OsKeyboardEvent ev;
 
-				KeyboardButton::Enum kb = x11_translate_key(key);
+					ev.button = kb;
+					ev.modifier = modifier_mask;
+					ev.pressed = event.type == KeyPress;
 
-				// Check if any modifier key is pressed or released
-				int32_t modifier_mask = 0;
+					m_write->push_event(OsEvent::KEYBOARD, &ev, sizeof(OsKeyboardEvent));
 
-				if (kb == KeyboardButton::LSHIFT || kb == KeyboardButton::RSHIFT)
-				{
-					(event.type == KeyPress) ? modifier_mask |= ModifierButton::SHIFT : modifier_mask &= ~ModifierButton::SHIFT;
+	//				// Text input part
+	//				if (event.type == KeyPress && len > 0)
+	//				{
+	//					//crownEvent.event_type = ET_TEXT;
+	//					//crownEvent.text.type = TET_TEXT_INPUT;
+	//					strncpy(keyboardEvent.text, string, 4);
+
+	//					if (mListener)
+	//					{
+	//						mListener->TextInput(keyboardEvent);
+	//					}
+	//				}
+
+					break;
 				}
-				else if (kb == KeyboardButton::LCONTROL || kb == KeyboardButton::RCONTROL)
+				case KeymapNotify:
 				{
-					(event.type == KeyPress) ? modifier_mask |= ModifierButton::CTRL : modifier_mask &= ~ModifierButton::CTRL;
+					XRefreshKeyboardMapping(&event.xmapping);
+					break;
 				}
-				else if (kb == KeyboardButton::LALT || kb == KeyboardButton::RALT)
+				default:
 				{
-					(event.type == KeyPress) ? modifier_mask |= ModifierButton::ALT : modifier_mask &= ~ModifierButton::ALT;
+					break;
 				}
-
-				OsKeyboardEvent ev;
-
-				ev.button = kb;
-				ev.modifier = modifier_mask;
-				ev.pressed = event.type == KeyPress;
-
-				m_write->push_event(OsEvent::KEYBOARD, &ev, sizeof(OsKeyboardEvent));
-
-//				// Text input part
-//				if (event.type == KeyPress && len > 0)
-//				{
-//					//crownEvent.event_type = ET_TEXT;
-//					//crownEvent.text.type = TET_TEXT_INPUT;
-//					strncpy(keyboardEvent.text, string, 4);
-
-//					if (mListener)
-//					{
-//						mListener->TextInput(keyboardEvent);
-//					}
-//				}
-
-				break;
-			}
-			case KeymapNotify:
-			{
-				XRefreshKeyboardMapping(&event.xmapping);
-				break;
-			}
-			default:
-			{
-				break;
 			}
 		}
+
+		// Swap event buffers
+		EventBuffer* temp = m_read;
+		m_read = m_write;
+		m_write = temp;
+
+		m_read_sem.post();
 	}
 
 	//-----------------------------------------------------------------------------