@@ -816,6 +816,8 @@ nc_ps_new(void)
816
816
API void
817
817
nc_ps_free (struct nc_pollsession * ps )
818
818
{
819
+ uint16_t i ;
820
+
819
821
if (!ps ) {
820
822
return ;
821
823
}
@@ -824,6 +826,10 @@ nc_ps_free(struct nc_pollsession *ps)
824
826
ERR ("FATAL: Freeing a pollsession structure that is currently being worked with!" );
825
827
}
826
828
829
+ for (i = 0 ; i < ps -> session_count ; i ++ ) {
830
+ free (ps -> sessions [i ]);
831
+ }
832
+
827
833
free (ps -> sessions );
828
834
pthread_mutex_destroy (& ps -> lock );
829
835
pthread_cond_destroy (& ps -> cond );
@@ -857,8 +863,16 @@ nc_ps_add_session(struct nc_pollsession *ps, struct nc_session *session)
857
863
nc_ps_unlock (ps , q_id , __func__ );
858
864
return -1 ;
859
865
}
860
- ps -> sessions [ps -> session_count - 1 ].session = session ;
861
- ps -> sessions [ps -> session_count - 1 ].state = NC_PS_STATE_NONE ;
866
+ ps -> sessions [ps -> session_count - 1 ] = calloc (1 , sizeof * * ps -> sessions );
867
+ if (!ps -> sessions [ps -> session_count - 1 ]) {
868
+ ERRMEM ;
869
+ -- ps -> session_count ;
870
+ /* UNLOCK */
871
+ nc_ps_unlock (ps , q_id , __func__ );
872
+ return -1 ;
873
+ }
874
+ ps -> sessions [ps -> session_count - 1 ]-> session = session ;
875
+ ps -> sessions [ps -> session_count - 1 ]-> state = NC_PS_STATE_NONE ;
862
876
863
877
/* UNLOCK */
864
878
return nc_ps_unlock (ps , q_id , __func__ );
@@ -874,12 +888,14 @@ _nc_ps_del_session(struct nc_pollsession *ps, struct nc_session *session, int in
874
888
goto remove ;
875
889
}
876
890
for (i = 0 ; i < ps -> session_count ; ++ i ) {
877
- if (ps -> sessions [i ]. session == session ) {
891
+ if (ps -> sessions [i ]-> session == session ) {
878
892
remove :
879
893
-- ps -> session_count ;
880
- if (i < ps -> session_count ) {
894
+ if (i <= ps -> session_count ) {
895
+ free (ps -> sessions [i ]);
881
896
ps -> sessions [i ] = ps -> sessions [ps -> session_count ];
882
- } else if (!ps -> session_count ) {
897
+ }
898
+ if (!ps -> session_count ) {
883
899
free (ps -> sessions );
884
900
ps -> sessions = NULL ;
885
901
}
@@ -936,8 +952,8 @@ nc_ps_get_session_by_sid(const struct nc_pollsession *ps, uint32_t sid)
936
952
}
937
953
938
954
for (i = 0 ; i < ps -> session_count ; ++ i ) {
939
- if (ps -> sessions [i ]. session -> id == sid ) {
940
- ret = ps -> sessions [i ]. session ;
955
+ if (ps -> sessions [i ]-> session -> id == sid ) {
956
+ ret = ps -> sessions [i ]-> session ;
941
957
break ;
942
958
}
943
959
}
@@ -1314,6 +1330,7 @@ nc_ps_poll(struct nc_pollsession *ps, int timeout, struct nc_session **session)
1314
1330
char msg [256 ];
1315
1331
struct timespec ts_timeout , ts_cur ;
1316
1332
struct nc_session * cur_session ;
1333
+ struct nc_ps_session * cur_ps_session ;
1317
1334
struct nc_server_rpc * rpc = NULL ;
1318
1335
1319
1336
if (!ps ) {
@@ -1347,35 +1364,36 @@ nc_ps_poll(struct nc_pollsession *ps, int timeout, struct nc_session **session)
1347
1364
i = j = ps -> last_event_session + 1 ;
1348
1365
}
1349
1366
do {
1350
- cur_session = ps -> sessions [i ].session ;
1367
+ cur_ps_session = ps -> sessions [i ];
1368
+ cur_session = cur_ps_session -> session ;
1351
1369
1352
1370
/* SESSION LOCK */
1353
1371
r = nc_session_lock (cur_session , 0 , __func__ );
1354
1372
if (r == -1 ) {
1355
1373
ret = NC_PSPOLL_ERROR ;
1356
1374
} else if (r == 1 ) {
1357
1375
/* no one else is currently working with the session, so we can, otherwise skip it */
1358
- if (ps -> sessions [ i ]. state == NC_PS_STATE_NONE ) {
1376
+ if (cur_ps_session -> state == NC_PS_STATE_NONE ) {
1359
1377
if (cur_session -> status == NC_STATUS_RUNNING ) {
1360
1378
/* session is fine, work with it */
1361
- ps -> sessions [ i ]. state = NC_PS_STATE_BUSY ;
1379
+ cur_ps_session -> state = NC_PS_STATE_BUSY ;
1362
1380
1363
1381
ret = nc_ps_poll_session (cur_session , ts_cur .tv_sec , msg );
1364
1382
switch (ret ) {
1365
1383
case NC_PSPOLL_SESSION_TERM | NC_PSPOLL_SESSION_ERROR :
1366
1384
ERR ("Session %u: %s." , cur_session -> id , msg );
1367
- ps -> sessions [ i ]. state = NC_PS_STATE_INVALID ;
1385
+ cur_ps_session -> state = NC_PS_STATE_INVALID ;
1368
1386
break ;
1369
1387
case NC_PSPOLL_ERROR :
1370
1388
ERR ("Session %u: %s." , cur_session -> id , msg );
1371
- ps -> sessions [ i ]. state = NC_PS_STATE_NONE ;
1389
+ cur_ps_session -> state = NC_PS_STATE_NONE ;
1372
1390
break ;
1373
1391
case NC_PSPOLL_TIMEOUT :
1374
1392
#ifdef NC_ENABLED_SSH
1375
1393
case NC_PSPOLL_SSH_CHANNEL :
1376
1394
case NC_PSPOLL_SSH_MSG :
1377
1395
#endif
1378
- ps -> sessions [ i ]. state = NC_PS_STATE_NONE ;
1396
+ cur_ps_session -> state = NC_PS_STATE_NONE ;
1379
1397
break ;
1380
1398
case NC_PSPOLL_RPC :
1381
1399
/* let's keep the state busy, we are not done with this session */
@@ -1387,9 +1405,9 @@ nc_ps_poll(struct nc_pollsession *ps, int timeout, struct nc_session **session)
1387
1405
if (cur_session -> term_reason != NC_SESSION_TERM_CLOSED ) {
1388
1406
ret |= NC_PSPOLL_SESSION_ERROR ;
1389
1407
}
1390
- ps -> sessions [ i ]. state = NC_PS_STATE_INVALID ;
1408
+ cur_ps_session -> state = NC_PS_STATE_INVALID ;
1391
1409
}
1392
- } else if (ps -> sessions [ i ]. state == NC_PS_STATE_BUSY ) {
1410
+ } else if (cur_ps_session -> state == NC_PS_STATE_BUSY ) {
1393
1411
/* it definitely should not be busy because we have the lock */
1394
1412
ERRINT ;
1395
1413
ret = NC_PSPOLL_ERROR ;
@@ -1457,9 +1475,9 @@ nc_ps_poll(struct nc_pollsession *ps, int timeout, struct nc_session **session)
1457
1475
if (ret & (NC_PSPOLL_ERROR | NC_PSPOLL_BAD_RPC )) {
1458
1476
if (cur_session -> status != NC_STATUS_RUNNING ) {
1459
1477
ret |= NC_PSPOLL_SESSION_TERM | NC_PSPOLL_SESSION_ERROR ;
1460
- ps -> sessions [ i ]. state = NC_PS_STATE_INVALID ;
1478
+ cur_ps_session -> state = NC_PS_STATE_INVALID ;
1461
1479
} else {
1462
- ps -> sessions [ i ]. state = NC_PS_STATE_NONE ;
1480
+ cur_ps_session -> state = NC_PS_STATE_NONE ;
1463
1481
}
1464
1482
} else {
1465
1483
cur_session -> opts .server .last_rpc = time (NULL );
@@ -1473,9 +1491,9 @@ nc_ps_poll(struct nc_pollsession *ps, int timeout, struct nc_session **session)
1473
1491
if (!(cur_session -> term_reason & (NC_SESSION_TERM_CLOSED | NC_SESSION_TERM_KILLED ))) {
1474
1492
ret |= NC_PSPOLL_SESSION_ERROR ;
1475
1493
}
1476
- ps -> sessions [ i ]. state = NC_PS_STATE_INVALID ;
1494
+ cur_ps_session -> state = NC_PS_STATE_INVALID ;
1477
1495
} else {
1478
- ps -> sessions [ i ]. state = NC_PS_STATE_NONE ;
1496
+ cur_ps_session -> state = NC_PS_STATE_NONE ;
1479
1497
}
1480
1498
}
1481
1499
@@ -1505,16 +1523,17 @@ nc_ps_clear(struct nc_pollsession *ps, int all, void (*data_free)(void *))
1505
1523
1506
1524
if (all ) {
1507
1525
for (i = 0 ; i < ps -> session_count ; i ++ ) {
1508
- nc_session_free (ps -> sessions [i ].session , data_free );
1526
+ nc_session_free (ps -> sessions [i ]-> session , data_free );
1527
+ free (ps -> sessions [i ]);
1509
1528
}
1510
1529
free (ps -> sessions );
1511
1530
ps -> sessions = NULL ;
1512
1531
ps -> session_count = 0 ;
1513
1532
ps -> last_event_session = 0 ;
1514
1533
} else {
1515
1534
for (i = 0 ; i < ps -> session_count ; ) {
1516
- if (ps -> sessions [i ]. session -> status != NC_STATUS_RUNNING ) {
1517
- session = ps -> sessions [i ]. session ;
1535
+ if (ps -> sessions [i ]-> session -> status != NC_STATUS_RUNNING ) {
1536
+ session = ps -> sessions [i ]-> session ;
1518
1537
_nc_ps_del_session (ps , NULL , i );
1519
1538
nc_session_free (session , data_free );
1520
1539
continue ;
0 commit comments