@@ -70,6 +70,7 @@ struct am_pal_task {
7070 void * arg ;
7171};
7272
73+ static struct am_pal_task task_main_ = {0 };
7374static struct am_pal_task task_arr_ [AM_PAL_TASK_NUM_MAX ] = {0 };
7475
7576struct am_pal_mutex {
@@ -114,6 +115,9 @@ void am_pal_crit_exit(void) {
114115
115116int am_pal_task_own_id (void ) {
116117 pthread_t thread = pthread_self ();
118+ if (task_main_ .thread == thread ) {
119+ return AM_PAL_TASK_ID_MAIN ;
120+ }
117121 for (int i = 0 ; i < AM_COUNTOF (task_arr_ ); ++ i ) {
118122 if (task_arr_ [i ].thread == thread ) {
119123 return am_pal_id_from_index (i );
@@ -192,8 +196,13 @@ int am_pal_task_create(
192196void am_pal_task_notify (int task_id ) {
193197 AM_ASSERT (task_id != AM_PAL_TASK_ID_NONE );
194198
195- int index = am_pal_index_from_id (task_id );
196- struct am_pal_task * t = & task_arr_ [index ];
199+ struct am_pal_task * t = NULL ;
200+ if (AM_PAL_TASK_ID_MAIN == task_id ) {
201+ t = & task_main_ ;
202+ } else {
203+ int index = am_pal_index_from_id (task_id );
204+ t = & task_arr_ [index ];
205+ }
197206 AM_ASSERT (t );
198207 pthread_mutex_lock (& t -> mutex );
199208 AM_ATOMIC_STORE_N (& t -> notified , true);
@@ -205,8 +214,15 @@ void am_pal_task_wait(int task_id) {
205214 if (AM_PAL_TASK_ID_NONE == task_id ) {
206215 task_id = am_pal_task_own_id ();
207216 }
208- int index = am_pal_index_from_id (task_id );
209- struct am_pal_task * t = & task_arr_ [index ];
217+ AM_ASSERT (task_id != AM_PAL_TASK_ID_NONE );
218+
219+ struct am_pal_task * t = NULL ;
220+ if (AM_PAL_TASK_ID_MAIN == task_id ) {
221+ t = & task_main_ ;
222+ } else {
223+ int index = am_pal_index_from_id (task_id );
224+ t = & task_arr_ [index ];
225+ }
210226 AM_ASSERT (t );
211227 pthread_mutex_lock (& t -> mutex );
212228 while (!AM_ATOMIC_LOAD_N (& t -> notified )) {
@@ -347,7 +363,16 @@ int am_pal_printf(const char *fmt, ...) {
347363
348364void am_pal_flush (void ) { fflush (stdout ); }
349365
350- void am_pal_ctor (void ) {}
366+ void am_pal_ctor (void ) {
367+ struct am_pal_task * task = & task_main_ ;
368+
369+ task -> thread = pthread_self ();
370+ am_pal_mutex_init (& task -> mutex );
371+
372+ int ret = pthread_cond_init (& task -> cond , /*attr=*/ NULL );
373+ AM_ASSERT (0 == ret );
374+ task -> valid = true;
375+ }
351376
352377void am_pal_dtor (void ) {
353378 for (int i = 0 ; i < AM_COUNTOF (mutex_arr_ ); ++ i ) {
0 commit comments