]> rtime.felk.cvut.cz Git - frescor/frsh.git/commitdiff
Added conversion of contract blocks to strings
authorMichal Sojka <sojkam1@fel.cvut.cz>
Wed, 11 Feb 2009 00:36:12 +0000 (01:36 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Wed, 11 Feb 2009 00:36:12 +0000 (01:36 +0100)
fres/contract/fres_container.c
fres/contract/fres_container.h
fres/contract/fres_contract.c
fres/contract/fres_contract.h

index c2c32de0c29bea15da49abb530439857584e1841..0d6961d3923d383af048e08e51756765b532dcf3 100644 (file)
@@ -26,9 +26,53 @@ fres_block_duplicate_spare_capacity(enum fres_block_type type, const void *block
                .size        = sizeof(fres_block_##type),               \
                .serialize   = (fres_block_serialize_fnc_t*)fres_block_##type##_serialize, \
                .deserialize = (fres_block_deserialize_fnc_t*)fres_block_##type##_deserialize, \
-               .duplicate   = fres_block_duplicate_default             \
+               .duplicate   = fres_block_duplicate_default,            \
+               .to_string   = fres_block_##type##_to_string            \
        }
 
+int fres_block_label_to_string(char *dest, size_t size, enum fres_block_type type,
+                              const void *block_data)
+{
+       const fres_block_label *b = block_data;
+       return snprintf(dest, size, "%s\n", b->label); /* FIXME: do not print more that 32 characters */
+}
+
+int fres_block_resource_to_string(char *dest, size_t size, enum fres_block_type type,
+                              const void *block_data)
+{
+       const fres_block_resource *b = block_data;
+       return snprintf(dest, size, "%d.%d\n", b->resource_type, b->resource_id);
+}
+
+int fres_block_basic_to_string(char *dest, size_t size, enum fres_block_type type,
+                              const void *block_data)
+{
+       const fres_block_basic *b = block_data;
+       return snprintf(dest, size,
+                       "budget: %ld.%09ld s\n"
+                       "period: %ld.%09ld s\n"
+                       "workload: %d\n"
+                       "type: %d\n",
+                       (long)b->budget.tv_sec, (long)b->budget.tv_nsec,
+                       (long)b->period.tv_sec, (long)b->period.tv_nsec,
+                       b->workload,
+                       b->contract_type
+               );
+       return 0;
+}
+
+int fres_block_timing_reqs_to_string(char *dest, size_t size, enum fres_block_type type,
+                              const void *block_data)
+{
+       const fres_block_timing_reqs *b = block_data;
+       return snprintf(dest, size,
+                       "D=T: %s\n"
+                       "deadline: %ld.%09ld s\n",
+                       b->d_equals_t ? "true" : "false",
+                       (long)b->deadline.tv_sec, (long)b->deadline.tv_nsec
+               );
+}
+
 static const desc_default(label);
 static const desc_default(resource);
 static const desc_default(basic);
@@ -464,6 +508,25 @@ fres_container_to_string(char *dest, size_t size, const struct fres_container *c
                                if (ret < size) {
                                        written += ret;
                                        size -= ret;
+                                       dest += ret;
+                               }
+                               if (block_registry[type]->to_string) {
+                                       char tmp[1000];
+                                       char *p = tmp;;
+                                       ret = block_registry[type]->to_string(tmp, sizeof(tmp), type, b->u.data);
+                                       while (*p) {
+                                               if (p == tmp || *(p-1) == '\n') { /* indent */
+                                                       int i;
+                                                       for (i=0; i<2; i++) {
+                                                               *dest++ = ' ';
+                                                               written++;
+                                                               size--;
+                                                       }
+                                               }
+                                               *dest++ = *p++;
+                                               written++;
+                                               size--;
+                                       }
                                }
                                break;
                        case FRES_BLOCK_STREAM:
@@ -473,6 +536,7 @@ fres_container_to_string(char *dest, size_t size, const struct fres_container *c
                                if (ret < size) {
                                        written += ret;
                                        size -= ret;
+                                       dest += ret;
                                }
                                break;
                }
index 027b22bc00bae40829ccc00d40ffdfdc034bd7f4..73b9a76cb568461696acc6134dedc78a10b20193 100644 (file)
@@ -57,6 +57,7 @@ struct fres_block_desc {
        fres_block_serialize_fnc_t *serialize;
        fres_block_deserialize_fnc_t *deserialize;
        void *(*duplicate)(enum fres_block_type type, const void *block_data);
+       int (*to_string)(char *dest, size_t size, enum fres_block_type type, const void *block_data);
 };
 
 struct fres_container *
index d95ff7133a6b54686be4796bb961bb4fd780d767..7b47dcc9ee14b2dcad088a19576feba82782cda8 100644 (file)
@@ -109,6 +109,9 @@ fres_contract_to_string(char *dest, size_t size, const struct fres_contract *c)
 {
        int ret, ret2;
        char id[30];
+
+       if (!c)
+               return 0;
        fres_contract_id_to_string(id, &c->id, sizeof(id));
        ret = snprintf(dest, size, "id: %s\n", id);
        if (ret>=0 && ret < size) {
index 8b1052aaae60d6a60a2f3bac583a9b3549e20fdf..ee02b918a7217987e407d6cb5ea0b0f401cde82e 100644 (file)
 #include <fres_contract_idl.h>
 #include <forb/server_id.h>
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /**
  * Contract data type.
  * 
@@ -144,4 +148,8 @@ FRES_CONTRACT_ACCESSOR(basic)
 FRES_CONTRACT_ACCESSOR(timing_reqs)
 FRES_CONTRACT_ACCESSOR(spare_capacity)
 
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
 #endif