Commit missing parts of 9366a29.

This commit is contained in:
whitequark 2016-01-10 20:01:20 +00:00
parent 1be9e7576d
commit 225f7d7302
3 changed files with 52 additions and 3 deletions

View File

@ -42,7 +42,7 @@ def cache_get(key: TStr) -> TList(TInt32):
raise NotImplementedError("syscall not simulated") raise NotImplementedError("syscall not simulated")
@syscall @syscall
def cache_put(key: TStr, value: TList(TInt32)): def cache_put(key: TStr, value: TList(TInt32)) -> TNone:
raise NotImplementedError("syscall not simulated") raise NotImplementedError("syscall not simulated")
class Core: class Core:

View File

@ -940,9 +940,12 @@ static int process_kmsg(struct msg_base *umsg)
case MESSAGE_TYPE_FINISHED: case MESSAGE_TYPE_FINISHED:
out_packet_empty(REMOTEMSG_TYPE_KERNEL_FINISHED); out_packet_empty(REMOTEMSG_TYPE_KERNEL_FINISHED);
for(struct cache_row *iter = cache; iter; iter = iter->next)
iter->borrowed = 0;
kloader_stop(); kloader_stop();
user_kernel_state = USER_KERNEL_LOADED; user_kernel_state = USER_KERNEL_LOADED;
mailbox_acknowledge();
break; break;
case MESSAGE_TYPE_EXCEPTION: { case MESSAGE_TYPE_EXCEPTION: {
@ -1031,9 +1034,11 @@ static int process_kmsg(struct msg_base *umsg)
} }
if(!row) { if(!row) {
struct cache_row *row = calloc(1, sizeof(struct cache_row)); row = calloc(1, sizeof(struct cache_row));
row->key = calloc(strlen(request->key) + 1, 1); row->key = calloc(strlen(request->key) + 1, 1);
strcpy(row->key, request->key); strcpy(row->key, request->key);
row->next = cache;
cache = row;
} }
if(!row->borrowed) { if(!row->borrowed) {

View File

@ -0,0 +1,44 @@
from artiq.language import *
from artiq.coredevice.exceptions import *
from artiq.test.hardware_testbench import ExperimentCase
class _Cache(EnvExperiment):
def build(self):
self.setattr_device("core")
self.print = lambda x: print(x)
@kernel
def get(self, key):
return self.core.get_cache(key)
@kernel
def put(self, key, value):
self.core.put_cache(key, value)
@kernel
def get_put(self, key, value):
self.get(key)
self.put(key, value)
class CacheTest(ExperimentCase):
def test_get_empty(self):
exp = self.create(_Cache)
self.assertEqual(exp.get("x1"), [])
def test_put_get(self):
exp = self.create(_Cache)
exp.put("x2", [1, 2, 3])
self.assertEqual(exp.get("x2"), [1, 2, 3])
def test_replace(self):
exp = self.create(_Cache)
exp.put("x3", [1, 2, 3])
exp.put("x3", [1, 2, 3, 4, 5])
self.assertEqual(exp.get("x3"), [1, 2, 3, 4, 5])
def test_borrow(self):
exp = self.create(_Cache)
exp.put("x4", [1, 2, 3])
with self.assertRaises(CacheError):
exp.get_put("x4", [])