Pack the value structure to be hashable
This commit is contained in:
		
							parent
							
								
									1cea193ea3
								
							
						
					
					
						commit
						e1e0e9662d
					
				| @ -157,11 +157,8 @@ struct mux_input * | ||||
| mux_find_input(struct mux *mux, struct value value) | ||||
| { | ||||
| 	struct mux_input *input = NULL; | ||||
| 	/* Only int64 due to garbage */ | ||||
| 	if (value.type != VALUE_INT64) | ||||
| 		die("bad value type\n"); | ||||
| 
 | ||||
| 	HASH_FIND(hh, mux->input, &value.i, sizeof(value.i), input); | ||||
| 	HASH_FIND(hh, mux->input, &value, sizeof(value), input); | ||||
| 	return input; | ||||
| } | ||||
| 
 | ||||
| @ -185,7 +182,7 @@ mux_add_input(struct mux *mux, struct value key, struct chan *chan) | ||||
| 	input->key = key; | ||||
| 	input->chan = chan; | ||||
| 
 | ||||
| 	HASH_ADD_KEYPTR(hh, mux->input, &input->key.i, sizeof(input->key.i), input); | ||||
| 	HASH_ADD_KEYPTR(hh, mux->input, &input->key, sizeof(input->key), input); | ||||
| 
 | ||||
| 	if (bay_add_cb(mux->bay, chan, cb_input, mux) != 0) { | ||||
| 		err("mux_add_input: bay_add_cb failed\n"); | ||||
|  | ||||
| @ -12,7 +12,9 @@ enum value_type { | ||||
| 	VALUE_DOUBLE | ||||
| }; | ||||
| 
 | ||||
| struct value { | ||||
| /* Packed allows the struct to be hashable, as we don't have any
 | ||||
|  * unitialized data */ | ||||
| struct __attribute__((packed)) value { | ||||
| 	enum value_type type; | ||||
| 	union { | ||||
| 		int64_t i; | ||||
| @ -44,7 +46,7 @@ value_int64(int64_t i) | ||||
| static inline struct value | ||||
| value_null(void) | ||||
| { | ||||
| 	struct value v = { .type = VALUE_NULL }; | ||||
| 	struct value v = { .type = VALUE_NULL, .i = 0 }; | ||||
| 	return v; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -11,3 +11,4 @@ | ||||
| unit_test(chan.c) | ||||
| unit_test(bay.c) | ||||
| unit_test(mux.c) | ||||
| unit_test(value.c) | ||||
|  | ||||
							
								
								
									
										23
									
								
								test/unit/value.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								test/unit/value.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | ||||
| #include "emu/value.h" | ||||
| #include "common.h" | ||||
| 
 | ||||
| int | ||||
| main(void) | ||||
| { | ||||
| 	struct value a, b; | ||||
| 
 | ||||
| 	memset(&a, 66, sizeof(struct value)); | ||||
| 	memset(&b, 0, sizeof(struct value)); | ||||
| 
 | ||||
| 	a = value_null(); | ||||
| 
 | ||||
| 	/* Ensure we can use the whole size of the value struct to
 | ||||
| 	 * compare two values, so we don't have problems with | ||||
| 	 * unitialized holes due to alignment */ | ||||
| 	if (memcmp(&a, &b, sizeof(struct value)) != 0) | ||||
| 		die("values are not the same\n"); | ||||
| 
 | ||||
| 	err("OK\n"); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user