Jelajahi Sumber

fix: 在同一个协程内,使用同一个topic,先sys.waitUnitl,然后sys.subscribe, 会导致sys.dispatch执行回调的for循环出错

解决办法是先建立一个临时表, 然后遍历

https://gitee.com/openLuat/LuatOS/issues/I7ZD23
Wendal Chen 2 tahun lalu
induk
melakukan
095357ce8f
2 mengubah file dengan 98 tambahan dan 86 penghapusan
  1. 94 86
      luat/vfs/luat_inline_libs.c
  2. 4 0
      script/corelib/sys.lua

+ 94 - 86
luat/vfs/luat_inline_libs.c

@@ -529,96 +529,104 @@ const char luat_inline2_sys[] = {
 0x74, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 
 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x60, 0x01, 0x00, 0x00, 0x70, 0x01, 
-0x00, 0x00, 0x00, 0x00, 0x0B, 0x2D, 0x00, 0x00, 
+0x00, 0x00, 0x60, 0x01, 0x00, 0x00, 0x74, 0x01, 
+0x00, 0x00, 0x00, 0x00, 0x0C, 0x38, 0x00, 0x00, 
 0x00, 0x05, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 
-0x00, 0x5F, 0x00, 0x40, 0x00, 0x1E, 0xC0, 0x09, 
+0x00, 0x5F, 0x00, 0x40, 0x00, 0x1E, 0x80, 0x0C, 
 0x80, 0x06, 0x40, 0xC0, 0x00, 0x45, 0x00, 0x00, 
 0x00, 0x81, 0x80, 0x00, 0x00, 0x24, 0x80, 0x80, 
 0x01, 0x47, 0x80, 0x40, 0x00, 0x46, 0x40, 0x00, 
 0x01, 0x62, 0x00, 0x00, 0x00, 0x1E, 0xC0, 0xFC, 
-0x7F, 0x46, 0xC0, 0xC0, 0x01, 0x87, 0x80, 0x40, 
-0x00, 0x86, 0x80, 0x00, 0x01, 0x64, 0x00, 0x01, 
-0x01, 0x1E, 0xC0, 0x05, 0x80, 0x86, 0x01, 0xC1, 
-0x01, 0xC0, 0x01, 0x00, 0x02, 0xA4, 0x81, 0x00, 
-0x01, 0x1F, 0x40, 0x41, 0x03, 0x1E, 0xC0, 0x01, 
-0x80, 0x80, 0x01, 0x00, 0x02, 0xC5, 0x01, 0x00, 
-0x02, 0x00, 0x02, 0x00, 0x00, 0x41, 0x82, 0x01, 
-0x00, 0x9C, 0x02, 0x00, 0x00, 0xE4, 0x01, 0x00, 
-0x02, 0xA4, 0x41, 0x00, 0x00, 0x1E, 0x80, 0x02, 
-0x80, 0x86, 0x01, 0xC1, 0x01, 0xC0, 0x01, 0x00, 
-0x02, 0xA4, 0x81, 0x00, 0x01, 0x1F, 0xC0, 0x41, 
-0x03, 0x1E, 0x40, 0x01, 0x80, 0x86, 0x01, 0xC2, 
-0x02, 0xC0, 0x01, 0x00, 0x02, 0x05, 0x02, 0x00, 
-0x02, 0x40, 0x02, 0x00, 0x00, 0x24, 0x02, 0x00, 
-0x01, 0xA4, 0x41, 0x00, 0x00, 0x69, 0x80, 0x00, 
-0x00, 0xEA, 0x40, 0xF9, 0x7F, 0x1E, 0xC0, 0xF4, 
-0x7F, 0x26, 0x00, 0x80, 0x00, 0x09, 0x00, 0x00, 
-0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x04, 0x07, 
-0x72, 0x65, 0x6D, 0x6F, 0x76, 0x65, 0x13, 0x01, 
-0x00, 0x00, 0x00, 0x04, 0x06, 0x70, 0x61, 0x69, 
-0x72, 0x73, 0x04, 0x05, 0x74, 0x79, 0x70, 0x65, 
-0x04, 0x09, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 
-0x6F, 0x6E, 0x13, 0x02, 0x00, 0x00, 0x00, 0x04, 
-0x07, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x04, 
-0x09, 0x63, 0x6F, 0x72, 0x65, 0x73, 0x75, 0x6D, 
-0x65, 0x06, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 
-0x01, 0x01, 0x0F, 0x00, 0x00, 0x01, 0x02, 0x01, 
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0xA5, 0x01, 
-0x00, 0x00, 0x00, 0x00, 0x07, 0x30, 0x00, 0x00, 
-0x00, 0x05, 0x00, 0x00, 0x00, 0x24, 0x40, 0x80, 
-0x00, 0x06, 0x00, 0xC0, 0x00, 0x46, 0x40, 0xC0, 
-0x00, 0x24, 0x00, 0x01, 0x01, 0x22, 0x00, 0x00, 
-0x00, 0x1E, 0xC0, 0x09, 0x80, 0x1F, 0x80, 0x40, 
-0x00, 0x1E, 0x00, 0x00, 0x80, 0x1E, 0x00, 0x09, 
-0x80, 0xC6, 0xC0, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 
-0x00, 0x1E, 0x40, 0x08, 0x80, 0xC6, 0x40, 0x00, 
-0x01, 0xE2, 0x00, 0x00, 0x00, 0x1E, 0x80, 0x07, 
-0x80, 0xC5, 0x00, 0x80, 0x01, 0x20, 0xC0, 0x80, 
-0x00, 0x1E, 0x40, 0x02, 0x80, 0xC6, 0x40, 0x00, 
-0x01, 0x88, 0x00, 0xC1, 0x00, 0x06, 0xC1, 0x00, 
-0x02, 0x1F, 0x40, 0x00, 0x02, 0x1E, 0x80, 0x05, 
-0x80, 0x08, 0x01, 0xC1, 0x01, 0x06, 0x41, 0xC1, 
-0x02, 0x40, 0x01, 0x80, 0x01, 0x24, 0x41, 0x00, 
-0x01, 0x1E, 0x40, 0x04, 0x80, 0xC6, 0x40, 0x00, 
-0x01, 0x1F, 0x80, 0x40, 0x01, 0x1E, 0x00, 0x00, 
-0x80, 0x88, 0x00, 0xC1, 0x00, 0x06, 0x41, 0x00, 
-0x03, 0x5F, 0x00, 0x41, 0x02, 0x1E, 0x00, 0x02, 
-0x80, 0x00, 0x01, 0x80, 0x01, 0x45, 0x01, 0x80, 
-0x03, 0x86, 0x41, 0x00, 0x03, 0x64, 0x01, 0x00, 
-0x01, 0x24, 0x41, 0x00, 0x00, 0x1F, 0x80, 0x40, 
-0x01, 0x1E, 0xC0, 0x00, 0x80, 0x88, 0x01, 0xC1, 
-0x00, 0x1E, 0x40, 0x00, 0x80, 0x00, 0x01, 0x80, 
-0x01, 0x24, 0x41, 0x80, 0x00, 0x26, 0x00, 0x80, 
-0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x08, 0x72, 
-0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x04, 0x0C, 
-0x49, 0x4E, 0x46, 0x5F, 0x54, 0x49, 0x4D, 0x45, 
-0x4F, 0x55, 0x54, 0x13, 0x00, 0x00, 0x00, 0x00, 
-0x04, 0x0A, 0x4D, 0x53, 0x47, 0x5F, 0x54, 0x49, 
-0x4D, 0x45, 0x52, 0x00, 0x04, 0x09, 0x63, 0x6F, 
-0x72, 0x65, 0x73, 0x75, 0x6D, 0x65, 0x08, 0x00, 
-0x00, 0x00, 0x01, 0x11, 0x01, 0x03, 0x01, 0x0A, 
-0x01, 0x06, 0x01, 0x0B, 0x01, 0x00, 0x01, 0x0C, 
-0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x00, 0xAB, 0x01, 0x00, 0x00, 0xAB, 
-0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 
-0x00, 0x00, 0x26, 0x00, 0x80, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAD, 
-0x01, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0x00, 
-0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 
-0x40, 0x00, 0x24, 0x40, 0x80, 0x00, 0x1E, 0x00, 
-0xFF, 0x7F, 0x26, 0x00, 0x80, 0x00, 0x01, 0x00, 
-0x00, 0x00, 0x04, 0x08, 0x73, 0x61, 0x66, 0x65, 
-0x52, 0x75, 0x6E, 0x01, 0x00, 0x00, 0x00, 0x01, 
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x00, 0x00, 0x00, };
+0x7F, 0x4B, 0x00, 0x00, 0x00, 0x86, 0xC0, 0xC0, 
+0x01, 0xC7, 0x80, 0x40, 0x00, 0xC6, 0xC0, 0x00, 
+0x01, 0xA4, 0x00, 0x01, 0x01, 0x1E, 0xC0, 0x00, 
+0x80, 0xC6, 0x01, 0xC1, 0x00, 0x00, 0x02, 0x80, 
+0x00, 0x40, 0x02, 0x80, 0x02, 0xE4, 0x41, 0x80, 
+0x01, 0xA9, 0x80, 0x00, 0x00, 0x2A, 0x41, 0xFE, 
+0x7F, 0x86, 0x40, 0xC1, 0x01, 0xC0, 0x00, 0x80, 
+0x00, 0xA4, 0x00, 0x01, 0x01, 0x1E, 0xC0, 0x05, 
+0x80, 0xC6, 0x81, 0xC1, 0x01, 0x00, 0x02, 0x00, 
+0x03, 0xE4, 0x81, 0x00, 0x01, 0x1F, 0xC0, 0xC1, 
+0x03, 0x1E, 0xC0, 0x01, 0x80, 0xC0, 0x01, 0x00, 
+0x03, 0x05, 0x02, 0x00, 0x02, 0x40, 0x02, 0x00, 
+0x00, 0x81, 0x02, 0x02, 0x00, 0xDC, 0x02, 0x00, 
+0x00, 0x24, 0x02, 0x00, 0x02, 0xE4, 0x41, 0x00, 
+0x00, 0x1E, 0x80, 0x02, 0x80, 0xC6, 0x81, 0xC1, 
+0x01, 0x00, 0x02, 0x00, 0x03, 0xE4, 0x81, 0x00, 
+0x01, 0x1F, 0x40, 0xC2, 0x03, 0x1E, 0x40, 0x01, 
+0x80, 0xC6, 0x81, 0xC2, 0x02, 0x00, 0x02, 0x00, 
+0x03, 0x45, 0x02, 0x00, 0x02, 0x80, 0x02, 0x00, 
+0x00, 0x64, 0x02, 0x00, 0x01, 0xE4, 0x41, 0x00, 
+0x00, 0xA9, 0x80, 0x00, 0x00, 0x2A, 0x41, 0xF9, 
+0x7F, 0x1E, 0x00, 0xF2, 0x7F, 0x26, 0x00, 0x80, 
+0x00, 0x0B, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 
+0x00, 0x00, 0x04, 0x07, 0x72, 0x65, 0x6D, 0x6F, 
+0x76, 0x65, 0x13, 0x01, 0x00, 0x00, 0x00, 0x04, 
+0x06, 0x70, 0x61, 0x69, 0x72, 0x73, 0x04, 0x07, 
+0x69, 0x6E, 0x73, 0x65, 0x72, 0x74, 0x04, 0x07, 
+0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x04, 0x05, 
+0x74, 0x79, 0x70, 0x65, 0x04, 0x09, 0x66, 0x75, 
+0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x13, 0x02, 
+0x00, 0x00, 0x00, 0x04, 0x07, 0x74, 0x68, 0x72, 
+0x65, 0x61, 0x64, 0x04, 0x09, 0x63, 0x6F, 0x72, 
+0x65, 0x73, 0x75, 0x6D, 0x65, 0x06, 0x00, 0x00, 
+0x00, 0x01, 0x10, 0x01, 0x01, 0x01, 0x0F, 0x00, 
+0x00, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x01, 
+0x00, 0x00, 0xA9, 0x01, 0x00, 0x00, 0x00, 0x00, 
+0x07, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 
+0x00, 0x24, 0x40, 0x80, 0x00, 0x06, 0x00, 0xC0, 
+0x00, 0x46, 0x40, 0xC0, 0x00, 0x24, 0x00, 0x01, 
+0x01, 0x22, 0x00, 0x00, 0x00, 0x1E, 0xC0, 0x09, 
+0x80, 0x1F, 0x80, 0x40, 0x00, 0x1E, 0x00, 0x00, 
+0x80, 0x1E, 0x00, 0x09, 0x80, 0xC6, 0xC0, 0xC0, 
+0x00, 0x1F, 0xC0, 0x00, 0x00, 0x1E, 0x40, 0x08, 
+0x80, 0xC6, 0x40, 0x00, 0x01, 0xE2, 0x00, 0x00, 
+0x00, 0x1E, 0x80, 0x07, 0x80, 0xC5, 0x00, 0x80, 
+0x01, 0x20, 0xC0, 0x80, 0x00, 0x1E, 0x40, 0x02, 
+0x80, 0xC6, 0x40, 0x00, 0x01, 0x88, 0x00, 0xC1, 
+0x00, 0x06, 0xC1, 0x00, 0x02, 0x1F, 0x40, 0x00, 
+0x02, 0x1E, 0x80, 0x05, 0x80, 0x08, 0x01, 0xC1, 
+0x01, 0x06, 0x41, 0xC1, 0x02, 0x40, 0x01, 0x80, 
+0x01, 0x24, 0x41, 0x00, 0x01, 0x1E, 0x40, 0x04, 
+0x80, 0xC6, 0x40, 0x00, 0x01, 0x1F, 0x80, 0x40, 
+0x01, 0x1E, 0x00, 0x00, 0x80, 0x88, 0x00, 0xC1, 
+0x00, 0x06, 0x41, 0x00, 0x03, 0x5F, 0x00, 0x41, 
+0x02, 0x1E, 0x00, 0x02, 0x80, 0x00, 0x01, 0x80, 
+0x01, 0x45, 0x01, 0x80, 0x03, 0x86, 0x41, 0x00, 
+0x03, 0x64, 0x01, 0x00, 0x01, 0x24, 0x41, 0x00, 
+0x00, 0x1F, 0x80, 0x40, 0x01, 0x1E, 0xC0, 0x00, 
+0x80, 0x88, 0x01, 0xC1, 0x00, 0x1E, 0x40, 0x00, 
+0x80, 0x00, 0x01, 0x80, 0x01, 0x24, 0x41, 0x80, 
+0x00, 0x26, 0x00, 0x80, 0x00, 0x06, 0x00, 0x00, 
+0x00, 0x04, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 
+0x76, 0x65, 0x04, 0x0C, 0x49, 0x4E, 0x46, 0x5F, 
+0x54, 0x49, 0x4D, 0x45, 0x4F, 0x55, 0x54, 0x13, 
+0x00, 0x00, 0x00, 0x00, 0x04, 0x0A, 0x4D, 0x53, 
+0x47, 0x5F, 0x54, 0x49, 0x4D, 0x45, 0x52, 0x00, 
+0x04, 0x09, 0x63, 0x6F, 0x72, 0x65, 0x73, 0x75, 
+0x6D, 0x65, 0x08, 0x00, 0x00, 0x00, 0x01, 0x11, 
+0x01, 0x03, 0x01, 0x0A, 0x01, 0x06, 0x01, 0x0B, 
+0x01, 0x00, 0x01, 0x0C, 0x01, 0x02, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 
+0x01, 0x00, 0x00, 0xAF, 0x01, 0x00, 0x00, 0x00, 
+0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x26, 0x00, 
+0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0xB1, 0x01, 0x00, 0x00, 0xB5, 
+0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 
+0x00, 0x00, 0x06, 0x00, 0x40, 0x00, 0x24, 0x40, 
+0x80, 0x00, 0x1E, 0x00, 0xFF, 0x7F, 0x26, 0x00, 
+0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x08, 
+0x73, 0x61, 0x66, 0x65, 0x52, 0x75, 0x6E, 0x01, 
+0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, };
 
 //------- sysplus.lua
 const char luat_inline2_sysplus[] = {
@@ -944,7 +952,7 @@ const char luat_inline2_sysplus[] = {
 0x00, 0x00, 0x00, 0x00, };
 
 const luadb_file_t luat_inline2_libs[] = {
-   {.name="sys.lua",.size=4909, .ptr=luat_inline2_sys},
+   {.name="sys.lua",.size=4969, .ptr=luat_inline2_sys},
    {.name="sysplus.lua",.size=2548, .ptr=luat_inline2_sysplus},
    {.name="",.size=0,.ptr=NULL}
 };

+ 4 - 0
script/corelib/sys.lua

@@ -356,7 +356,11 @@ local function dispatch()
         end
         local message = table.remove(messageQueue, 1)
         if subscribers[message[1]] then
+            local tmpt = {}
             for callback, _ in pairs(subscribers[message[1]]) do
+                table.insert(tmpt, callback)
+            end
+            for _, callback in ipairs(tmpt) do
                 if type(callback) == "function" then
                     callback(unpack(message, 2, #message))
                 elseif type(callback) == "thread" then