@@ -189,19 +189,25 @@ static server_t* server_new(const char *library_filename, unsigned long ppid, co
189189 server -> communication = NULL ;
190190 server -> library = NULL ;
191191
192- #define ALLOC (_data ) \
193- server->update. _data = malloc(nb_reals * sizeof(*server->update. _data)); \
194- if (!server->update. _data) { \
195- server_free(server); \
196- return NULL; \
192+ #define ALLOC (nb , ptr ) \
193+ if (nb) { \
194+ ptr = malloc(sizeof(*ptr)*nb); \
195+ if (!ptr) { \
196+ server_free(server); \
197+ return NULL; \
198+ } \
199+ } else { \
200+ ptr = NULL; \
197201 }
198202
199- ALLOC (reals .value );
200- ALLOC (reals .vr );
201- ALLOC (integers .value );
202- ALLOC (integers .vr );
203- ALLOC (booleans .value );
204- ALLOC (booleans .vr );
203+ ALLOC (nb_reals , server -> update .reals .value );
204+ ALLOC (nb_reals , server -> update .reals .vr );
205+ ALLOC (nb_integers , server -> update .integers .value );
206+ ALLOC (nb_integers , server -> update .integers .vr );
207+ ALLOC (nb_booleans , server -> update .booleans .value );
208+ ALLOC (nb_booleans , server -> update .booleans .vr );
209+
210+ #undef ALLOC
205211
206212#ifdef WIN32
207213 server -> parent_handle = OpenProcess (SYNCHRONIZE , FALSE, ppid );
@@ -320,7 +326,7 @@ static fmi2Status do_step(server_t *server) {
320326 fmi2Status status ;
321327
322328 unsigned long nb_reals = 0 ;
323- for (unsigned long i = 0 ; i < server -> communication -> nb_reals ; i += 1 ) {
329+ for (unsigned long i = 0 ; i < server -> communication -> nb_reals ; i += 1 ) {
324330 if (server -> data .reals .changed [i ]) {
325331 server -> update .reals .vr [nb_reals ] = server -> data .reals .vr [i ];
326332 server -> update .reals .value [nb_reals ] = server -> data .reals .value [i ];
@@ -383,26 +389,32 @@ static fmi2Status do_step(server_t *server) {
383389 return status ;
384390 }
385391
386- status = server -> entries .fmi2GetReal (server -> component , server -> data .reals .vr ,
387- server -> communication -> nb_reals , server -> data .reals .value );
388- if (status != fmi2OK ) {
389- LOG_ERROR (server , "Cannot update REALS buffer." );
390- return status ;
391- }
392392
393- status = server -> entries .fmi2GetInteger (server -> component , server -> data .integers .vr ,
394- server -> communication -> nb_integers , server -> data .integers .value );
395- if (status != fmi2OK ) {
396- LOG_ERROR (server , "Cannot update INTEGERS buffer." );
397- return status ;
393+ if (server -> communication -> nb_reals ) {
394+ status = server -> entries .fmi2GetReal (server -> component , server -> data .reals .vr ,
395+ server -> communication -> nb_reals , server -> data .reals .value );
396+ if (status != fmi2OK ) {
397+ LOG_ERROR (server , "Cannot update REALS buffer." );
398+ return status ;
399+ }
398400 }
399401
402+ if (server -> communication -> nb_integers ) {
403+ status = server -> entries .fmi2GetInteger (server -> component , server -> data .integers .vr ,
404+ server -> communication -> nb_integers , server -> data .integers .value );
405+ if (status != fmi2OK ) {
406+ LOG_ERROR (server , "Cannot update INTEGERS buffer." );
407+ return status ;
408+ }
409+ }
400410
401- status = server -> entries .fmi2GetBoolean (server -> component , server -> data .booleans .vr ,
402- server -> communication -> nb_booleans , server -> data .booleans .value );
403- if (status != fmi2OK ) {
404- LOG_ERROR (server , "Cannot update BOOLEANS buffer." );
405- return status ;
411+ if (server -> communication -> nb_booleans ) {
412+ status = server -> entries .fmi2GetBoolean (server -> component , server -> data .booleans .vr ,
413+ server -> communication -> nb_booleans , server -> data .booleans .value );
414+ if (status != fmi2OK ) {
415+ LOG_ERROR (server , "Cannot update BOOLEANS buffer." );
416+ return status ;
417+ }
406418 }
407419
408420 return fmi2OK ;;
0 commit comments